@praxisui/table 9.0.0-beta.33 → 9.0.0-beta.35
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.
- package/README.md +18 -0
- package/ai/component-registry.json +139 -13
- package/fesm2022/{praxisui-table-praxisui-table-EYby6Zvn.mjs → praxisui-table-praxisui-table-DVrdSuiO.mjs} +613 -95
- package/fesm2022/{praxisui-table-table-ai.adapter-Bh0faxuI.mjs → praxisui-table-table-ai.adapter-utRTtk0G.mjs} +26 -1
- package/fesm2022/praxisui-table.mjs +1 -1
- package/package.json +10 -10
- package/src/lib/praxis-table.json-api.md +3 -2
- package/types/praxisui-table.d.ts +37 -6
|
@@ -36,7 +36,7 @@ import * as i13 from '@angular/cdk/drag-drop';
|
|
|
36
36
|
import { moveItemInArray, DragDropModule } from '@angular/cdk/drag-drop';
|
|
37
37
|
import { Subject, debounceTime, takeUntil, firstValueFrom, of, BehaviorSubject, Subscription, take as take$1 } from 'rxjs';
|
|
38
38
|
import * as i1 from '@praxisui/core';
|
|
39
|
-
import { LoggerService, createCorporateLoggerConfig, ConsoleLoggerSink, PraxisJsonLogicService, PraxisIconDirective, PraxisI18nService, isTableConfigV2, providePraxisI18nConfig, PRAXIS_GLOBAL_ACTION_CATALOG, SURFACE_OPEN_I18N_NAMESPACE, isRequiredGlobalActionPayloadMissing, getGlobalActionUiSchema, getRequiredGlobalActionPayloadKeys, hasMeaningfulGlobalActionPayloadValue, SurfaceOpenActionEditorComponent, SURFACE_OPEN_I18N_CONFIG, ASYNC_CONFIG_STORAGE, INLINE_FILTER_CONTROL_TYPES, INLINE_FILTER_CONTROL_TYPE_VALUES, FieldControlType, normalizeControlTypeToken, resolveControlTypeAlias, mapFieldDefinitionsToMetadata, PraxisJsonLogicError, GLOBAL_ACTION_CATALOG, GenericCrudService, validateGlobalActionRefs, getGlobalActionCatalog, TableConfigService, createDefaultTableConfig, fillUndefined, deepMerge, INLINE_FILTER_ALIAS_TOKENS, GlobalConfigService, buildSchemaId, MemoryCacheAdapter, LocalStorageCacheAdapter, SchemaMetadataClient, resolveInlineFilterControlType, fetchWithETag, serializeEntityLookupValueForPayload, ComponentMetadataRegistry, AnalyticsStatsRequestBuilderService, buildApiUrl, normalizePraxisDataQueryContext, API_URL, PraxisRuntimeComponentObservationRegistryService, PRAXIS_TABLE_DETAIL_INLINE_RENDERERS, PRAXIS_TABLE_DETAIL_INLINE_NODE_RESOLVERS, PraxisCollectionExportService, ResourceDiscoveryService, ResourceSurfaceOpenAdapterService,
|
|
39
|
+
import { LoggerService, createCorporateLoggerConfig, ConsoleLoggerSink, PraxisJsonLogicService, PraxisIconDirective, PraxisI18nService, isTableConfigV2, providePraxisI18nConfig, PRAXIS_GLOBAL_ACTION_CATALOG, SURFACE_OPEN_I18N_NAMESPACE, isRequiredGlobalActionPayloadMissing, getGlobalActionUiSchema, getRequiredGlobalActionPayloadKeys, hasMeaningfulGlobalActionPayloadValue, SurfaceOpenActionEditorComponent, SURFACE_OPEN_I18N_CONFIG, ASYNC_CONFIG_STORAGE, INLINE_FILTER_CONTROL_TYPES, INLINE_FILTER_CONTROL_TYPE_VALUES, FieldControlType, normalizeControlTypeToken, resolveControlTypeAlias, mapFieldDefinitionsToMetadata, PraxisJsonLogicError, GLOBAL_ACTION_CATALOG, GenericCrudService, validateGlobalActionRefs, getGlobalActionCatalog, TableConfigService, createDefaultTableConfig, fillUndefined, deepMerge, INLINE_FILTER_ALIAS_TOKENS, GlobalConfigService, buildSchemaId, MemoryCacheAdapter, LocalStorageCacheAdapter, SchemaMetadataClient, resolveInlineFilterControlType, fetchWithETag, serializeEntityLookupValueForPayload, ComponentMetadataRegistry, AnalyticsStatsRequestBuilderService, buildApiUrl, normalizePraxisDataQueryContext, API_URL, PraxisRuntimeComponentObservationRegistryService, PRAXIS_TABLE_DETAIL_INLINE_RENDERERS, PRAXIS_TABLE_DETAIL_INLINE_NODE_RESOLVERS, PraxisCollectionExportService, SchemaNormalizerService, translateResourceAvailabilityReason, ResourceDiscoveryService, ResourceSurfaceOpenAdapterService, CrudOperationResolutionService, ResourceQuickConnectComponent, assertPraxisCollectionExportArtifact, PRAXIS_LOADING_CTX, resolveColumnTypeFromFieldDefinition, isPraxisPresentationVisualizationTableSafe, resolveTextMaskFormatFromFieldDefinition, translateResourceDiscoveryText, supportsImplicitValuePresentation, resolveValuePresentation, renderPraxisPresentationVisualizationHtml, translateUnavailableWorkflowMessage, CONNECTION_STORAGE, PRAXIS_LOADING_RENDERER, EmptyStateCardComponent, RESOURCE_DISCOVERY_I18N_CONFIG } from '@praxisui/core';
|
|
40
40
|
import { PraxisRichContent } from '@praxisui/rich-content';
|
|
41
41
|
import * as i2 from '@angular/material/toolbar';
|
|
42
42
|
import { MatToolbarModule } from '@angular/material/toolbar';
|
|
@@ -106,6 +106,9 @@ const PRAXIS_TABLE_RUNTIME_I18N_CONFIG = {
|
|
|
106
106
|
'table.chrome.rowActions.edit': 'Editar',
|
|
107
107
|
'table.chrome.rowActions.delete': 'Excluir',
|
|
108
108
|
'table.chrome.rowActions.duplicateDraft': 'Duplicar',
|
|
109
|
+
'table.chrome.collectionActions.create': 'Novo',
|
|
110
|
+
'table.chrome.collectionActions.createTooltip': 'Criar novo registro',
|
|
111
|
+
'table.chrome.collectionActions.createUnavailable': 'Criação indisponível no contexto atual',
|
|
109
112
|
'table.assistant.context.selectedRecords.label': 'Registros selecionados',
|
|
110
113
|
'table.assistant.context.selectedRecords.value': '{count} registro(s) selecionado(s){ids}',
|
|
111
114
|
'table.assistant.context.selectedRecords.value.singular': '{count} registro selecionado{ids}',
|
|
@@ -221,6 +224,9 @@ const PRAXIS_TABLE_RUNTIME_I18N_CONFIG = {
|
|
|
221
224
|
'table.chrome.rowActions.edit': 'Edit',
|
|
222
225
|
'table.chrome.rowActions.delete': 'Delete',
|
|
223
226
|
'table.chrome.rowActions.duplicateDraft': 'Duplicate',
|
|
227
|
+
'table.chrome.collectionActions.create': 'New',
|
|
228
|
+
'table.chrome.collectionActions.createTooltip': 'Create a new record',
|
|
229
|
+
'table.chrome.collectionActions.createUnavailable': 'Create is unavailable in the current context',
|
|
224
230
|
'table.assistant.context.selectedRecords.label': 'Selected records',
|
|
225
231
|
'table.assistant.context.selectedRecords.value': '{count} selected record(s){ids}',
|
|
226
232
|
'table.assistant.context.selectedRecords.value.singular': '{count} selected record{ids}',
|
|
@@ -471,18 +477,42 @@ function getActionId(action) {
|
|
|
471
477
|
|
|
472
478
|
const TOOLBAR_SHORTCUT_HANDLED_FLAG = '__praxisTableToolbarShortcutHandled__';
|
|
473
479
|
const BLOCKED_PATH_SEGMENTS$1 = new Set(['__proto__', 'prototype', 'constructor']);
|
|
480
|
+
const PRAXIS_TABLE_TOOLBAR_APPEARANCE_PRESETS = {
|
|
481
|
+
'table-integrated': {
|
|
482
|
+
variant: 'integrated',
|
|
483
|
+
density: 'comfortable',
|
|
484
|
+
shape: 'rounded',
|
|
485
|
+
divider: 'between-groups',
|
|
486
|
+
tokens: {
|
|
487
|
+
bg: 'var(--p-table-bg)',
|
|
488
|
+
borderColor: 'var(--p-table-border-color)',
|
|
489
|
+
borderWidth: '1px',
|
|
490
|
+
radius: '12px 12px 0 0',
|
|
491
|
+
shadow: 'var(--p-table-surface-shadow)',
|
|
492
|
+
paddingBlock: '6px',
|
|
493
|
+
paddingInline: '12px',
|
|
494
|
+
minHeight: '44px',
|
|
495
|
+
},
|
|
496
|
+
},
|
|
497
|
+
};
|
|
474
498
|
const PRAXIS_TABLE_TOOLBAR_DEFAULT_APPEARANCE = new InjectionToken('PRAXIS_TABLE_TOOLBAR_DEFAULT_APPEARANCE', {
|
|
475
499
|
providedIn: 'root',
|
|
476
500
|
factory: () => ({}),
|
|
477
501
|
});
|
|
478
502
|
const PRAXIS_TABLE_TOOLBAR_TOKEN_PRESETS = new InjectionToken('PRAXIS_TABLE_TOOLBAR_TOKEN_PRESETS', {
|
|
479
503
|
providedIn: 'root',
|
|
480
|
-
factory: () =>
|
|
504
|
+
factory: () => PRAXIS_TABLE_TOOLBAR_APPEARANCE_PRESETS,
|
|
481
505
|
});
|
|
482
506
|
function providePraxisTableToolbarAppearance(appearance, presets = {}) {
|
|
483
507
|
return [
|
|
484
508
|
{ provide: PRAXIS_TABLE_TOOLBAR_DEFAULT_APPEARANCE, useValue: appearance },
|
|
485
|
-
{
|
|
509
|
+
{
|
|
510
|
+
provide: PRAXIS_TABLE_TOOLBAR_TOKEN_PRESETS,
|
|
511
|
+
useValue: {
|
|
512
|
+
...PRAXIS_TABLE_TOOLBAR_APPEARANCE_PRESETS,
|
|
513
|
+
...presets,
|
|
514
|
+
},
|
|
515
|
+
},
|
|
486
516
|
];
|
|
487
517
|
}
|
|
488
518
|
function normalizeCorporateLoggerEnvironment$2(candidate) {
|
|
@@ -1813,7 +1843,7 @@ class PraxisTableToolbar {
|
|
|
1813
1843
|
}
|
|
1814
1844
|
</div>
|
|
1815
1845
|
</mat-toolbar>
|
|
1816
|
-
`, isInline: true, styles: [":host{display:block}.praxis-toolbar{--p-table-toolbar-bg-default: linear-gradient( 180deg, color-mix(in srgb, var(--md-sys-color-surface, #fff) 96%, transparent), color-mix(in srgb, var(--md-sys-color-surface-container-low, #f6f8fc) 100%, transparent) );--p-table-toolbar-fg-default: var(--md-sys-color-on-surface, currentColor);--p-table-toolbar-border-color-default: color-mix(in srgb, var(--md-sys-color-outline-variant, #d7dbe5) 78%, transparent);--p-table-toolbar-divider-color-default: color-mix(in srgb, var(--md-sys-color-outline) 42%, transparent);--p-table-toolbar-action-hover-bg-default: color-mix(in srgb, var(--md-sys-color-primary) 10%, transparent);--p-table-toolbar-action-active-bg-default: color-mix(in srgb, var(--md-sys-color-primary) 16%, transparent);--p-table-toolbar-action-focus-ring-default: color-mix(in srgb, var(--md-sys-color-primary) 52%, transparent);--p-table-toolbar-ai-accent-color-default: var(--md-sys-color-primary, #0b72d9);--p-table-toolbar-status-fg-default: var(--md-sys-color-on-surface-variant, currentColor);background:var(--p-table-toolbar-bg, var(--p-table-toolbar-bg-default));color:var(--p-table-toolbar-fg, var(--p-table-toolbar-fg-default));box-shadow:var(--p-table-toolbar-shadow, none);padding:var(--p-table-toolbar-padding-block, var(--pfx-toolbar-pad-y, 6px)) var(--p-table-toolbar-padding-inline, var(--pfx-toolbar-pad-x, 12px));min-height:var(--p-table-toolbar-min-height, var(--pfx-filter-h, 44px));display:flex;flex-direction:row;align-items:center;gap:var(--p-table-toolbar-gap, 6px);flex-wrap:wrap;border:var(--p-table-toolbar-border-width, 1px) solid var(--p-table-toolbar-border-color, var(--p-table-toolbar-border-color-default));border-radius:var(--p-table-toolbar-radius, 10px)}.praxis-toolbar.p-table-toolbar--flat{--p-table-toolbar-border-width: 0;--p-table-toolbar-shadow: none}.praxis-toolbar.p-table-toolbar--elevated{--p-table-toolbar-shadow: 0 12px 28px color-mix(in srgb, var(--md-sys-color-shadow, #000) 12%, transparent)}.praxis-toolbar.p-table-toolbar--integrated{--p-table-toolbar-bg: transparent;--p-table-toolbar-border-width: 0;--p-table-toolbar-radius: 0}.praxis-toolbar.p-table-toolbar--compact{--p-table-toolbar-min-height: 36px;--p-table-toolbar-padding-block: 4px;--p-table-toolbar-padding-inline: 10px;--p-table-toolbar-gap: 4px;--p-table-toolbar-actions-gap: 4px;--p-table-toolbar-action-size: 32px;--p-table-toolbar-action-radius: 7px}.praxis-toolbar.p-table-toolbar--comfortable{--p-table-toolbar-min-height: 44px;--p-table-toolbar-action-size: 36px}.praxis-toolbar.p-table-toolbar--spacious{--p-table-toolbar-min-height: 52px;--p-table-toolbar-padding-block: 8px;--p-table-toolbar-padding-inline: 16px;--p-table-toolbar-gap: 8px;--p-table-toolbar-actions-gap: 8px;--p-table-toolbar-action-size: 40px}.praxis-toolbar.p-table-toolbar--square{--p-table-toolbar-radius: 0;--p-table-toolbar-action-radius: 4px}.praxis-toolbar.p-table-toolbar--pill{--p-table-toolbar-radius: 999px;--p-table-toolbar-action-radius: 999px}:host(.praxis-toolbar-stack-top) .praxis-toolbar{border-bottom-left-radius:0;border-bottom-right-radius:0}:host(.praxis-toolbar-footer) .praxis-toolbar{border-top-left-radius:0;border-top-right-radius:0}:host(.praxis-toolbar-footer.footer-flat) .praxis-toolbar{border-bottom-left-radius:0;border-bottom-right-radius:0}.praxis-toolbar.mat-toolbar-single-row,.praxis-toolbar .mat-toolbar-row{height:auto}.praxis-toolbar.mat-toolbar-multiple-rows{min-height:var(--p-table-toolbar-min-height, var(--pfx-filter-h, 44px))}.toolbar-main{display:flex;align-items:center;justify-content:flex-start;min-width:0;column-gap:var(--p-table-toolbar-gap, 6px);row-gap:var(--p-table-toolbar-identity-filter-gap, 8px);min-height:var(--p-table-toolbar-min-height, var(--pfx-filter-h, 44px));flex:1 1 360px;flex-wrap:wrap;container-type:inline-size}.toolbar-identity{display:flex;align-items:center;gap:var(--p-table-toolbar-identity-gap, 8px);min-width:0;max-width:100%;min-height:var(--p-table-toolbar-identity-min-height, 30px);flex:1 1 100%;margin-block-end:var(--p-table-toolbar-identity-margin-bottom, 2px);padding-inline:2px;color:var(--p-table-toolbar-title-fg, var(--p-table-toolbar-fg, var(--p-table-toolbar-fg-default)))}.toolbar-identity--center{text-align:center;justify-content:center}.toolbar-identity--end{text-align:end;justify-content:flex-end}.toolbar-identity--center .toolbar-identity__copy{align-items:center}.toolbar-identity--end .toolbar-identity__copy{align-items:flex-end}.toolbar-identity__icon{width:var(--p-table-toolbar-identity-icon-size, 28px);height:var(--p-table-toolbar-identity-icon-size, 28px);border-radius:var(--p-table-toolbar-identity-icon-radius, 8px);display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;color:var(--p-table-toolbar-icon-fg, var(--md-sys-color-primary, currentColor));background:color-mix(in srgb,var(--p-table-toolbar-icon-fg, var(--md-sys-color-primary, currentColor)) 8%,transparent);border:1px solid color-mix(in srgb,var(--p-table-toolbar-icon-fg, var(--md-sys-color-primary, currentColor)) 18%,transparent)}.toolbar-identity__icon .mat-icon{font-size:18px;width:18px;height:18px;line-height:18px}.toolbar-identity__copy{display:flex;flex-direction:column;min-width:0;max-width:100%;gap:1px}.toolbar-identity__title,.toolbar-identity__subtitle{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.toolbar-identity__title{font-size:var(--p-table-toolbar-title-font-size, 14px);font-weight:var(--p-table-toolbar-title-font-weight, 700);line-height:1.2;letter-spacing:0;color:var(--p-table-toolbar-title-fg, currentColor)}.toolbar-identity__subtitle{font-size:var(--p-table-toolbar-subtitle-font-size, 11.5px);line-height:1.25;color:var(--p-table-toolbar-subtitle-fg, var(--p-table-toolbar-status-fg, var(--p-table-toolbar-status-fg-default)))}.toolbar-main>*{min-width:0}@container (max-width: 720px){.toolbar-identity{flex-basis:100%;max-width:100%}}@container (max-width: 420px){.toolbar-identity{min-width:0;flex-basis:auto}.toolbar-identity__subtitle{display:none}}.toolbar-actions{display:flex;align-items:center;align-self:flex-end;justify-content:flex-end;gap:var(--p-table-toolbar-gap, 6px);min-height:var(--p-table-toolbar-min-height, var(--pfx-filter-h, 44px));flex:0 0 auto;margin-left:auto}.actions-group{display:flex;align-items:center;gap:var(--p-table-toolbar-actions-gap, 6px)}.action-btn{height:var(--p-table-toolbar-action-size, 36px);min-width:var(--p-table-toolbar-action-size, 36px);border-radius:var(--p-table-toolbar-action-radius, 8px);font-size:12px;line-height:1.2;color:var(--p-table-toolbar-action-fg, inherit);background:var(--p-table-toolbar-action-bg, transparent)}.action-btn:hover:not(:disabled),.overflow-trigger:hover:not(:disabled),.end-actions ::ng-deep .mat-mdc-icon-button:hover:not(:disabled){background:var(--p-table-toolbar-action-hover-bg, var(--p-table-toolbar-action-hover-bg-default))}.action-btn:focus-visible,.overflow-trigger:focus-visible,.end-actions ::ng-deep .mat-mdc-icon-button:focus-visible{outline:2px solid var(--p-table-toolbar-action-focus-ring, var(--p-table-toolbar-action-focus-ring-default));outline-offset:2px}.action-btn--utility{color:var(--p-table-toolbar-status-fg, var(--p-table-toolbar-status-fg-default))}.praxis-table-toolbar-action--columns.action-btn{width:var(--p-table-toolbar-action-size, 36px);padding:0}.praxis-table-toolbar-action--columns mat-icon{margin:0}.toolbar-icon-btn{width:var(--p-table-toolbar-action-size, 36px);height:var(--p-table-toolbar-action-size, 36px);border-radius:var(--p-table-toolbar-action-radius, 8px);color:var(--md-sys-color-primary);background:color-mix(in srgb,var(--md-sys-color-primary) 9%,transparent);border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 22%,transparent)}.toolbar-icon-btn:hover:not(:disabled){color:var(--md-sys-color-on-primary-container);background:color-mix(in srgb,var(--md-sys-color-primary) 16%,transparent);border-color:color-mix(in srgb,var(--md-sys-color-primary) 36%,transparent)}.action-btn--fab{width:42px;height:42px;box-shadow:none}.pfx-tonal{background:var(--md-sys-color-secondary-container);color:var(--md-sys-color-on-secondary-container)}.pfx-tonal:hover{background:var(--md-sys-color-secondary-container)}.mobile-actions{display:none;align-items:center;gap:var(--p-table-toolbar-actions-gap, 6px)}.overflow-trigger{height:var(--p-table-toolbar-action-size, 36px)}.action-btn .mat-icon,.action-btn--fab .mat-icon,.overflow-trigger .mat-icon{font-size:18px;width:18px;height:18px;line-height:18px}.praxis-table-toolbar-action--columns .mat-icon{font-size:24px;width:24px;height:24px;line-height:24px}.praxis-table-column-menu-item.mat-mdc-menu-item{min-height:40px}.praxis-table-column-menu-content{align-items:center;display:flex;gap:10px;min-height:40px;width:100%}.praxis-table-column-menu-check.mat-icon{color:var(--md-sys-color-primary, currentColor);flex:0 0 20px;font-size:20px;height:20px;line-height:20px;margin-inline-end:0;width:20px}.action-btn.mat-mdc-button-base,.action-btn--fab.mat-mdc-button-base,.overflow-trigger.mat-mdc-button-base,.toolbar-icon-btn.mat-mdc-button-base{--mdc-text-button-container-height: var(--p-table-toolbar-action-size, 36px);--mdc-filled-button-container-height: var(--p-table-toolbar-action-size, 36px);--mdc-protected-button-container-height: var(--p-table-toolbar-action-size, 36px);--mdc-outlined-button-container-height: var(--p-table-toolbar-action-size, 36px);--mdc-icon-button-state-layer-size: var(--p-table-toolbar-action-size, 36px)}.action-btn.mat-mdc-unelevated-button:not(:disabled),.action-btn.mat-mdc-outlined-button:not(:disabled),.action-btn.pfx-tonal:not(:disabled){border-color:color-mix(in srgb,var(--md-sys-color-outline-variant, #d7dbe5) 82%,transparent)}.action-btn.mat-mdc-unelevated-button:not(:disabled){box-shadow:none}.action-btn.mat-mdc-unelevated-button.mat-primary:not(:disabled){--mdc-filled-button-container-color: var(--md-sys-color-primary);--mdc-filled-button-label-text-color: var(--md-sys-color-on-primary);--mat-filled-button-state-layer-color: var(--md-sys-color-on-primary);background:var(--md-sys-color-primary)!important;border-color:transparent;color:var(--md-sys-color-on-primary)!important;box-shadow:0 8px 18px color-mix(in srgb,var(--md-sys-color-primary) 22%,transparent)}.action-btn.mat-mdc-unelevated-button.mat-primary:not(:disabled):hover{background:color-mix(in srgb,var(--md-sys-color-primary) 88%,var(--md-sys-color-on-primary) 12%)!important}.action-btn.mat-mdc-unelevated-button.mat-primary:not(:disabled) .mat-icon{color:var(--md-sys-color-on-primary)!important}.action-btn.mat-mdc-button-base:not(.mat-mdc-icon-button){padding-inline:10px}.end-actions{display:flex;align-items:center;gap:var(--p-table-toolbar-actions-gap, 6px);margin-left:4px;padding-left:10px;border-left:1px solid var(--p-table-toolbar-divider-color, var(--p-table-toolbar-divider-color-default))}.end-actions ::ng-deep .mat-mdc-icon-button{width:var(--p-table-toolbar-action-size, 36px);height:var(--p-table-toolbar-action-size, 36px);display:inline-grid;place-items:center;padding:0;line-height:0;--mdc-icon-button-state-layer-size: var(--p-table-toolbar-action-size, 36px);--mat-icon-button-state-layer-size: var(--p-table-toolbar-action-size, 36px)}.end-actions ::ng-deep .mat-mdc-icon-button .mat-icon{display:block;flex:0 0 auto;font-size:24px;width:24px;height:24px;line-height:24px;margin:0}.praxis-toolbar.p-table-toolbar--divider-between-groups .actions-group,.praxis-toolbar.p-table-toolbar--divider-start .toolbar-main{padding-right:10px;border-right:1px solid var(--p-table-toolbar-divider-color, var(--p-table-toolbar-divider-color-default))}.end-actions ::ng-deep .praxis-table-toolbar-action--ai,.end-actions ::ng-deep .praxis-table-ai-trigger{color:var(--p-table-toolbar-ai-accent-color, var(--p-table-toolbar-ai-accent-color-default));background:color-mix(in srgb,var(--p-table-toolbar-ai-accent-color, var(--p-table-toolbar-ai-accent-color-default)) 10%,transparent);border:1px solid color-mix(in srgb,var(--p-table-toolbar-ai-accent-color, var(--p-table-toolbar-ai-accent-color-default)) 24%,transparent)}.end-actions ::ng-deep [data-role=table-settings]{color:var(--p-table-toolbar-status-fg, var(--p-table-toolbar-status-fg-default))}@media(min-width:1024px){.toolbar-actions{justify-content:flex-end}}@media(max-width:1023px){.actions-group{display:none}.mobile-actions{display:flex}.toolbar-actions{justify-content:flex-end}.toolbar-identity{min-width:0;max-width:100%;flex:1 1 100%}}\n"], dependencies: [{ kind: "ngmodule", type: MatToolbarModule }, { kind: "component", type: i2.MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i3.MatFabButton, selector: "button[mat-fab], a[mat-fab], button[matFab], a[matFab]", inputs: ["extended"], exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: PraxisIconDirective, selector: "mat-icon[praxisIcon]", inputs: ["praxisIcon"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i5.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i5.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i5.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i10.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }] });
|
|
1846
|
+
`, isInline: true, styles: [":host{display:block}.praxis-toolbar{--p-table-toolbar-bg-default: linear-gradient( 180deg, color-mix(in srgb, var(--md-sys-color-surface, #fff) 96%, transparent), color-mix(in srgb, var(--md-sys-color-surface-container-low, #f6f8fc) 100%, transparent) );--p-table-toolbar-fg-default: var(--md-sys-color-on-surface, currentColor);--p-table-toolbar-border-color-default: color-mix(in srgb, var(--md-sys-color-outline-variant, #d7dbe5) 78%, transparent);--p-table-toolbar-divider-color-default: color-mix(in srgb, var(--md-sys-color-outline) 42%, transparent);--p-table-toolbar-action-hover-bg-default: color-mix(in srgb, var(--md-sys-color-primary) 10%, transparent);--p-table-toolbar-action-active-bg-default: color-mix(in srgb, var(--md-sys-color-primary) 16%, transparent);--p-table-toolbar-action-focus-ring-default: color-mix(in srgb, var(--md-sys-color-primary) 52%, transparent);--p-table-toolbar-ai-accent-color-default: var(--md-sys-color-primary, #0b72d9);--p-table-toolbar-status-fg-default: var(--md-sys-color-on-surface-variant, currentColor);background:var(--p-table-toolbar-bg, var(--p-table-toolbar-bg-default));color:var(--p-table-toolbar-fg, var(--p-table-toolbar-fg-default));box-shadow:var(--p-table-toolbar-shadow, none);padding:var(--p-table-toolbar-padding-block, var(--pfx-toolbar-pad-y, 6px)) var(--p-table-toolbar-padding-inline, var(--pfx-toolbar-pad-x, 12px));min-height:var(--p-table-toolbar-min-height, var(--pfx-filter-h, 44px));display:flex;flex-direction:row;align-items:center;gap:var(--p-table-toolbar-gap, 6px);flex-wrap:wrap;border:var(--p-table-toolbar-border-width, 1px) solid var(--p-table-toolbar-border-color, var(--p-table-toolbar-border-color-default));border-radius:var(--p-table-toolbar-radius, 10px)}.praxis-toolbar.p-table-toolbar--flat{--p-table-toolbar-border-width: 0;--p-table-toolbar-shadow: none}.praxis-toolbar.p-table-toolbar--elevated{--p-table-toolbar-shadow: 0 12px 28px color-mix(in srgb, var(--md-sys-color-shadow, #000) 12%, transparent)}.praxis-toolbar.p-table-toolbar--integrated{--p-table-toolbar-bg: transparent;--p-table-toolbar-border-width: 0;--p-table-toolbar-radius: 0}.praxis-toolbar.p-table-toolbar--compact{--p-table-toolbar-min-height: 36px;--p-table-toolbar-padding-block: 4px;--p-table-toolbar-padding-inline: 10px;--p-table-toolbar-gap: 4px;--p-table-toolbar-actions-gap: 4px;--p-table-toolbar-action-size: 32px;--p-table-toolbar-action-radius: 7px}.praxis-toolbar.p-table-toolbar--comfortable{--p-table-toolbar-min-height: 44px;--p-table-toolbar-action-size: 36px}.praxis-toolbar.p-table-toolbar--spacious{--p-table-toolbar-min-height: 52px;--p-table-toolbar-padding-block: 8px;--p-table-toolbar-padding-inline: 16px;--p-table-toolbar-gap: 8px;--p-table-toolbar-actions-gap: 8px;--p-table-toolbar-action-size: 40px}.praxis-toolbar.p-table-toolbar--square{--p-table-toolbar-radius: 0;--p-table-toolbar-action-radius: 4px}.praxis-toolbar.p-table-toolbar--pill{--p-table-toolbar-radius: 999px;--p-table-toolbar-action-radius: 999px}:host(.praxis-toolbar-stack-top) .praxis-toolbar{border-bottom-left-radius:0;border-bottom-right-radius:0}:host(.praxis-toolbar-footer) .praxis-toolbar{border-top-left-radius:0;border-top-right-radius:0}:host(.praxis-toolbar-footer.footer-flat) .praxis-toolbar{border-bottom-left-radius:0;border-bottom-right-radius:0}.praxis-toolbar.mat-toolbar-single-row,.praxis-toolbar .mat-toolbar-row{height:auto}.praxis-toolbar.mat-toolbar-multiple-rows{min-height:var(--p-table-toolbar-min-height, var(--pfx-filter-h, 44px))}.toolbar-main{display:flex;align-items:center;justify-content:flex-start;min-width:0;column-gap:var(--p-table-toolbar-gap, 6px);row-gap:var(--p-table-toolbar-identity-filter-gap, 8px);min-height:var(--p-table-toolbar-min-height, var(--pfx-filter-h, 44px));flex:1 1 360px;flex-wrap:wrap;container-type:inline-size}.toolbar-identity{display:flex;align-items:center;gap:var(--p-table-toolbar-identity-gap, 8px);min-width:0;max-width:100%;min-height:var(--p-table-toolbar-identity-min-height, 30px);flex:1 1 100%;margin-block-end:var(--p-table-toolbar-identity-margin-bottom, 2px);padding-inline:2px;color:var(--p-table-toolbar-title-fg, var(--p-table-toolbar-fg, var(--p-table-toolbar-fg-default)))}.toolbar-identity--center{text-align:center;justify-content:center}.toolbar-identity--end{text-align:end;justify-content:flex-end}.toolbar-identity--center .toolbar-identity__copy{align-items:center}.toolbar-identity--end .toolbar-identity__copy{align-items:flex-end}.toolbar-identity__icon{width:var(--p-table-toolbar-identity-icon-size, 28px);height:var(--p-table-toolbar-identity-icon-size, 28px);border-radius:var(--p-table-toolbar-identity-icon-radius, 8px);display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;color:var(--p-table-toolbar-icon-fg, var(--md-sys-color-primary, currentColor));background:color-mix(in srgb,var(--p-table-toolbar-icon-fg, var(--md-sys-color-primary, currentColor)) 8%,transparent);border:1px solid color-mix(in srgb,var(--p-table-toolbar-icon-fg, var(--md-sys-color-primary, currentColor)) 18%,transparent)}.toolbar-identity__icon .mat-icon{font-size:18px;width:18px;height:18px;line-height:18px}.toolbar-identity__copy{display:flex;flex-direction:column;min-width:0;max-width:100%;gap:1px}.toolbar-identity__title,.toolbar-identity__subtitle{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.toolbar-identity__title{font-size:var(--p-table-toolbar-title-font-size, 14px);font-weight:var(--p-table-toolbar-title-font-weight, 700);line-height:1.2;letter-spacing:0;color:var(--p-table-toolbar-title-fg, currentColor)}.toolbar-identity__subtitle{font-size:var(--p-table-toolbar-subtitle-font-size, 11.5px);line-height:1.25;color:var(--p-table-toolbar-subtitle-fg, var(--p-table-toolbar-status-fg, var(--p-table-toolbar-status-fg-default)))}.toolbar-main>*{min-width:0}@container (max-width: 720px){.toolbar-identity{flex-basis:100%;max-width:100%}}@container (max-width: 420px){.toolbar-identity{min-width:0;flex-basis:auto}.toolbar-identity__subtitle{display:none}}.toolbar-actions{display:flex;align-items:center;align-self:flex-end;justify-content:flex-end;gap:var(--p-table-toolbar-gap, 6px);min-height:var(--p-table-toolbar-min-height, var(--pfx-filter-h, 44px));flex:0 0 auto;margin-left:auto}.actions-group{display:flex;align-items:center;gap:var(--p-table-toolbar-actions-gap, 6px)}.action-btn{height:var(--p-table-toolbar-action-size, 36px);min-width:var(--p-table-toolbar-action-size, 36px);border-radius:var(--p-table-toolbar-action-radius, 8px);font-size:12px;line-height:1.2;color:var(--p-table-toolbar-action-fg, inherit);background:var(--p-table-toolbar-action-bg, transparent)}.action-btn:hover:not(:disabled),.overflow-trigger:hover:not(:disabled),.end-actions ::ng-deep .mat-mdc-icon-button:hover:not(:disabled){background:var(--p-table-toolbar-action-hover-bg, var(--p-table-toolbar-action-hover-bg-default))}.action-btn:focus-visible,.overflow-trigger:focus-visible,.end-actions ::ng-deep .mat-mdc-icon-button:focus-visible{outline:2px solid var(--p-table-toolbar-action-focus-ring, var(--p-table-toolbar-action-focus-ring-default));outline-offset:2px}.action-btn--utility{color:var(--p-table-toolbar-status-fg, var(--p-table-toolbar-status-fg-default))}.praxis-table-toolbar-action--columns.action-btn{width:var(--p-table-toolbar-action-size, 36px);padding:0}.praxis-table-toolbar-action--columns mat-icon{margin:0}.toolbar-icon-btn{width:var(--p-table-toolbar-action-size, 36px);height:var(--p-table-toolbar-action-size, 36px);border-radius:var(--p-table-toolbar-action-radius, 8px);color:var(--md-sys-color-primary);background:color-mix(in srgb,var(--md-sys-color-primary) 9%,transparent);border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 22%,transparent)}.toolbar-icon-btn:hover:not(:disabled){color:var(--md-sys-color-on-primary-container);background:color-mix(in srgb,var(--md-sys-color-primary) 16%,transparent);border-color:color-mix(in srgb,var(--md-sys-color-primary) 36%,transparent)}.action-btn--fab{width:42px;height:42px;box-shadow:none}.pfx-tonal{background:var(--md-sys-color-secondary-container);color:var(--md-sys-color-on-secondary-container)}.pfx-tonal:hover{background:var(--md-sys-color-secondary-container)}.mobile-actions{display:none;align-items:center;gap:var(--p-table-toolbar-actions-gap, 6px)}.overflow-trigger{height:var(--p-table-toolbar-action-size, 36px)}.action-btn .mat-icon,.action-btn--fab .mat-icon,.overflow-trigger .mat-icon{font-size:18px;width:18px;height:18px;line-height:18px}.praxis-table-toolbar-action--columns .mat-icon{font-size:24px;width:24px;height:24px;line-height:24px}.praxis-table-column-menu-item.mat-mdc-menu-item{min-height:40px}.praxis-table-column-menu-content{align-items:center;display:flex;gap:10px;min-height:40px;width:100%}.praxis-table-column-menu-check.mat-icon{color:var(--md-sys-color-primary, currentColor);flex:0 0 20px;font-size:20px;height:20px;line-height:20px;margin-inline-end:0;width:20px}.action-btn.mat-mdc-button-base,.action-btn--fab.mat-mdc-button-base,.overflow-trigger.mat-mdc-button-base,.toolbar-icon-btn.mat-mdc-button-base{--mdc-text-button-container-height: var(--p-table-toolbar-action-size, 36px);--mdc-filled-button-container-height: var(--p-table-toolbar-action-size, 36px);--mdc-protected-button-container-height: var(--p-table-toolbar-action-size, 36px);--mdc-outlined-button-container-height: var(--p-table-toolbar-action-size, 36px);--mdc-icon-button-state-layer-size: var(--p-table-toolbar-action-size, 36px)}.action-btn.mat-mdc-unelevated-button:not(:disabled),.action-btn.mat-mdc-outlined-button:not(:disabled),.action-btn.pfx-tonal:not(:disabled){border-color:color-mix(in srgb,var(--md-sys-color-outline-variant, #d7dbe5) 82%,transparent)}.action-btn.mat-mdc-unelevated-button:not(:disabled){box-shadow:none}.action-btn.mat-mdc-unelevated-button.mat-primary:not(:disabled){--mdc-filled-button-container-color: var(--md-sys-color-primary);--mdc-filled-button-label-text-color: var(--md-sys-color-on-primary);--mat-filled-button-state-layer-color: var(--md-sys-color-on-primary);background:var(--md-sys-color-primary)!important;border-color:transparent;color:var(--md-sys-color-on-primary)!important;box-shadow:0 8px 18px color-mix(in srgb,var(--md-sys-color-primary) 22%,transparent)}.action-btn.mat-mdc-unelevated-button.mat-primary:not(:disabled):hover{background:color-mix(in srgb,var(--md-sys-color-primary) 88%,var(--md-sys-color-on-primary) 12%)!important}.action-btn.mat-mdc-unelevated-button.mat-primary:not(:disabled) .mat-icon{color:var(--md-sys-color-on-primary)!important}.action-btn.mat-mdc-button-base:not(.mat-mdc-icon-button){padding-inline:10px}.end-actions{display:flex;align-items:center;gap:var(--p-table-toolbar-actions-gap, 6px);margin-left:4px;padding-left:10px;border-left:1px solid var(--p-table-toolbar-divider-color, var(--p-table-toolbar-divider-color-default))}.end-actions:empty{display:none;gap:0;margin-left:0;padding-left:0;border-left:0}.end-actions ::ng-deep .mat-mdc-icon-button{width:var(--p-table-toolbar-action-size, 36px);height:var(--p-table-toolbar-action-size, 36px);display:inline-grid;place-items:center;padding:0;line-height:0;--mdc-icon-button-state-layer-size: var(--p-table-toolbar-action-size, 36px);--mat-icon-button-state-layer-size: var(--p-table-toolbar-action-size, 36px)}.end-actions ::ng-deep .mat-mdc-icon-button .mat-icon{display:block;flex:0 0 auto;font-size:24px;width:24px;height:24px;line-height:24px;margin:0}.praxis-toolbar.p-table-toolbar--divider-between-groups .actions-group,.praxis-toolbar.p-table-toolbar--divider-start .toolbar-main{padding-right:10px;border-right:1px solid var(--p-table-toolbar-divider-color, var(--p-table-toolbar-divider-color-default))}.end-actions ::ng-deep .praxis-table-toolbar-action--ai,.end-actions ::ng-deep .praxis-table-ai-trigger{color:var(--p-table-toolbar-ai-accent-color, var(--p-table-toolbar-ai-accent-color-default));background:color-mix(in srgb,var(--p-table-toolbar-ai-accent-color, var(--p-table-toolbar-ai-accent-color-default)) 10%,transparent);border:1px solid color-mix(in srgb,var(--p-table-toolbar-ai-accent-color, var(--p-table-toolbar-ai-accent-color-default)) 24%,transparent)}.end-actions ::ng-deep [data-role=table-settings]{color:var(--p-table-toolbar-status-fg, var(--p-table-toolbar-status-fg-default))}@media(min-width:1024px){.toolbar-actions{justify-content:flex-end}}@media(max-width:1023px){.actions-group{display:none}.mobile-actions{display:flex}.toolbar-actions{justify-content:flex-end}.toolbar-identity{min-width:0;max-width:100%;flex:1 1 100%}}\n"], dependencies: [{ kind: "ngmodule", type: MatToolbarModule }, { kind: "component", type: i2.MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i3.MatFabButton, selector: "button[mat-fab], a[mat-fab], button[matFab], a[matFab]", inputs: ["extended"], exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: PraxisIconDirective, selector: "mat-icon[praxisIcon]", inputs: ["praxisIcon"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i5.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i5.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i5.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i10.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }] });
|
|
1817
1847
|
}
|
|
1818
1848
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisTableToolbar, decorators: [{
|
|
1819
1849
|
type: Component,
|
|
@@ -2350,7 +2380,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
2350
2380
|
`, host: {
|
|
2351
2381
|
'[class.praxis-toolbar-footer]': "placement === 'footer'",
|
|
2352
2382
|
'(document:keydown)': 'onDocumentKeydown($event)',
|
|
2353
|
-
}, styles: [":host{display:block}.praxis-toolbar{--p-table-toolbar-bg-default: linear-gradient( 180deg, color-mix(in srgb, var(--md-sys-color-surface, #fff) 96%, transparent), color-mix(in srgb, var(--md-sys-color-surface-container-low, #f6f8fc) 100%, transparent) );--p-table-toolbar-fg-default: var(--md-sys-color-on-surface, currentColor);--p-table-toolbar-border-color-default: color-mix(in srgb, var(--md-sys-color-outline-variant, #d7dbe5) 78%, transparent);--p-table-toolbar-divider-color-default: color-mix(in srgb, var(--md-sys-color-outline) 42%, transparent);--p-table-toolbar-action-hover-bg-default: color-mix(in srgb, var(--md-sys-color-primary) 10%, transparent);--p-table-toolbar-action-active-bg-default: color-mix(in srgb, var(--md-sys-color-primary) 16%, transparent);--p-table-toolbar-action-focus-ring-default: color-mix(in srgb, var(--md-sys-color-primary) 52%, transparent);--p-table-toolbar-ai-accent-color-default: var(--md-sys-color-primary, #0b72d9);--p-table-toolbar-status-fg-default: var(--md-sys-color-on-surface-variant, currentColor);background:var(--p-table-toolbar-bg, var(--p-table-toolbar-bg-default));color:var(--p-table-toolbar-fg, var(--p-table-toolbar-fg-default));box-shadow:var(--p-table-toolbar-shadow, none);padding:var(--p-table-toolbar-padding-block, var(--pfx-toolbar-pad-y, 6px)) var(--p-table-toolbar-padding-inline, var(--pfx-toolbar-pad-x, 12px));min-height:var(--p-table-toolbar-min-height, var(--pfx-filter-h, 44px));display:flex;flex-direction:row;align-items:center;gap:var(--p-table-toolbar-gap, 6px);flex-wrap:wrap;border:var(--p-table-toolbar-border-width, 1px) solid var(--p-table-toolbar-border-color, var(--p-table-toolbar-border-color-default));border-radius:var(--p-table-toolbar-radius, 10px)}.praxis-toolbar.p-table-toolbar--flat{--p-table-toolbar-border-width: 0;--p-table-toolbar-shadow: none}.praxis-toolbar.p-table-toolbar--elevated{--p-table-toolbar-shadow: 0 12px 28px color-mix(in srgb, var(--md-sys-color-shadow, #000) 12%, transparent)}.praxis-toolbar.p-table-toolbar--integrated{--p-table-toolbar-bg: transparent;--p-table-toolbar-border-width: 0;--p-table-toolbar-radius: 0}.praxis-toolbar.p-table-toolbar--compact{--p-table-toolbar-min-height: 36px;--p-table-toolbar-padding-block: 4px;--p-table-toolbar-padding-inline: 10px;--p-table-toolbar-gap: 4px;--p-table-toolbar-actions-gap: 4px;--p-table-toolbar-action-size: 32px;--p-table-toolbar-action-radius: 7px}.praxis-toolbar.p-table-toolbar--comfortable{--p-table-toolbar-min-height: 44px;--p-table-toolbar-action-size: 36px}.praxis-toolbar.p-table-toolbar--spacious{--p-table-toolbar-min-height: 52px;--p-table-toolbar-padding-block: 8px;--p-table-toolbar-padding-inline: 16px;--p-table-toolbar-gap: 8px;--p-table-toolbar-actions-gap: 8px;--p-table-toolbar-action-size: 40px}.praxis-toolbar.p-table-toolbar--square{--p-table-toolbar-radius: 0;--p-table-toolbar-action-radius: 4px}.praxis-toolbar.p-table-toolbar--pill{--p-table-toolbar-radius: 999px;--p-table-toolbar-action-radius: 999px}:host(.praxis-toolbar-stack-top) .praxis-toolbar{border-bottom-left-radius:0;border-bottom-right-radius:0}:host(.praxis-toolbar-footer) .praxis-toolbar{border-top-left-radius:0;border-top-right-radius:0}:host(.praxis-toolbar-footer.footer-flat) .praxis-toolbar{border-bottom-left-radius:0;border-bottom-right-radius:0}.praxis-toolbar.mat-toolbar-single-row,.praxis-toolbar .mat-toolbar-row{height:auto}.praxis-toolbar.mat-toolbar-multiple-rows{min-height:var(--p-table-toolbar-min-height, var(--pfx-filter-h, 44px))}.toolbar-main{display:flex;align-items:center;justify-content:flex-start;min-width:0;column-gap:var(--p-table-toolbar-gap, 6px);row-gap:var(--p-table-toolbar-identity-filter-gap, 8px);min-height:var(--p-table-toolbar-min-height, var(--pfx-filter-h, 44px));flex:1 1 360px;flex-wrap:wrap;container-type:inline-size}.toolbar-identity{display:flex;align-items:center;gap:var(--p-table-toolbar-identity-gap, 8px);min-width:0;max-width:100%;min-height:var(--p-table-toolbar-identity-min-height, 30px);flex:1 1 100%;margin-block-end:var(--p-table-toolbar-identity-margin-bottom, 2px);padding-inline:2px;color:var(--p-table-toolbar-title-fg, var(--p-table-toolbar-fg, var(--p-table-toolbar-fg-default)))}.toolbar-identity--center{text-align:center;justify-content:center}.toolbar-identity--end{text-align:end;justify-content:flex-end}.toolbar-identity--center .toolbar-identity__copy{align-items:center}.toolbar-identity--end .toolbar-identity__copy{align-items:flex-end}.toolbar-identity__icon{width:var(--p-table-toolbar-identity-icon-size, 28px);height:var(--p-table-toolbar-identity-icon-size, 28px);border-radius:var(--p-table-toolbar-identity-icon-radius, 8px);display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;color:var(--p-table-toolbar-icon-fg, var(--md-sys-color-primary, currentColor));background:color-mix(in srgb,var(--p-table-toolbar-icon-fg, var(--md-sys-color-primary, currentColor)) 8%,transparent);border:1px solid color-mix(in srgb,var(--p-table-toolbar-icon-fg, var(--md-sys-color-primary, currentColor)) 18%,transparent)}.toolbar-identity__icon .mat-icon{font-size:18px;width:18px;height:18px;line-height:18px}.toolbar-identity__copy{display:flex;flex-direction:column;min-width:0;max-width:100%;gap:1px}.toolbar-identity__title,.toolbar-identity__subtitle{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.toolbar-identity__title{font-size:var(--p-table-toolbar-title-font-size, 14px);font-weight:var(--p-table-toolbar-title-font-weight, 700);line-height:1.2;letter-spacing:0;color:var(--p-table-toolbar-title-fg, currentColor)}.toolbar-identity__subtitle{font-size:var(--p-table-toolbar-subtitle-font-size, 11.5px);line-height:1.25;color:var(--p-table-toolbar-subtitle-fg, var(--p-table-toolbar-status-fg, var(--p-table-toolbar-status-fg-default)))}.toolbar-main>*{min-width:0}@container (max-width: 720px){.toolbar-identity{flex-basis:100%;max-width:100%}}@container (max-width: 420px){.toolbar-identity{min-width:0;flex-basis:auto}.toolbar-identity__subtitle{display:none}}.toolbar-actions{display:flex;align-items:center;align-self:flex-end;justify-content:flex-end;gap:var(--p-table-toolbar-gap, 6px);min-height:var(--p-table-toolbar-min-height, var(--pfx-filter-h, 44px));flex:0 0 auto;margin-left:auto}.actions-group{display:flex;align-items:center;gap:var(--p-table-toolbar-actions-gap, 6px)}.action-btn{height:var(--p-table-toolbar-action-size, 36px);min-width:var(--p-table-toolbar-action-size, 36px);border-radius:var(--p-table-toolbar-action-radius, 8px);font-size:12px;line-height:1.2;color:var(--p-table-toolbar-action-fg, inherit);background:var(--p-table-toolbar-action-bg, transparent)}.action-btn:hover:not(:disabled),.overflow-trigger:hover:not(:disabled),.end-actions ::ng-deep .mat-mdc-icon-button:hover:not(:disabled){background:var(--p-table-toolbar-action-hover-bg, var(--p-table-toolbar-action-hover-bg-default))}.action-btn:focus-visible,.overflow-trigger:focus-visible,.end-actions ::ng-deep .mat-mdc-icon-button:focus-visible{outline:2px solid var(--p-table-toolbar-action-focus-ring, var(--p-table-toolbar-action-focus-ring-default));outline-offset:2px}.action-btn--utility{color:var(--p-table-toolbar-status-fg, var(--p-table-toolbar-status-fg-default))}.praxis-table-toolbar-action--columns.action-btn{width:var(--p-table-toolbar-action-size, 36px);padding:0}.praxis-table-toolbar-action--columns mat-icon{margin:0}.toolbar-icon-btn{width:var(--p-table-toolbar-action-size, 36px);height:var(--p-table-toolbar-action-size, 36px);border-radius:var(--p-table-toolbar-action-radius, 8px);color:var(--md-sys-color-primary);background:color-mix(in srgb,var(--md-sys-color-primary) 9%,transparent);border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 22%,transparent)}.toolbar-icon-btn:hover:not(:disabled){color:var(--md-sys-color-on-primary-container);background:color-mix(in srgb,var(--md-sys-color-primary) 16%,transparent);border-color:color-mix(in srgb,var(--md-sys-color-primary) 36%,transparent)}.action-btn--fab{width:42px;height:42px;box-shadow:none}.pfx-tonal{background:var(--md-sys-color-secondary-container);color:var(--md-sys-color-on-secondary-container)}.pfx-tonal:hover{background:var(--md-sys-color-secondary-container)}.mobile-actions{display:none;align-items:center;gap:var(--p-table-toolbar-actions-gap, 6px)}.overflow-trigger{height:var(--p-table-toolbar-action-size, 36px)}.action-btn .mat-icon,.action-btn--fab .mat-icon,.overflow-trigger .mat-icon{font-size:18px;width:18px;height:18px;line-height:18px}.praxis-table-toolbar-action--columns .mat-icon{font-size:24px;width:24px;height:24px;line-height:24px}.praxis-table-column-menu-item.mat-mdc-menu-item{min-height:40px}.praxis-table-column-menu-content{align-items:center;display:flex;gap:10px;min-height:40px;width:100%}.praxis-table-column-menu-check.mat-icon{color:var(--md-sys-color-primary, currentColor);flex:0 0 20px;font-size:20px;height:20px;line-height:20px;margin-inline-end:0;width:20px}.action-btn.mat-mdc-button-base,.action-btn--fab.mat-mdc-button-base,.overflow-trigger.mat-mdc-button-base,.toolbar-icon-btn.mat-mdc-button-base{--mdc-text-button-container-height: var(--p-table-toolbar-action-size, 36px);--mdc-filled-button-container-height: var(--p-table-toolbar-action-size, 36px);--mdc-protected-button-container-height: var(--p-table-toolbar-action-size, 36px);--mdc-outlined-button-container-height: var(--p-table-toolbar-action-size, 36px);--mdc-icon-button-state-layer-size: var(--p-table-toolbar-action-size, 36px)}.action-btn.mat-mdc-unelevated-button:not(:disabled),.action-btn.mat-mdc-outlined-button:not(:disabled),.action-btn.pfx-tonal:not(:disabled){border-color:color-mix(in srgb,var(--md-sys-color-outline-variant, #d7dbe5) 82%,transparent)}.action-btn.mat-mdc-unelevated-button:not(:disabled){box-shadow:none}.action-btn.mat-mdc-unelevated-button.mat-primary:not(:disabled){--mdc-filled-button-container-color: var(--md-sys-color-primary);--mdc-filled-button-label-text-color: var(--md-sys-color-on-primary);--mat-filled-button-state-layer-color: var(--md-sys-color-on-primary);background:var(--md-sys-color-primary)!important;border-color:transparent;color:var(--md-sys-color-on-primary)!important;box-shadow:0 8px 18px color-mix(in srgb,var(--md-sys-color-primary) 22%,transparent)}.action-btn.mat-mdc-unelevated-button.mat-primary:not(:disabled):hover{background:color-mix(in srgb,var(--md-sys-color-primary) 88%,var(--md-sys-color-on-primary) 12%)!important}.action-btn.mat-mdc-unelevated-button.mat-primary:not(:disabled) .mat-icon{color:var(--md-sys-color-on-primary)!important}.action-btn.mat-mdc-button-base:not(.mat-mdc-icon-button){padding-inline:10px}.end-actions{display:flex;align-items:center;gap:var(--p-table-toolbar-actions-gap, 6px);margin-left:4px;padding-left:10px;border-left:1px solid var(--p-table-toolbar-divider-color, var(--p-table-toolbar-divider-color-default))}.end-actions ::ng-deep .mat-mdc-icon-button{width:var(--p-table-toolbar-action-size, 36px);height:var(--p-table-toolbar-action-size, 36px);display:inline-grid;place-items:center;padding:0;line-height:0;--mdc-icon-button-state-layer-size: var(--p-table-toolbar-action-size, 36px);--mat-icon-button-state-layer-size: var(--p-table-toolbar-action-size, 36px)}.end-actions ::ng-deep .mat-mdc-icon-button .mat-icon{display:block;flex:0 0 auto;font-size:24px;width:24px;height:24px;line-height:24px;margin:0}.praxis-toolbar.p-table-toolbar--divider-between-groups .actions-group,.praxis-toolbar.p-table-toolbar--divider-start .toolbar-main{padding-right:10px;border-right:1px solid var(--p-table-toolbar-divider-color, var(--p-table-toolbar-divider-color-default))}.end-actions ::ng-deep .praxis-table-toolbar-action--ai,.end-actions ::ng-deep .praxis-table-ai-trigger{color:var(--p-table-toolbar-ai-accent-color, var(--p-table-toolbar-ai-accent-color-default));background:color-mix(in srgb,var(--p-table-toolbar-ai-accent-color, var(--p-table-toolbar-ai-accent-color-default)) 10%,transparent);border:1px solid color-mix(in srgb,var(--p-table-toolbar-ai-accent-color, var(--p-table-toolbar-ai-accent-color-default)) 24%,transparent)}.end-actions ::ng-deep [data-role=table-settings]{color:var(--p-table-toolbar-status-fg, var(--p-table-toolbar-status-fg-default))}@media(min-width:1024px){.toolbar-actions{justify-content:flex-end}}@media(max-width:1023px){.actions-group{display:none}.mobile-actions{display:flex}.toolbar-actions{justify-content:flex-end}.toolbar-identity{min-width:0;max-width:100%;flex:1 1 100%}}\n"] }]
|
|
2383
|
+
}, styles: [":host{display:block}.praxis-toolbar{--p-table-toolbar-bg-default: linear-gradient( 180deg, color-mix(in srgb, var(--md-sys-color-surface, #fff) 96%, transparent), color-mix(in srgb, var(--md-sys-color-surface-container-low, #f6f8fc) 100%, transparent) );--p-table-toolbar-fg-default: var(--md-sys-color-on-surface, currentColor);--p-table-toolbar-border-color-default: color-mix(in srgb, var(--md-sys-color-outline-variant, #d7dbe5) 78%, transparent);--p-table-toolbar-divider-color-default: color-mix(in srgb, var(--md-sys-color-outline) 42%, transparent);--p-table-toolbar-action-hover-bg-default: color-mix(in srgb, var(--md-sys-color-primary) 10%, transparent);--p-table-toolbar-action-active-bg-default: color-mix(in srgb, var(--md-sys-color-primary) 16%, transparent);--p-table-toolbar-action-focus-ring-default: color-mix(in srgb, var(--md-sys-color-primary) 52%, transparent);--p-table-toolbar-ai-accent-color-default: var(--md-sys-color-primary, #0b72d9);--p-table-toolbar-status-fg-default: var(--md-sys-color-on-surface-variant, currentColor);background:var(--p-table-toolbar-bg, var(--p-table-toolbar-bg-default));color:var(--p-table-toolbar-fg, var(--p-table-toolbar-fg-default));box-shadow:var(--p-table-toolbar-shadow, none);padding:var(--p-table-toolbar-padding-block, var(--pfx-toolbar-pad-y, 6px)) var(--p-table-toolbar-padding-inline, var(--pfx-toolbar-pad-x, 12px));min-height:var(--p-table-toolbar-min-height, var(--pfx-filter-h, 44px));display:flex;flex-direction:row;align-items:center;gap:var(--p-table-toolbar-gap, 6px);flex-wrap:wrap;border:var(--p-table-toolbar-border-width, 1px) solid var(--p-table-toolbar-border-color, var(--p-table-toolbar-border-color-default));border-radius:var(--p-table-toolbar-radius, 10px)}.praxis-toolbar.p-table-toolbar--flat{--p-table-toolbar-border-width: 0;--p-table-toolbar-shadow: none}.praxis-toolbar.p-table-toolbar--elevated{--p-table-toolbar-shadow: 0 12px 28px color-mix(in srgb, var(--md-sys-color-shadow, #000) 12%, transparent)}.praxis-toolbar.p-table-toolbar--integrated{--p-table-toolbar-bg: transparent;--p-table-toolbar-border-width: 0;--p-table-toolbar-radius: 0}.praxis-toolbar.p-table-toolbar--compact{--p-table-toolbar-min-height: 36px;--p-table-toolbar-padding-block: 4px;--p-table-toolbar-padding-inline: 10px;--p-table-toolbar-gap: 4px;--p-table-toolbar-actions-gap: 4px;--p-table-toolbar-action-size: 32px;--p-table-toolbar-action-radius: 7px}.praxis-toolbar.p-table-toolbar--comfortable{--p-table-toolbar-min-height: 44px;--p-table-toolbar-action-size: 36px}.praxis-toolbar.p-table-toolbar--spacious{--p-table-toolbar-min-height: 52px;--p-table-toolbar-padding-block: 8px;--p-table-toolbar-padding-inline: 16px;--p-table-toolbar-gap: 8px;--p-table-toolbar-actions-gap: 8px;--p-table-toolbar-action-size: 40px}.praxis-toolbar.p-table-toolbar--square{--p-table-toolbar-radius: 0;--p-table-toolbar-action-radius: 4px}.praxis-toolbar.p-table-toolbar--pill{--p-table-toolbar-radius: 999px;--p-table-toolbar-action-radius: 999px}:host(.praxis-toolbar-stack-top) .praxis-toolbar{border-bottom-left-radius:0;border-bottom-right-radius:0}:host(.praxis-toolbar-footer) .praxis-toolbar{border-top-left-radius:0;border-top-right-radius:0}:host(.praxis-toolbar-footer.footer-flat) .praxis-toolbar{border-bottom-left-radius:0;border-bottom-right-radius:0}.praxis-toolbar.mat-toolbar-single-row,.praxis-toolbar .mat-toolbar-row{height:auto}.praxis-toolbar.mat-toolbar-multiple-rows{min-height:var(--p-table-toolbar-min-height, var(--pfx-filter-h, 44px))}.toolbar-main{display:flex;align-items:center;justify-content:flex-start;min-width:0;column-gap:var(--p-table-toolbar-gap, 6px);row-gap:var(--p-table-toolbar-identity-filter-gap, 8px);min-height:var(--p-table-toolbar-min-height, var(--pfx-filter-h, 44px));flex:1 1 360px;flex-wrap:wrap;container-type:inline-size}.toolbar-identity{display:flex;align-items:center;gap:var(--p-table-toolbar-identity-gap, 8px);min-width:0;max-width:100%;min-height:var(--p-table-toolbar-identity-min-height, 30px);flex:1 1 100%;margin-block-end:var(--p-table-toolbar-identity-margin-bottom, 2px);padding-inline:2px;color:var(--p-table-toolbar-title-fg, var(--p-table-toolbar-fg, var(--p-table-toolbar-fg-default)))}.toolbar-identity--center{text-align:center;justify-content:center}.toolbar-identity--end{text-align:end;justify-content:flex-end}.toolbar-identity--center .toolbar-identity__copy{align-items:center}.toolbar-identity--end .toolbar-identity__copy{align-items:flex-end}.toolbar-identity__icon{width:var(--p-table-toolbar-identity-icon-size, 28px);height:var(--p-table-toolbar-identity-icon-size, 28px);border-radius:var(--p-table-toolbar-identity-icon-radius, 8px);display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;color:var(--p-table-toolbar-icon-fg, var(--md-sys-color-primary, currentColor));background:color-mix(in srgb,var(--p-table-toolbar-icon-fg, var(--md-sys-color-primary, currentColor)) 8%,transparent);border:1px solid color-mix(in srgb,var(--p-table-toolbar-icon-fg, var(--md-sys-color-primary, currentColor)) 18%,transparent)}.toolbar-identity__icon .mat-icon{font-size:18px;width:18px;height:18px;line-height:18px}.toolbar-identity__copy{display:flex;flex-direction:column;min-width:0;max-width:100%;gap:1px}.toolbar-identity__title,.toolbar-identity__subtitle{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.toolbar-identity__title{font-size:var(--p-table-toolbar-title-font-size, 14px);font-weight:var(--p-table-toolbar-title-font-weight, 700);line-height:1.2;letter-spacing:0;color:var(--p-table-toolbar-title-fg, currentColor)}.toolbar-identity__subtitle{font-size:var(--p-table-toolbar-subtitle-font-size, 11.5px);line-height:1.25;color:var(--p-table-toolbar-subtitle-fg, var(--p-table-toolbar-status-fg, var(--p-table-toolbar-status-fg-default)))}.toolbar-main>*{min-width:0}@container (max-width: 720px){.toolbar-identity{flex-basis:100%;max-width:100%}}@container (max-width: 420px){.toolbar-identity{min-width:0;flex-basis:auto}.toolbar-identity__subtitle{display:none}}.toolbar-actions{display:flex;align-items:center;align-self:flex-end;justify-content:flex-end;gap:var(--p-table-toolbar-gap, 6px);min-height:var(--p-table-toolbar-min-height, var(--pfx-filter-h, 44px));flex:0 0 auto;margin-left:auto}.actions-group{display:flex;align-items:center;gap:var(--p-table-toolbar-actions-gap, 6px)}.action-btn{height:var(--p-table-toolbar-action-size, 36px);min-width:var(--p-table-toolbar-action-size, 36px);border-radius:var(--p-table-toolbar-action-radius, 8px);font-size:12px;line-height:1.2;color:var(--p-table-toolbar-action-fg, inherit);background:var(--p-table-toolbar-action-bg, transparent)}.action-btn:hover:not(:disabled),.overflow-trigger:hover:not(:disabled),.end-actions ::ng-deep .mat-mdc-icon-button:hover:not(:disabled){background:var(--p-table-toolbar-action-hover-bg, var(--p-table-toolbar-action-hover-bg-default))}.action-btn:focus-visible,.overflow-trigger:focus-visible,.end-actions ::ng-deep .mat-mdc-icon-button:focus-visible{outline:2px solid var(--p-table-toolbar-action-focus-ring, var(--p-table-toolbar-action-focus-ring-default));outline-offset:2px}.action-btn--utility{color:var(--p-table-toolbar-status-fg, var(--p-table-toolbar-status-fg-default))}.praxis-table-toolbar-action--columns.action-btn{width:var(--p-table-toolbar-action-size, 36px);padding:0}.praxis-table-toolbar-action--columns mat-icon{margin:0}.toolbar-icon-btn{width:var(--p-table-toolbar-action-size, 36px);height:var(--p-table-toolbar-action-size, 36px);border-radius:var(--p-table-toolbar-action-radius, 8px);color:var(--md-sys-color-primary);background:color-mix(in srgb,var(--md-sys-color-primary) 9%,transparent);border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 22%,transparent)}.toolbar-icon-btn:hover:not(:disabled){color:var(--md-sys-color-on-primary-container);background:color-mix(in srgb,var(--md-sys-color-primary) 16%,transparent);border-color:color-mix(in srgb,var(--md-sys-color-primary) 36%,transparent)}.action-btn--fab{width:42px;height:42px;box-shadow:none}.pfx-tonal{background:var(--md-sys-color-secondary-container);color:var(--md-sys-color-on-secondary-container)}.pfx-tonal:hover{background:var(--md-sys-color-secondary-container)}.mobile-actions{display:none;align-items:center;gap:var(--p-table-toolbar-actions-gap, 6px)}.overflow-trigger{height:var(--p-table-toolbar-action-size, 36px)}.action-btn .mat-icon,.action-btn--fab .mat-icon,.overflow-trigger .mat-icon{font-size:18px;width:18px;height:18px;line-height:18px}.praxis-table-toolbar-action--columns .mat-icon{font-size:24px;width:24px;height:24px;line-height:24px}.praxis-table-column-menu-item.mat-mdc-menu-item{min-height:40px}.praxis-table-column-menu-content{align-items:center;display:flex;gap:10px;min-height:40px;width:100%}.praxis-table-column-menu-check.mat-icon{color:var(--md-sys-color-primary, currentColor);flex:0 0 20px;font-size:20px;height:20px;line-height:20px;margin-inline-end:0;width:20px}.action-btn.mat-mdc-button-base,.action-btn--fab.mat-mdc-button-base,.overflow-trigger.mat-mdc-button-base,.toolbar-icon-btn.mat-mdc-button-base{--mdc-text-button-container-height: var(--p-table-toolbar-action-size, 36px);--mdc-filled-button-container-height: var(--p-table-toolbar-action-size, 36px);--mdc-protected-button-container-height: var(--p-table-toolbar-action-size, 36px);--mdc-outlined-button-container-height: var(--p-table-toolbar-action-size, 36px);--mdc-icon-button-state-layer-size: var(--p-table-toolbar-action-size, 36px)}.action-btn.mat-mdc-unelevated-button:not(:disabled),.action-btn.mat-mdc-outlined-button:not(:disabled),.action-btn.pfx-tonal:not(:disabled){border-color:color-mix(in srgb,var(--md-sys-color-outline-variant, #d7dbe5) 82%,transparent)}.action-btn.mat-mdc-unelevated-button:not(:disabled){box-shadow:none}.action-btn.mat-mdc-unelevated-button.mat-primary:not(:disabled){--mdc-filled-button-container-color: var(--md-sys-color-primary);--mdc-filled-button-label-text-color: var(--md-sys-color-on-primary);--mat-filled-button-state-layer-color: var(--md-sys-color-on-primary);background:var(--md-sys-color-primary)!important;border-color:transparent;color:var(--md-sys-color-on-primary)!important;box-shadow:0 8px 18px color-mix(in srgb,var(--md-sys-color-primary) 22%,transparent)}.action-btn.mat-mdc-unelevated-button.mat-primary:not(:disabled):hover{background:color-mix(in srgb,var(--md-sys-color-primary) 88%,var(--md-sys-color-on-primary) 12%)!important}.action-btn.mat-mdc-unelevated-button.mat-primary:not(:disabled) .mat-icon{color:var(--md-sys-color-on-primary)!important}.action-btn.mat-mdc-button-base:not(.mat-mdc-icon-button){padding-inline:10px}.end-actions{display:flex;align-items:center;gap:var(--p-table-toolbar-actions-gap, 6px);margin-left:4px;padding-left:10px;border-left:1px solid var(--p-table-toolbar-divider-color, var(--p-table-toolbar-divider-color-default))}.end-actions:empty{display:none;gap:0;margin-left:0;padding-left:0;border-left:0}.end-actions ::ng-deep .mat-mdc-icon-button{width:var(--p-table-toolbar-action-size, 36px);height:var(--p-table-toolbar-action-size, 36px);display:inline-grid;place-items:center;padding:0;line-height:0;--mdc-icon-button-state-layer-size: var(--p-table-toolbar-action-size, 36px);--mat-icon-button-state-layer-size: var(--p-table-toolbar-action-size, 36px)}.end-actions ::ng-deep .mat-mdc-icon-button .mat-icon{display:block;flex:0 0 auto;font-size:24px;width:24px;height:24px;line-height:24px;margin:0}.praxis-toolbar.p-table-toolbar--divider-between-groups .actions-group,.praxis-toolbar.p-table-toolbar--divider-start .toolbar-main{padding-right:10px;border-right:1px solid var(--p-table-toolbar-divider-color, var(--p-table-toolbar-divider-color-default))}.end-actions ::ng-deep .praxis-table-toolbar-action--ai,.end-actions ::ng-deep .praxis-table-ai-trigger{color:var(--p-table-toolbar-ai-accent-color, var(--p-table-toolbar-ai-accent-color-default));background:color-mix(in srgb,var(--p-table-toolbar-ai-accent-color, var(--p-table-toolbar-ai-accent-color-default)) 10%,transparent);border:1px solid color-mix(in srgb,var(--p-table-toolbar-ai-accent-color, var(--p-table-toolbar-ai-accent-color-default)) 24%,transparent)}.end-actions ::ng-deep [data-role=table-settings]{color:var(--p-table-toolbar-status-fg, var(--p-table-toolbar-status-fg-default))}@media(min-width:1024px){.toolbar-actions{justify-content:flex-end}}@media(max-width:1023px){.actions-group{display:none}.mobile-actions{display:flex}.toolbar-actions{justify-content:flex-end}.toolbar-identity{min-width:0;max-width:100%;flex:1 1 100%}}\n"] }]
|
|
2354
2384
|
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.LoggerService, decorators: [{
|
|
2355
2385
|
type: Optional
|
|
2356
2386
|
}] }, { type: i1.PraxisI18nService, decorators: [{
|
|
@@ -39412,8 +39442,14 @@ class PraxisTable {
|
|
|
39412
39442
|
static ROW_DISCOVERY_MAX_CONCURRENT_REQUESTS = 2;
|
|
39413
39443
|
_resourceDiscovery;
|
|
39414
39444
|
_resourceSurfaceOpenAdapter;
|
|
39445
|
+
_crudOperationResolver;
|
|
39415
39446
|
runtimeObservationRegistry = inject(PraxisRuntimeComponentObservationRegistryService, { optional: true });
|
|
39416
39447
|
detailInlineRenderers = inject(PRAXIS_TABLE_DETAIL_INLINE_RENDERERS, { optional: true }) ?? [];
|
|
39448
|
+
collectionLinks = null;
|
|
39449
|
+
collectionCapabilities = null;
|
|
39450
|
+
collectionCapabilitiesRequestHref = null;
|
|
39451
|
+
collectionCapabilitiesResolvedHref = null;
|
|
39452
|
+
collectionCapabilitiesRequestSeq = 0;
|
|
39417
39453
|
detailInlineNodeResolvers = inject(PRAXIS_TABLE_DETAIL_INLINE_NODE_RESOLVERS, { optional: true }) ?? [];
|
|
39418
39454
|
runtimeObservationRegistration = null;
|
|
39419
39455
|
paginatorSelectConfig = {
|
|
@@ -39566,6 +39602,7 @@ class PraxisTable {
|
|
|
39566
39602
|
sanitizer = inject(DomSanitizer);
|
|
39567
39603
|
collectionExport = inject(PraxisCollectionExportService);
|
|
39568
39604
|
paginatorIntl = inject(MatPaginatorIntl);
|
|
39605
|
+
schemaNormalizer = inject(SchemaNormalizerService);
|
|
39569
39606
|
schemaFieldsSnapshot = [];
|
|
39570
39607
|
filterSchemaFieldsSnapshot = [];
|
|
39571
39608
|
runtimeSchemaMeta = {};
|
|
@@ -41105,6 +41142,306 @@ class PraxisTable {
|
|
|
41105
41142
|
return true;
|
|
41106
41143
|
return (config.toolbar?.actions?.length ?? 0) > 0;
|
|
41107
41144
|
}
|
|
41145
|
+
resolveCollectionDiscoveryOptions() {
|
|
41146
|
+
const endpointKey = this.crudContext?.endpointKey;
|
|
41147
|
+
return endpointKey ? { endpointKey } : undefined;
|
|
41148
|
+
}
|
|
41149
|
+
updateCollectionLinks(links) {
|
|
41150
|
+
this.collectionLinks = links;
|
|
41151
|
+
const capabilitiesHref = this.resolveCollectionCapabilitiesHref(links);
|
|
41152
|
+
this.materializeCollectionCreateToolbarAction();
|
|
41153
|
+
if (!capabilitiesHref) {
|
|
41154
|
+
this.collectionCapabilitiesRequestSeq += 1;
|
|
41155
|
+
this.collectionCapabilitiesRequestHref = null;
|
|
41156
|
+
this.collectionCapabilitiesResolvedHref = null;
|
|
41157
|
+
if (this.collectionCapabilities) {
|
|
41158
|
+
this.collectionCapabilities = null;
|
|
41159
|
+
this.materializeCollectionCreateToolbarAction();
|
|
41160
|
+
}
|
|
41161
|
+
return;
|
|
41162
|
+
}
|
|
41163
|
+
if (capabilitiesHref === this.collectionCapabilitiesRequestHref ||
|
|
41164
|
+
(capabilitiesHref === this.collectionCapabilitiesResolvedHref && !!this.collectionCapabilities)) {
|
|
41165
|
+
return;
|
|
41166
|
+
}
|
|
41167
|
+
const requestSeq = ++this.collectionCapabilitiesRequestSeq;
|
|
41168
|
+
this.collectionCapabilitiesRequestHref = capabilitiesHref;
|
|
41169
|
+
void firstValueFrom(this.resourceDiscovery.getCapabilities(links || {}, this.resolveCollectionDiscoveryOptions()))
|
|
41170
|
+
.then((snapshot) => {
|
|
41171
|
+
if (requestSeq !== this.collectionCapabilitiesRequestSeq) {
|
|
41172
|
+
return;
|
|
41173
|
+
}
|
|
41174
|
+
this.collectionCapabilitiesRequestHref = null;
|
|
41175
|
+
this.collectionCapabilitiesResolvedHref = capabilitiesHref;
|
|
41176
|
+
this.collectionCapabilities = snapshot;
|
|
41177
|
+
this.materializeCollectionCreateToolbarAction();
|
|
41178
|
+
})
|
|
41179
|
+
.catch(() => {
|
|
41180
|
+
if (requestSeq !== this.collectionCapabilitiesRequestSeq) {
|
|
41181
|
+
return;
|
|
41182
|
+
}
|
|
41183
|
+
const hadCapabilities = !!this.collectionCapabilities;
|
|
41184
|
+
this.collectionCapabilities = null;
|
|
41185
|
+
this.collectionCapabilitiesRequestHref = null;
|
|
41186
|
+
this.collectionCapabilitiesResolvedHref = null;
|
|
41187
|
+
if (hadCapabilities) {
|
|
41188
|
+
this.materializeCollectionCreateToolbarAction();
|
|
41189
|
+
}
|
|
41190
|
+
});
|
|
41191
|
+
}
|
|
41192
|
+
resolveCollectionCapabilitiesHref(links) {
|
|
41193
|
+
try {
|
|
41194
|
+
return this.resourceDiscovery.resolveLinkHref(links || undefined, 'capabilities', this.resolveCollectionDiscoveryOptions());
|
|
41195
|
+
}
|
|
41196
|
+
catch {
|
|
41197
|
+
return null;
|
|
41198
|
+
}
|
|
41199
|
+
}
|
|
41200
|
+
materializeCollectionCreateToolbarAction() {
|
|
41201
|
+
if (!this.config) {
|
|
41202
|
+
return;
|
|
41203
|
+
}
|
|
41204
|
+
const currentToolbar = this.config.toolbar;
|
|
41205
|
+
const actions = currentToolbar?.actions || [];
|
|
41206
|
+
const createIndex = actions.findIndex((action) => this.isCreateToolbarAction(action));
|
|
41207
|
+
const existing = createIndex >= 0 ? actions[createIndex] : null;
|
|
41208
|
+
const materialized = this.buildCollectionCreateToolbarAction(existing);
|
|
41209
|
+
if (!materialized) {
|
|
41210
|
+
if (existing?.__praxisCollectionCreateAction) {
|
|
41211
|
+
actions.splice(createIndex, 1);
|
|
41212
|
+
currentToolbar.actions = actions;
|
|
41213
|
+
this.setShowToolbar(this.shouldExposeToolbar());
|
|
41214
|
+
this.cdr.markForCheck();
|
|
41215
|
+
}
|
|
41216
|
+
else if (existing) {
|
|
41217
|
+
const disabled = this.resolveCollectionCreateDisabled(existing);
|
|
41218
|
+
if (typeof disabled === 'boolean' && existing.disabled !== disabled) {
|
|
41219
|
+
existing.disabled = disabled;
|
|
41220
|
+
this.cdr.markForCheck();
|
|
41221
|
+
}
|
|
41222
|
+
}
|
|
41223
|
+
return;
|
|
41224
|
+
}
|
|
41225
|
+
const toolbar = this.ensureToolbarConfigForRuntime();
|
|
41226
|
+
const nextActions = toolbar.actions || [];
|
|
41227
|
+
const nextCreateIndex = nextActions.findIndex((action) => this.isCreateToolbarAction(action));
|
|
41228
|
+
const nextExisting = nextCreateIndex >= 0
|
|
41229
|
+
? nextActions[nextCreateIndex]
|
|
41230
|
+
: existing;
|
|
41231
|
+
if (nextExisting && nextCreateIndex >= 0) {
|
|
41232
|
+
nextActions[nextCreateIndex] = {
|
|
41233
|
+
...materialized,
|
|
41234
|
+
...nextExisting,
|
|
41235
|
+
id: nextExisting.id || materialized.id,
|
|
41236
|
+
action: nextExisting.action || materialized.action,
|
|
41237
|
+
label: nextExisting.label || materialized.label,
|
|
41238
|
+
icon: nextExisting.icon || materialized.icon,
|
|
41239
|
+
tooltip: nextExisting.tooltip || materialized.tooltip,
|
|
41240
|
+
disabled: materialized.disabled,
|
|
41241
|
+
__praxisCollectionCreateAction: nextExisting.__praxisCollectionCreateAction || materialized.__praxisCollectionCreateAction,
|
|
41242
|
+
__praxisCrudOperation: materialized.__praxisCrudOperation,
|
|
41243
|
+
__praxisDiscoveredSurface: materialized.__praxisDiscoveredSurface,
|
|
41244
|
+
};
|
|
41245
|
+
}
|
|
41246
|
+
else {
|
|
41247
|
+
toolbar.actions = [...nextActions, materialized];
|
|
41248
|
+
}
|
|
41249
|
+
toolbar.visible = true;
|
|
41250
|
+
this.setShowToolbar(true);
|
|
41251
|
+
this.cdr.markForCheck();
|
|
41252
|
+
}
|
|
41253
|
+
ensureToolbarConfigForRuntime() {
|
|
41254
|
+
if (!this.config.toolbar) {
|
|
41255
|
+
this.config.toolbar = { visible: true, position: 'top' };
|
|
41256
|
+
}
|
|
41257
|
+
if (!this.config.toolbar.actions) {
|
|
41258
|
+
this.config.toolbar.actions = [];
|
|
41259
|
+
}
|
|
41260
|
+
return this.config.toolbar;
|
|
41261
|
+
}
|
|
41262
|
+
buildCollectionCreateToolbarAction(existing) {
|
|
41263
|
+
const resolved = this.resolveCollectionCreateRuntime();
|
|
41264
|
+
if (!resolved && !existing) {
|
|
41265
|
+
return null;
|
|
41266
|
+
}
|
|
41267
|
+
if (!resolved && existing && !existing.__praxisCollectionCreateAction) {
|
|
41268
|
+
return null;
|
|
41269
|
+
}
|
|
41270
|
+
const operation = resolved?.operation ?? null;
|
|
41271
|
+
const surface = resolved?.surface ?? null;
|
|
41272
|
+
const disabled = resolved
|
|
41273
|
+
? resolved.disabled
|
|
41274
|
+
: true;
|
|
41275
|
+
return {
|
|
41276
|
+
id: 'create',
|
|
41277
|
+
action: 'create',
|
|
41278
|
+
label: this.getCollectionCreateActionLabel(surface),
|
|
41279
|
+
icon: 'add',
|
|
41280
|
+
type: 'button',
|
|
41281
|
+
appearance: 'filled',
|
|
41282
|
+
color: disabled ? 'warn' : 'primary',
|
|
41283
|
+
position: 'start',
|
|
41284
|
+
tooltip: disabled
|
|
41285
|
+
? this.getCollectionCreateUnavailableTooltip(operation, surface)
|
|
41286
|
+
: this.getCollectionCreateActionTooltip(surface),
|
|
41287
|
+
disabled,
|
|
41288
|
+
__praxisCollectionCreateAction: true,
|
|
41289
|
+
__praxisCrudOperation: operation ?? undefined,
|
|
41290
|
+
__praxisDiscoveredSurface: surface ?? undefined,
|
|
41291
|
+
};
|
|
41292
|
+
}
|
|
41293
|
+
resolveCollectionCreateRuntime() {
|
|
41294
|
+
const resourcePath = this.resolveCollectionResourcePath();
|
|
41295
|
+
if (!resourcePath) {
|
|
41296
|
+
return null;
|
|
41297
|
+
}
|
|
41298
|
+
const capability = this.resolveCollectionCreateCapabilityOperation();
|
|
41299
|
+
const surface = this.resolveCollectionCreateSurface(capability);
|
|
41300
|
+
const hasCreateLink = this.hasCollectionCreateLink();
|
|
41301
|
+
if (!surface && !capability && !hasCreateLink) {
|
|
41302
|
+
return null;
|
|
41303
|
+
}
|
|
41304
|
+
if (capability?.supported === false) {
|
|
41305
|
+
return { operation: capability, surface, disabled: true };
|
|
41306
|
+
}
|
|
41307
|
+
const operationAvailability = capability?.availability;
|
|
41308
|
+
const surfaceAvailability = surface?.availability;
|
|
41309
|
+
return {
|
|
41310
|
+
operation: capability,
|
|
41311
|
+
surface,
|
|
41312
|
+
disabled: operationAvailability?.allowed === false ||
|
|
41313
|
+
surfaceAvailability?.allowed === false ||
|
|
41314
|
+
(!surface && !hasCreateLink && !capability),
|
|
41315
|
+
};
|
|
41316
|
+
}
|
|
41317
|
+
resolveCollectionResourcePath() {
|
|
41318
|
+
return String(this.resourcePath ||
|
|
41319
|
+
this.crudContext?.resourcePath ||
|
|
41320
|
+
this.config?.resourcePath ||
|
|
41321
|
+
'').trim();
|
|
41322
|
+
}
|
|
41323
|
+
hasCollectionCreateLink() {
|
|
41324
|
+
try {
|
|
41325
|
+
return !!this.resourceDiscovery.resolveLinkHref(this.collectionLinks || undefined, 'create', this.resolveCollectionDiscoveryOptions());
|
|
41326
|
+
}
|
|
41327
|
+
catch {
|
|
41328
|
+
return false;
|
|
41329
|
+
}
|
|
41330
|
+
}
|
|
41331
|
+
resolveCollectionCreateCapabilityOperation() {
|
|
41332
|
+
const snapshot = this.collectionCapabilities;
|
|
41333
|
+
if (!snapshot) {
|
|
41334
|
+
const digest = this.crudService.getResourceCapabilityDigest?.() ?? null;
|
|
41335
|
+
return digest?.canonicalOperations?.['create'] === true
|
|
41336
|
+
? this.createSyntheticCollectionCrudOperation('create')
|
|
41337
|
+
: null;
|
|
41338
|
+
}
|
|
41339
|
+
return (snapshot.operations?.create ||
|
|
41340
|
+
(snapshot.canonicalOperations?.['create'] === true
|
|
41341
|
+
? this.createSyntheticCollectionCrudOperation('create')
|
|
41342
|
+
: null));
|
|
41343
|
+
}
|
|
41344
|
+
createSyntheticCollectionCrudOperation(id) {
|
|
41345
|
+
return {
|
|
41346
|
+
id,
|
|
41347
|
+
supported: true,
|
|
41348
|
+
scope: 'COLLECTION',
|
|
41349
|
+
preferredRel: id,
|
|
41350
|
+
preferredMethod: id === 'create' ? 'POST' : undefined,
|
|
41351
|
+
};
|
|
41352
|
+
}
|
|
41353
|
+
resolveCollectionCreateSurface(operation) {
|
|
41354
|
+
const existingSurface = this.collectionCapabilities?.surfaces
|
|
41355
|
+
?.filter((surface) => this.isCollectionCreateSurface(surface))
|
|
41356
|
+
.sort((left, right) => (left.order ?? 0) - (right.order ?? 0))[0] ?? null;
|
|
41357
|
+
if (existingSurface) {
|
|
41358
|
+
return existingSurface;
|
|
41359
|
+
}
|
|
41360
|
+
const resourcePath = this.resolveCollectionResourcePath();
|
|
41361
|
+
if (!resourcePath || (!operation && !this.hasCollectionCreateLink())) {
|
|
41362
|
+
return null;
|
|
41363
|
+
}
|
|
41364
|
+
try {
|
|
41365
|
+
const resolved = this.crudOperationResolver.resolve({
|
|
41366
|
+
operation: 'create',
|
|
41367
|
+
resourcePath,
|
|
41368
|
+
resourceId: null,
|
|
41369
|
+
capabilities: this.collectionCapabilities,
|
|
41370
|
+
links: this.collectionLinks,
|
|
41371
|
+
endpointKey: this.crudContext?.endpointKey,
|
|
41372
|
+
apiUrlEntry: null,
|
|
41373
|
+
});
|
|
41374
|
+
const schemaInfo = this.crudService.getLastSchemaInfo?.() ?? {};
|
|
41375
|
+
const title = this.getCollectionCreateActionLabel(null);
|
|
41376
|
+
return {
|
|
41377
|
+
id: 'create',
|
|
41378
|
+
resourceKey: this.collectionCapabilities?.resourceKey || resourcePath,
|
|
41379
|
+
kind: 'FORM',
|
|
41380
|
+
scope: 'COLLECTION',
|
|
41381
|
+
title,
|
|
41382
|
+
description: this.getCollectionCreateActionTooltip(null),
|
|
41383
|
+
intent: 'create',
|
|
41384
|
+
operationId: 'resource.create',
|
|
41385
|
+
path: resolved.submitUrl || resourcePath,
|
|
41386
|
+
method: (resolved.submitMethod || 'post').toUpperCase(),
|
|
41387
|
+
schemaId: schemaInfo.schemaId || `${resourcePath}.create`,
|
|
41388
|
+
schemaUrl: resolved.schemaUrl || `${resourcePath}/schemas/create`,
|
|
41389
|
+
responseCardinality: 'OBJECT',
|
|
41390
|
+
availability: resolved.availability || operation?.availability || { allowed: true },
|
|
41391
|
+
order: 0,
|
|
41392
|
+
tags: ['crud', 'create'],
|
|
41393
|
+
};
|
|
41394
|
+
}
|
|
41395
|
+
catch {
|
|
41396
|
+
return null;
|
|
41397
|
+
}
|
|
41398
|
+
}
|
|
41399
|
+
isWritableCrudSurface(surface) {
|
|
41400
|
+
return surface.kind === 'FORM' || surface.kind === 'PARTIAL_FORM';
|
|
41401
|
+
}
|
|
41402
|
+
isCollectionCreateSurface(surface) {
|
|
41403
|
+
if (surface.scope !== 'COLLECTION' || !this.isWritableCrudSurface(surface)) {
|
|
41404
|
+
return false;
|
|
41405
|
+
}
|
|
41406
|
+
const operationId = String(surface.operationId || '').trim().toLowerCase();
|
|
41407
|
+
const intent = String(surface.intent || '').trim().toLowerCase();
|
|
41408
|
+
const id = String(surface.id || '').trim().toLowerCase();
|
|
41409
|
+
const tags = Array.isArray(surface.tags)
|
|
41410
|
+
? surface.tags.map((tag) => String(tag || '').trim().toLowerCase())
|
|
41411
|
+
: [];
|
|
41412
|
+
return (intent === 'create' ||
|
|
41413
|
+
operationId === 'create' ||
|
|
41414
|
+
operationId.endsWith('.create') ||
|
|
41415
|
+
id === 'create' ||
|
|
41416
|
+
tags.includes('create'));
|
|
41417
|
+
}
|
|
41418
|
+
getCollectionCreateActionLabel(surface) {
|
|
41419
|
+
return surface?.title || translateTableRuntimeText(this.i18n, 'table.chrome.collectionActions.create', 'Novo');
|
|
41420
|
+
}
|
|
41421
|
+
getCollectionCreateActionTooltip(surface) {
|
|
41422
|
+
return surface?.description || translateTableRuntimeText(this.i18n, 'table.chrome.collectionActions.createTooltip', 'Criar novo registro');
|
|
41423
|
+
}
|
|
41424
|
+
getCollectionCreateUnavailableTooltip(operation, surface) {
|
|
41425
|
+
const reason = operation?.availability?.reason ||
|
|
41426
|
+
surface?.availability?.reason ||
|
|
41427
|
+
null;
|
|
41428
|
+
return reason
|
|
41429
|
+
? translateResourceAvailabilityReason(this.i18n, reason)
|
|
41430
|
+
: translateTableRuntimeText(this.i18n, 'table.chrome.collectionActions.createUnavailable', 'Criação indisponível no contexto atual');
|
|
41431
|
+
}
|
|
41432
|
+
resolveCollectionCreateDisabled(action) {
|
|
41433
|
+
const runtime = this.resolveCollectionCreateRuntime();
|
|
41434
|
+
if (runtime) {
|
|
41435
|
+
return runtime.disabled;
|
|
41436
|
+
}
|
|
41437
|
+
if (action.__praxisCollectionCreateAction) {
|
|
41438
|
+
return true;
|
|
41439
|
+
}
|
|
41440
|
+
return null;
|
|
41441
|
+
}
|
|
41442
|
+
isCreateToolbarAction(action) {
|
|
41443
|
+
return String(action?.action || action?.id || '').trim().toLowerCase() === 'create';
|
|
41444
|
+
}
|
|
41108
41445
|
constructor(cdr, settingsPanel, crudService, tableDefaultsProvider, filterConfig, formattingService, pxDialog, snackBar, asyncConfigStorage, connectionStorage, hostRef, global, injector, componentKeys, loadingOrchestrator, globalActions, loadingRenderer, route, logger, analyticsStatsApi) {
|
|
41109
41446
|
this.cdr = cdr;
|
|
41110
41447
|
this.settingsPanel = settingsPanel;
|
|
@@ -41160,6 +41497,9 @@ class PraxisTable {
|
|
|
41160
41497
|
get resourceSurfaceOpenAdapter() {
|
|
41161
41498
|
return this._resourceSurfaceOpenAdapter ??= this.injector.get(ResourceSurfaceOpenAdapterService);
|
|
41162
41499
|
}
|
|
41500
|
+
get crudOperationResolver() {
|
|
41501
|
+
return this._crudOperationResolver ??= this.injector.get(CrudOperationResolutionService);
|
|
41502
|
+
}
|
|
41163
41503
|
ensureAiAdapterLoaded(openAfterLoad = false) {
|
|
41164
41504
|
if (openAfterLoad && !this.aiAdapter) {
|
|
41165
41505
|
this.aiAssistantOpenAfterAdapterLoad = true;
|
|
@@ -41167,7 +41507,7 @@ class PraxisTable {
|
|
|
41167
41507
|
if (this.aiAdapter || this.aiAdapterLoadStarted)
|
|
41168
41508
|
return;
|
|
41169
41509
|
this.aiAdapterLoadStarted = true;
|
|
41170
|
-
import('./praxisui-table-table-ai.adapter-
|
|
41510
|
+
import('./praxisui-table-table-ai.adapter-utRTtk0G.mjs')
|
|
41171
41511
|
.then(({ TableAiAdapter }) => {
|
|
41172
41512
|
if (!this.isAiAssistantEnabled()) {
|
|
41173
41513
|
this.aiAssistantOpenAfterAdapterLoad = false;
|
|
@@ -42574,13 +42914,7 @@ class PraxisTable {
|
|
|
42574
42914
|
this.resourcePath = saved.resourcePath;
|
|
42575
42915
|
try {
|
|
42576
42916
|
this.crudService.configure(this.resourcePath);
|
|
42577
|
-
|
|
42578
|
-
if ((this.config?.columns?.length ?? 0) > 0) {
|
|
42579
|
-
this.verifyServerSchemaVersion().catch(() => { });
|
|
42580
|
-
}
|
|
42581
|
-
else {
|
|
42582
|
-
this.loadSchema();
|
|
42583
|
-
}
|
|
42917
|
+
this.loadOrVerifyRemoteSchema();
|
|
42584
42918
|
}
|
|
42585
42919
|
catch { }
|
|
42586
42920
|
}
|
|
@@ -42687,13 +43021,7 @@ class PraxisTable {
|
|
|
42687
43021
|
this.clearLocalScaffolding();
|
|
42688
43022
|
this.saveConnection('input');
|
|
42689
43023
|
this.crudService.configure(this.resourcePath);
|
|
42690
|
-
|
|
42691
|
-
if ((this.config?.columns?.length ?? 0) > 0) {
|
|
42692
|
-
this.verifyServerSchemaVersion().catch(() => { });
|
|
42693
|
-
}
|
|
42694
|
-
else {
|
|
42695
|
-
this.loadSchema();
|
|
42696
|
-
}
|
|
43024
|
+
this.loadOrVerifyRemoteSchema();
|
|
42697
43025
|
configuredThisChange = true;
|
|
42698
43026
|
// Only fetch data if this is not the first change (handled by ngAfterContentInit)
|
|
42699
43027
|
// or if the component has already been initialized
|
|
@@ -46516,6 +46844,9 @@ class PraxisTable {
|
|
|
46516
46844
|
const action = String(event?.action || '').trim();
|
|
46517
46845
|
if (!action)
|
|
46518
46846
|
return;
|
|
46847
|
+
if (await this.tryHandleCollectionCreateToolbarAction(action, event.actionConfig)) {
|
|
46848
|
+
return;
|
|
46849
|
+
}
|
|
46519
46850
|
const bulk = this.config.actions?.bulk?.actions.find((a) => this.getActionId(a) === action);
|
|
46520
46851
|
if (bulk) {
|
|
46521
46852
|
const rows = this.selection.selected.slice();
|
|
@@ -46687,6 +47018,76 @@ class PraxisTable {
|
|
|
46687
47018
|
label: toolbarActionConfig?.label || action,
|
|
46688
47019
|
});
|
|
46689
47020
|
}
|
|
47021
|
+
async tryHandleCollectionCreateToolbarAction(action, actionConfig) {
|
|
47022
|
+
if (String(action || '').trim().toLowerCase() !== 'create') {
|
|
47023
|
+
return false;
|
|
47024
|
+
}
|
|
47025
|
+
const configuredAction = actionConfig ||
|
|
47026
|
+
(this.config?.toolbar?.actions || []).find((candidate) => this.isCreateToolbarAction(candidate));
|
|
47027
|
+
if (!configuredAction?.__praxisCollectionCreateAction) {
|
|
47028
|
+
return false;
|
|
47029
|
+
}
|
|
47030
|
+
const surface = configuredAction.__praxisDiscoveredSurface ||
|
|
47031
|
+
this.resolveCollectionCreateSurface(configuredAction.__praxisCrudOperation ?? null);
|
|
47032
|
+
const payload = {
|
|
47033
|
+
action,
|
|
47034
|
+
actionConfig: this.cloneForEmit({
|
|
47035
|
+
...configuredAction,
|
|
47036
|
+
__praxisCollectionCreateAction: true,
|
|
47037
|
+
}),
|
|
47038
|
+
};
|
|
47039
|
+
if (!surface || configuredAction.disabled) {
|
|
47040
|
+
this.emitEventWithActionFeedback(this.toolbarAction, payload, {
|
|
47041
|
+
actionId: action,
|
|
47042
|
+
label: configuredAction.label || action,
|
|
47043
|
+
});
|
|
47044
|
+
return true;
|
|
47045
|
+
}
|
|
47046
|
+
try {
|
|
47047
|
+
const surfacePayload = this.resourceSurfaceOpenAdapter.toPayload(surface, {
|
|
47048
|
+
resourcePath: this.resolveCollectionResourcePath(),
|
|
47049
|
+
endpointKey: this.crudContext?.endpointKey,
|
|
47050
|
+
title: surface.title || configuredAction.label,
|
|
47051
|
+
subtitle: surface.description || configuredAction.tooltip || undefined,
|
|
47052
|
+
presentation: 'drawer',
|
|
47053
|
+
queryContext: this.queryContext ?? undefined,
|
|
47054
|
+
});
|
|
47055
|
+
const result = await this.globalActions.execute('surface.open', surfacePayload, {
|
|
47056
|
+
sourceId: this.tableId || this.componentInstanceId || 'praxis-table',
|
|
47057
|
+
output: 'toolbarAction',
|
|
47058
|
+
payload,
|
|
47059
|
+
runtime: {
|
|
47060
|
+
widgetContext: {
|
|
47061
|
+
collection: {
|
|
47062
|
+
links: this.collectionLinks,
|
|
47063
|
+
capabilities: this.collectionCapabilities,
|
|
47064
|
+
resourcePath: this.resolveCollectionResourcePath(),
|
|
47065
|
+
},
|
|
47066
|
+
},
|
|
47067
|
+
},
|
|
47068
|
+
meta: {
|
|
47069
|
+
actionId: 'create',
|
|
47070
|
+
actionConfig: configuredAction,
|
|
47071
|
+
surfaceId: surface.id,
|
|
47072
|
+
},
|
|
47073
|
+
});
|
|
47074
|
+
if (result.success) {
|
|
47075
|
+
return true;
|
|
47076
|
+
}
|
|
47077
|
+
this.warnLog('[PraxisTable] Falha ao abrir create de coleção via surface.open', { surfaceId: surface.id, error: result.error }, { actionId: 'create' });
|
|
47078
|
+
}
|
|
47079
|
+
catch (error) {
|
|
47080
|
+
this.warnLog('[PraxisTable] Falha ao preparar create de coleção via surface.open', { surfaceId: surface.id, error }, { actionId: 'create' });
|
|
47081
|
+
}
|
|
47082
|
+
this.emitEventWithActionFeedback(this.toolbarAction, {
|
|
47083
|
+
...payload,
|
|
47084
|
+
surface,
|
|
47085
|
+
}, {
|
|
47086
|
+
actionId: action,
|
|
47087
|
+
label: configuredAction.label || action,
|
|
47088
|
+
});
|
|
47089
|
+
return true;
|
|
47090
|
+
}
|
|
46690
47091
|
resolveBulkExportFormat(action, actionConfig) {
|
|
46691
47092
|
if (this.config?.export?.enabled !== true) {
|
|
46692
47093
|
return null;
|
|
@@ -49164,8 +49565,19 @@ class PraxisTable {
|
|
|
49164
49565
|
this.emitSchemaStatus({ outdated: false, serverHash: this.runtimeSchemaMeta.serverHash, lastVerifiedAt: this.runtimeSchemaMeta.lastVerifiedAt, resourcePath: this.resourcePath }, 'verification-304');
|
|
49165
49566
|
return;
|
|
49166
49567
|
}
|
|
49167
|
-
// status === 200: server hash changed or first verification without hash. Do not
|
|
49568
|
+
// status === 200: server hash changed or first verification without hash. Do not
|
|
49569
|
+
// replace the column list, but keep existing columns enriched with safe schema
|
|
49570
|
+
// presentation metadata such as semantic renderers, masks, and value mappings.
|
|
49168
49571
|
const newHash = res.schemaHash;
|
|
49572
|
+
try {
|
|
49573
|
+
const fields = this.schemaNormalizer.normalizeSchema(res.schema);
|
|
49574
|
+
this.setSchemaFieldsSnapshot(fields);
|
|
49575
|
+
this.applySchemaFieldPresentationsToExistingColumns(fields);
|
|
49576
|
+
this.loadFilterSchemaSnapshot();
|
|
49577
|
+
this.setupColumns();
|
|
49578
|
+
this.configChange.emit(this.config);
|
|
49579
|
+
}
|
|
49580
|
+
catch { }
|
|
49169
49581
|
this.runtimeSchemaMeta = {
|
|
49170
49582
|
...this.runtimeSchemaMeta,
|
|
49171
49583
|
serverHash: newHash,
|
|
@@ -49239,6 +49651,9 @@ class PraxisTable {
|
|
|
49239
49651
|
.filter((f) => !f.tableHidden && !f.hidden)
|
|
49240
49652
|
.map((f) => this.convertFieldToColumn(f));
|
|
49241
49653
|
}
|
|
49654
|
+
else {
|
|
49655
|
+
this.applySchemaFieldPresentationsToExistingColumns(fields);
|
|
49656
|
+
}
|
|
49242
49657
|
this.emitWidgetInputPatch({
|
|
49243
49658
|
config: this.config,
|
|
49244
49659
|
resourcePath: this.resourcePath,
|
|
@@ -49292,6 +49707,13 @@ class PraxisTable {
|
|
|
49292
49707
|
},
|
|
49293
49708
|
});
|
|
49294
49709
|
}
|
|
49710
|
+
loadOrVerifyRemoteSchema() {
|
|
49711
|
+
if ((this.config?.columns?.length ?? 0) === 0 || this.schemaFieldsSnapshot.length === 0) {
|
|
49712
|
+
this.loadSchema();
|
|
49713
|
+
return;
|
|
49714
|
+
}
|
|
49715
|
+
this.verifyServerSchemaVersion().catch(() => { });
|
|
49716
|
+
}
|
|
49295
49717
|
loadFilterSchemaSnapshot() {
|
|
49296
49718
|
if (!this.resourcePath) {
|
|
49297
49719
|
this.filterSchemaFieldsSnapshot = [];
|
|
@@ -49332,6 +49754,26 @@ class PraxisTable {
|
|
|
49332
49754
|
catch { }
|
|
49333
49755
|
return col;
|
|
49334
49756
|
}
|
|
49757
|
+
applySchemaFieldPresentationsToExistingColumns(fields) {
|
|
49758
|
+
if (!Array.isArray(fields) || !fields.length)
|
|
49759
|
+
return;
|
|
49760
|
+
const columns = this.config?.columns;
|
|
49761
|
+
if (!Array.isArray(columns) || !columns.length)
|
|
49762
|
+
return;
|
|
49763
|
+
const fieldsByName = new Map();
|
|
49764
|
+
for (const field of fields) {
|
|
49765
|
+
const name = typeof field?.name === 'string' ? field.name.trim() : '';
|
|
49766
|
+
if (name)
|
|
49767
|
+
fieldsByName.set(name, field);
|
|
49768
|
+
}
|
|
49769
|
+
for (const column of columns) {
|
|
49770
|
+
const fieldName = typeof column?.field === 'string' ? column.field.trim() : '';
|
|
49771
|
+
const field = fieldsByName.get(fieldName);
|
|
49772
|
+
if (!field)
|
|
49773
|
+
continue;
|
|
49774
|
+
this.applySchemaFieldPresentation(field, column);
|
|
49775
|
+
}
|
|
49776
|
+
}
|
|
49335
49777
|
applySchemaFieldPresentation(field, col) {
|
|
49336
49778
|
if (!field || !col)
|
|
49337
49779
|
return;
|
|
@@ -49344,9 +49786,6 @@ class PraxisTable {
|
|
|
49344
49786
|
col.valueMapping = valueMapping;
|
|
49345
49787
|
}
|
|
49346
49788
|
const presentation = field.presentation;
|
|
49347
|
-
if (presentation && typeof presentation === 'object') {
|
|
49348
|
-
this.applySchemaFieldSemanticPresentation(field, col, presentation);
|
|
49349
|
-
}
|
|
49350
49789
|
if (presentation?.presenter === 'microVisualization' &&
|
|
49351
49790
|
isPraxisPresentationVisualizationTableSafe(presentation?.visualization)) {
|
|
49352
49791
|
col.renderer = {
|
|
@@ -49357,6 +49796,7 @@ class PraxisTable {
|
|
|
49357
49796
|
},
|
|
49358
49797
|
};
|
|
49359
49798
|
}
|
|
49799
|
+
this.applySchemaSemanticCellPresentation(field, col, presentation);
|
|
49360
49800
|
if (numericFormat === 'currency' || controlType === 'currency' || col.type === 'currency') {
|
|
49361
49801
|
col.type = 'currency';
|
|
49362
49802
|
col.format = this.resolveSchemaCurrencyFormat(field);
|
|
@@ -49391,20 +49831,29 @@ class PraxisTable {
|
|
|
49391
49831
|
col.format = textMaskFormat;
|
|
49392
49832
|
}
|
|
49393
49833
|
}
|
|
49394
|
-
|
|
49834
|
+
applySchemaSemanticCellPresentation(field, col, presentation) {
|
|
49835
|
+
if (!presentation || typeof presentation !== 'object')
|
|
49836
|
+
return;
|
|
49395
49837
|
if (col.renderer?.type)
|
|
49396
49838
|
return;
|
|
49397
|
-
const presenter = presentation.presenter ?? presentation.variant;
|
|
49839
|
+
const presenter = this.normalizePresentationToken(presentation.presenter ?? presentation.variant);
|
|
49840
|
+
const textField = field.name;
|
|
49841
|
+
const color = this.resolveSemanticPresentationColor(presentation.tone);
|
|
49842
|
+
const variant = this.resolveSemanticPresentationVariant(presentation.appearance);
|
|
49843
|
+
const icon = this.firstNonEmptyString(presentation.icon);
|
|
49844
|
+
const tooltipText = this.firstNonEmptyString(presentation.tooltip);
|
|
49845
|
+
const tooltip = tooltipText ? { text: tooltipText } : undefined;
|
|
49846
|
+
const fixedText = this.firstNonEmptyString(presentation.label);
|
|
49398
49847
|
if (presenter === 'chip') {
|
|
49399
49848
|
col.renderer = {
|
|
49400
49849
|
type: 'chip',
|
|
49401
49850
|
chip: {
|
|
49402
|
-
text:
|
|
49403
|
-
textField:
|
|
49404
|
-
color
|
|
49405
|
-
icon
|
|
49406
|
-
variant
|
|
49407
|
-
tooltip
|
|
49851
|
+
text: fixedText,
|
|
49852
|
+
textField: fixedText ? undefined : textField,
|
|
49853
|
+
color,
|
|
49854
|
+
icon,
|
|
49855
|
+
variant,
|
|
49856
|
+
tooltip,
|
|
49408
49857
|
},
|
|
49409
49858
|
};
|
|
49410
49859
|
return;
|
|
@@ -49413,35 +49862,51 @@ class PraxisTable {
|
|
|
49413
49862
|
col.renderer = {
|
|
49414
49863
|
type: 'badge',
|
|
49415
49864
|
badge: {
|
|
49416
|
-
text:
|
|
49417
|
-
textField:
|
|
49418
|
-
color
|
|
49419
|
-
icon
|
|
49420
|
-
variant
|
|
49421
|
-
tooltip
|
|
49865
|
+
text: fixedText,
|
|
49866
|
+
textField: fixedText ? undefined : textField,
|
|
49867
|
+
color,
|
|
49868
|
+
icon,
|
|
49869
|
+
variant,
|
|
49870
|
+
tooltip,
|
|
49422
49871
|
},
|
|
49423
49872
|
};
|
|
49424
49873
|
return;
|
|
49425
49874
|
}
|
|
49426
|
-
if (presenter === '
|
|
49427
|
-
const
|
|
49875
|
+
if (presenter === 'iconvalue') {
|
|
49876
|
+
const rendererIcon = icon || this.firstNonEmptyString(field.icon);
|
|
49877
|
+
const affixes = this.resolveSemanticPresentationAffixes(presentation);
|
|
49878
|
+
const hasAffixes = !!(affixes.prefix || affixes.suffix);
|
|
49879
|
+
if (!rendererIcon && !hasAffixes)
|
|
49880
|
+
return;
|
|
49881
|
+
if (affixes.prefix || affixes.suffix || tooltipText) {
|
|
49882
|
+
col.renderer = {
|
|
49883
|
+
type: 'icon',
|
|
49884
|
+
icon: {
|
|
49885
|
+
...(!hasAffixes && rendererIcon ? { name: rendererIcon } : {}),
|
|
49886
|
+
textField,
|
|
49887
|
+
...(tooltipText ? { ariaLabel: tooltipText } : {}),
|
|
49888
|
+
...affixes,
|
|
49889
|
+
},
|
|
49890
|
+
};
|
|
49891
|
+
return;
|
|
49892
|
+
}
|
|
49893
|
+
if (!rendererIcon)
|
|
49894
|
+
return;
|
|
49428
49895
|
col.renderer = {
|
|
49429
49896
|
type: 'compose',
|
|
49430
49897
|
compose: {
|
|
49431
49898
|
items: [
|
|
49432
|
-
|
|
49433
|
-
|
|
49434
|
-
|
|
49435
|
-
|
|
49436
|
-
|
|
49437
|
-
|
|
49438
|
-
|
|
49439
|
-
|
|
49440
|
-
}]
|
|
49441
|
-
: []),
|
|
49899
|
+
{
|
|
49900
|
+
type: 'icon',
|
|
49901
|
+
icon: {
|
|
49902
|
+
name: rendererIcon,
|
|
49903
|
+
...(color ? { color } : {}),
|
|
49904
|
+
...(field.label ? { ariaLabel: field.label } : {}),
|
|
49905
|
+
},
|
|
49906
|
+
},
|
|
49442
49907
|
{
|
|
49443
49908
|
type: 'value',
|
|
49444
|
-
field:
|
|
49909
|
+
field: textField,
|
|
49445
49910
|
},
|
|
49446
49911
|
],
|
|
49447
49912
|
layout: {
|
|
@@ -49453,31 +49918,32 @@ class PraxisTable {
|
|
|
49453
49918
|
};
|
|
49454
49919
|
}
|
|
49455
49920
|
}
|
|
49456
|
-
|
|
49457
|
-
|
|
49458
|
-
|
|
49459
|
-
|
|
49921
|
+
resolveSemanticPresentationColor(tone) {
|
|
49922
|
+
const normalized = this.normalizePresentationToken(tone);
|
|
49923
|
+
if (normalized === 'neutral')
|
|
49924
|
+
return 'basic';
|
|
49925
|
+
if (!normalized)
|
|
49926
|
+
return undefined;
|
|
49927
|
+
if (normalized === 'danger')
|
|
49928
|
+
return 'warn';
|
|
49929
|
+
if (normalized === 'warning')
|
|
49930
|
+
return 'warn';
|
|
49931
|
+
return normalized;
|
|
49460
49932
|
}
|
|
49461
|
-
|
|
49462
|
-
|
|
49463
|
-
|
|
49464
|
-
|
|
49465
|
-
case 'warning':
|
|
49466
|
-
return 'warn';
|
|
49467
|
-
case 'danger':
|
|
49468
|
-
case 'info':
|
|
49469
|
-
case 'success':
|
|
49470
|
-
return tone;
|
|
49471
|
-
default:
|
|
49472
|
-
return undefined;
|
|
49933
|
+
resolveSemanticPresentationVariant(appearance) {
|
|
49934
|
+
const normalized = this.normalizePresentationToken(appearance);
|
|
49935
|
+
if (normalized === 'filled' || normalized === 'outlined' || normalized === 'soft' || normalized === 'plain') {
|
|
49936
|
+
return normalized;
|
|
49473
49937
|
}
|
|
49938
|
+
return undefined;
|
|
49474
49939
|
}
|
|
49475
|
-
|
|
49476
|
-
const
|
|
49477
|
-
|
|
49478
|
-
|
|
49479
|
-
|
|
49480
|
-
|
|
49940
|
+
resolveSemanticPresentationAffixes(presentation) {
|
|
49941
|
+
const prefix = this.firstNonEmptyString(presentation.prefix);
|
|
49942
|
+
const suffix = this.firstNonEmptyString(presentation.suffix);
|
|
49943
|
+
return {
|
|
49944
|
+
...(prefix ? { prefix } : {}),
|
|
49945
|
+
...(suffix ? { suffix } : {}),
|
|
49946
|
+
};
|
|
49481
49947
|
}
|
|
49482
49948
|
resolveSchemaCurrencyFormat(field) {
|
|
49483
49949
|
const currency = this.firstNonEmptyString(field.currency, field.extraProperties?.currency) || 'BRL';
|
|
@@ -50346,6 +50812,7 @@ class PraxisTable {
|
|
|
50346
50812
|
if (!this.isRemoteMode()) {
|
|
50347
50813
|
this.clearRowDiscoveryRuntime();
|
|
50348
50814
|
this.lastRowDiscoveryScopeKey = null;
|
|
50815
|
+
this.updateCollectionLinks(null);
|
|
50349
50816
|
this.collectionLinksChange.emit(null);
|
|
50350
50817
|
return;
|
|
50351
50818
|
}
|
|
@@ -50409,8 +50876,10 @@ class PraxisTable {
|
|
|
50409
50876
|
const page = (response?.data || {});
|
|
50410
50877
|
const content = Array.isArray(page.content) ? page.content : [];
|
|
50411
50878
|
const total = page.totalElements ?? content.length ?? 0;
|
|
50879
|
+
const links = response?._links ?? null;
|
|
50412
50880
|
this.dataError = false;
|
|
50413
|
-
this.
|
|
50881
|
+
this.updateCollectionLinks(links);
|
|
50882
|
+
this.collectionLinksChange.emit(links);
|
|
50414
50883
|
// Keep dataRefresh collapse in the fetch pipeline to avoid duplicate policy events.
|
|
50415
50884
|
this.applyExpansionCollapsePolicy('dataRefresh');
|
|
50416
50885
|
this.dataSubject.next(content);
|
|
@@ -50444,6 +50913,7 @@ class PraxisTable {
|
|
|
50444
50913
|
}
|
|
50445
50914
|
this.errorLog('[PraxisTable] Data load error', err);
|
|
50446
50915
|
this.dataError = true;
|
|
50916
|
+
this.updateCollectionLinks(null);
|
|
50447
50917
|
this.collectionLinksChange.emit(null);
|
|
50448
50918
|
this.errorMessage =
|
|
50449
50919
|
'Não foi possível carregar os dados. Revise a fonte de dados e tente novamente.';
|
|
@@ -52106,43 +52576,78 @@ class PraxisTable {
|
|
|
52106
52576
|
return null;
|
|
52107
52577
|
const configured = cfg.ariaLabel;
|
|
52108
52578
|
const evaluated = this.evaluateValueExpr(configured, row, 'string');
|
|
52109
|
-
|
|
52110
|
-
|
|
52111
|
-
|
|
52112
|
-
|
|
52113
|
-
|
|
52579
|
+
const configuredLabel = evaluated != null && evaluated !== ''
|
|
52580
|
+
? String(evaluated)
|
|
52581
|
+
: typeof configured === 'string' && configured.trim() ? configured.trim() : null;
|
|
52582
|
+
const text = this.getIconText(row, column);
|
|
52583
|
+
if (configuredLabel && text && configuredLabel.includes(text))
|
|
52584
|
+
return configuredLabel;
|
|
52585
|
+
if (configuredLabel && text && configuredLabel !== text)
|
|
52586
|
+
return `${configuredLabel}: ${text}`;
|
|
52587
|
+
if (configuredLabel)
|
|
52588
|
+
return configuredLabel;
|
|
52589
|
+
return text;
|
|
52114
52590
|
}
|
|
52115
52591
|
getIconText(row, column) {
|
|
52116
52592
|
const cfg = this.getEffectiveRenderer(row, column)?.icon;
|
|
52117
52593
|
if (!cfg)
|
|
52118
52594
|
return null;
|
|
52119
|
-
const text =
|
|
52120
|
-
|
|
52121
|
-
|
|
52122
|
-
|
|
52595
|
+
const text = this.getIconRawText(row, column);
|
|
52596
|
+
if (text == null)
|
|
52597
|
+
return null;
|
|
52598
|
+
const normalizedText = String(text);
|
|
52599
|
+
const prefix = this.firstNonEmptyString(cfg.prefix);
|
|
52600
|
+
const suffix = this.firstNonEmptyString(cfg.suffix);
|
|
52601
|
+
return `${prefix || ''}${normalizedText}${suffix || ''}`;
|
|
52123
52602
|
}
|
|
52124
52603
|
getIconRichContentNodes(row, column) {
|
|
52125
52604
|
const icon = this.getIconName(row, column);
|
|
52126
|
-
|
|
52605
|
+
const text = this.getIconRawText(row, column);
|
|
52606
|
+
if (!icon && text == null)
|
|
52127
52607
|
return [];
|
|
52128
|
-
const nodes = [
|
|
52129
|
-
|
|
52608
|
+
const nodes = [];
|
|
52609
|
+
if (icon) {
|
|
52610
|
+
nodes.push({
|
|
52130
52611
|
type: 'icon',
|
|
52131
52612
|
icon,
|
|
52132
52613
|
ariaLabel: this.getIconAriaLabel(row, column) || icon,
|
|
52133
52614
|
className: 'pfx-icon-renderer__icon',
|
|
52134
|
-
}
|
|
52135
|
-
|
|
52136
|
-
const
|
|
52137
|
-
|
|
52615
|
+
});
|
|
52616
|
+
}
|
|
52617
|
+
const cfg = this.getEffectiveRenderer(row, column)?.icon;
|
|
52618
|
+
const prefix = this.firstNonEmptyString(cfg?.prefix);
|
|
52619
|
+
const suffix = this.firstNonEmptyString(cfg?.suffix);
|
|
52620
|
+
if (prefix) {
|
|
52138
52621
|
nodes.push({
|
|
52139
52622
|
type: 'text',
|
|
52140
|
-
text,
|
|
52623
|
+
text: prefix,
|
|
52624
|
+
className: 'pfx-icon-renderer__prefix',
|
|
52625
|
+
});
|
|
52626
|
+
}
|
|
52627
|
+
if (text != null && String(text) !== '') {
|
|
52628
|
+
nodes.push({
|
|
52629
|
+
type: 'text',
|
|
52630
|
+
text: String(text),
|
|
52141
52631
|
className: 'pfx-icon-renderer__label',
|
|
52142
52632
|
});
|
|
52143
52633
|
}
|
|
52634
|
+
if (suffix) {
|
|
52635
|
+
nodes.push({
|
|
52636
|
+
type: 'text',
|
|
52637
|
+
text: suffix,
|
|
52638
|
+
className: 'pfx-icon-renderer__suffix',
|
|
52639
|
+
});
|
|
52640
|
+
}
|
|
52144
52641
|
return nodes;
|
|
52145
52642
|
}
|
|
52643
|
+
getIconRawText(row, column) {
|
|
52644
|
+
const cfg = this.getEffectiveRenderer(row, column)?.icon;
|
|
52645
|
+
if (!cfg)
|
|
52646
|
+
return null;
|
|
52647
|
+
return Object.prototype.hasOwnProperty.call(cfg, 'text')
|
|
52648
|
+
? cfg.text
|
|
52649
|
+
: cfg.textField ? this.getRendererTextFieldValue(row, column, cfg.textField) : null;
|
|
52650
|
+
}
|
|
52146
52651
|
/**
|
|
52147
52652
|
* Lightweight, controlled evaluator for string/number expressions using row context.
|
|
52148
52653
|
* Accepts values like '= row.status === "OK" ? "primary" : "warn"'.
|
|
@@ -55267,7 +55772,7 @@ class PraxisTable {
|
|
|
55267
55772
|
TableDefaultsProvider,
|
|
55268
55773
|
FilterConfigService,
|
|
55269
55774
|
DataFormattingService
|
|
55270
|
-
], queries: [{ propertyName: "toolbar", first: true, predicate: PraxisTableToolbar, descendants: true }, { propertyName: "projectedFilter", first: true, predicate: ["projectedFilter"], descendants: true }], viewQueries: [{ propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "sort", first: true, predicate: MatSort, descendants: true }, { propertyName: "materialTable", first: true, predicate: MatTable, descendants: true }, { propertyName: "internalFilter", first: true, predicate: PraxisFilter, descendants: true }], usesOnChanges: true, ngImport: i0, template: "@if (shouldShowEmptyState()) {\n <praxis-empty-state-card\n icon=\"link\"\n [title]=\"'Escolha o recurso da tabela'\"\n [description]=\"'Selecione um recurso da API para carregar colunas, registros e a\u00E7\u00F5es da tabela automaticamente.'\"\n [primaryAction]=\"{ label: 'Selecionar recurso', icon: 'bolt', action: openQuickConnect.bind(this) }\"\n ></praxis-empty-state-card>\n}\n\n<!-- Error State with Quick Connect CTA -->\n@if (isRemoteMode() && (schemaError || dataError)) {\n <div class=\"ptable-error\" role=\"alert\" aria-live=\"assertive\">\n <mat-icon color=\"warn\" aria-hidden=\"true\">error</mat-icon>\n <div class=\"ptable-error__content\">\n <praxis-rich-content\n rootClassName=\"ptable-error__title\"\n [nodes]=\"getTableChromeTextRichContentNodes('Erro', 'ptable-error__title-text')\"\n ></praxis-rich-content>\n <praxis-rich-content\n rootClassName=\"ptable-error__message\"\n [nodes]=\"getTableChromeTextRichContentNodes(errorMessage || 'Ocorreu um erro ao carregar a tabela.', 'ptable-error__message-text')\"\n ></praxis-rich-content>\n </div>\n <button mat-flat-button color=\"primary\" (click)=\"openQuickConnect()\">\n <mat-icon>bolt</mat-icon>\n <praxis-rich-content\n rootClassName=\"ptable-error__action-label\"\n [nodes]=\"getTableChromeTextRichContentNodes('Selecionar recurso', 'ptable-error__action-label-text')\"\n ></praxis-rich-content>\n </button>\n @if (enableCustomization) {\n <button\n mat-icon-button\n color=\"primary\"\n data-role=\"table-settings\"\n data-testid=\"table-settings-trigger\"\n (click)=\"openTableSettings()\"\n [attr.aria-label]=\"getTableSettingsLabel()\"\n [matTooltip]=\"getTableSettingsLabel()\"\n matTooltipPosition=\"below\"\n >\n <mat-icon>settings</mat-icon>\n </button>\n }\n @if (!schemaError) {\n <button mat-stroked-button (click)=\"retryData()\">\n <praxis-rich-content\n rootClassName=\"ptable-error__action-label\"\n [nodes]=\"getTableChromeTextRichContentNodes('Tentar novamente', 'ptable-error__action-label-text')\"\n ></praxis-rich-content>\n </button>\n }\n @if (schemaError) {\n <button mat-stroked-button (click)=\"reloadSchema()\">\n <praxis-rich-content\n rootClassName=\"ptable-error__action-label\"\n [nodes]=\"getTableChromeTextRichContentNodes('Recarregar colunas', 'ptable-error__action-label-text')\"\n ></praxis-rich-content>\n </button>\n }\n </div>\n}\n\n<!-- Inline banner for schema change (only in edit mode) -->\n@if (shouldShowOutdatedInline()) {\n <div class=\"ptable-info-banner\" role=\"status\" aria-live=\"polite\">\n <praxis-rich-content\n rootClassName=\"text\"\n [nodes]=\"getTableChromeTextRichContentNodes('O schema do servidor mudou. Reconciliar agora?', 'ptable-info-banner__text')\"\n ></praxis-rich-content>\n <div class=\"actions\">\n <button mat-stroked-button color=\"primary\" (click)=\"onReconcileRequested()\">\n <mat-icon>sync</mat-icon>\n <praxis-rich-content\n rootClassName=\"ptable-info-banner__action-label\"\n [nodes]=\"getTableChromeTextRichContentNodes('Reconciliar', 'ptable-info-banner__action-label-text')\"\n ></praxis-rich-content>\n </button>\n <button mat-button (click)=\"onSnoozeOutdated()\">\n <praxis-rich-content\n rootClassName=\"ptable-info-banner__action-label\"\n [nodes]=\"getTableChromeTextRichContentNodes('Lembrar depois', 'ptable-info-banner__action-label-text')\"\n ></praxis-rich-content>\n </button>\n <button mat-button (click)=\"onIgnoreOutdated()\">\n <praxis-rich-content\n rootClassName=\"ptable-info-banner__action-label\"\n [nodes]=\"getTableChromeTextRichContentNodes('Ignorar', 'ptable-info-banner__action-label-text')\"\n ></praxis-rich-content>\n </button>\n </div>\n </div>\n}\n\n@if (isAiAssistantEnabled() && aiAssistantOpen && aiAssistantViewState) {\n <praxis-ai-assistant-shell\n [labels]=\"aiAssistantLabels\"\n [mode]=\"aiAssistantViewState.mode\"\n [state]=\"aiAssistantViewState.state\"\n [contextItems]=\"aiAssistantViewState.contextItems\"\n [attachments]=\"aiAssistantViewState.attachments\"\n [messages]=\"aiAssistantViewState.messages\"\n [quickReplies]=\"aiAssistantViewState.quickReplies\"\n [recommendedIntents]=\"getAiAssistantRecommendedIntents()\"\n [prompt]=\"aiAssistantPrompt\"\n [statusText]=\"aiAssistantViewState.statusText\"\n [errorText]=\"aiAssistantViewState.errorText\"\n [busy]=\"aiAssistantViewState.state === 'processing' || aiAssistantViewState.state === 'applying'\"\n [canApply]=\"aiAssistantViewState.canApply\"\n [showAttachAction]=\"false\"\n [enablePastedAttachments]=\"false\"\n [voiceInputMode]=\"aiAssistantVoiceInputMode\"\n [voiceLanguage]=\"aiAssistantVoiceLanguage\"\n [layout]=\"aiAssistantLayout\"\n testIdPrefix=\"table-ai-assistant\"\n panelTestId=\"table-ai-assistant-panel\"\n submitTestId=\"table-ai-assistant-submit\"\n applyTestId=\"table-ai-assistant-apply\"\n (promptChange)=\"onAiAssistantPromptChange($event)\"\n (submitPrompt)=\"onAiAssistantSubmit($event)\"\n (apply)=\"onAiAssistantApply()\"\n (retryTurn)=\"onAiAssistantRetry()\"\n (cancelTurn)=\"onAiAssistantCancel()\"\n (quickReply)=\"onAiAssistantQuickReply($event)\"\n (recommendedIntent)=\"onAiAssistantRecommendedIntent($event)\"\n (editMessage)=\"onAiAssistantEditMessage($event)\"\n (resendMessage)=\"onAiAssistantResendMessage($event)\"\n (layoutChange)=\"onAiAssistantLayoutChange($event)\"\n (close)=\"closeAiAssistant()\"\n ></praxis-ai-assistant-shell>\n}\n\n@if (shouldRenderDataSurface() && !schemaError && !dataError && toolbarV2) {\n <div class=\"praxis-table-header\" [class.edit-mode]=\"enableCustomization\" [class.stacked]=\"hasTopToolbarStack()\">\n @if (showToolbar && shouldShowToolbarTopPlacement()) {\n <praxis-table-toolbar\n class=\"praxis-toolbar-stack-top\"\n [config]=\"config\"\n [backgroundColor]=\"getToolbarActionsBackgroundColor()\"\n [style.--pfx-filter-h]=\"getToolbarLayoutHeightHostStyle()\"\n [evaluationContext]=\"getToolbarEvaluationContext()\"\n [columnVisibilityController]=\"toolbarColumnVisibilityController\"\n [showActionsGroup]=\"shouldShowToolbarActionsTop()\"\n [showMobileActions]=\"shouldShowToolbarActionsTop()\"\n [exportBusy]=\"exportBusy\"\n (toolbarAction)=\"onToolbarAction($event)\"\n (exportAction)=\"onExportAction($event)\"\n >\n @if (shouldRenderAdvancedFilter()) {\n <praxis-filter\n advancedFilter\n [resourcePath]=\"getAdvancedFilterResourcePath()\"\n [filterId]=\"tableId\"\n [formId]=\"tableId\"\n [persistenceKey]=\"getAdvancedFilterPersistenceKey()\"\n [fieldMetadata]=\"getAdvancedFilterFieldMetadata()\"\n [enableCustomization]=\"enableCustomization\"\n [value]=\"advancedFilterValue\"\n\n [alwaysVisibleFields]=\"getAdvancedFilterAlwaysVisibleFields()\"\n [alwaysVisibleFieldMetadataOverrides]=\"getAdvancedFilterAlwaysVisibleFieldMetadataOverrides()\"\n [selectedFieldIds]=\"config.behavior?.filtering?.advancedFilters?.settings?.selectedFieldIds ?? []\"\n [allowSaveTags]=\"config.behavior?.filtering?.advancedFilters?.settings?.allowSaveTags\"\n [changeDebounceMs]=\"config.behavior?.filtering?.advancedFilters?.settings?.changeDebounceMs ?? 300\"\n [i18n]=\"getFilterI18n()\"\n [mode]=\"'filter'\"\n [showFilterSettings]=\"enableCustomization\"\n (change)=\"onAdvancedFilterChange($event)\"\n (requestSearch)=\"onAdvancedFilterSubmit($event)\"\n (clear)=\"onAdvancedFilterClear()\"\n ></praxis-filter>\n }\n <ng-content select=\"[advancedFilter]\" />\n <ng-content select=\"[toolbar]\" />\n\n <!-- AI Assistant in Toolbar -->\n @if (shouldShowAiAssistantEntrypoint()) {\n <button\n end-actions\n mat-icon-button\n color=\"primary\"\n type=\"button\"\n class=\"praxis-table-ai-trigger praxis-table-toolbar-action--ai\"\n [class.praxis-table-ai-trigger--minimized]=\"hasMinimizedAiAssistantSession()\"\n [attr.data-testid]=\"aiAssistantTriggerTestId('toolbar-top')\"\n (click)=\"openAiAssistant()\"\n [attr.aria-label]=\"aiAssistantTriggerLabel()\"\n [matBadge]=\"aiAssistantTriggerBadge()\"\n [matBadgeHidden]=\"!hasMinimizedAiAssistantSession()\"\n matBadgeColor=\"accent\"\n matBadgeSize=\"small\"\n matBadgePosition=\"above after\"\n [matTooltip]=\"aiAssistantTriggerTooltip()\"\n matTooltipPosition=\"below\"\n >\n <mat-icon>{{ aiAssistantTriggerIcon() }}</mat-icon>\n </button>\n }\n\n @if (enableCustomization) {\n <button end-actions mat-icon-button color=\"primary\" class=\"praxis-table-toolbar-action--configuration\" data-role=\"table-settings\" data-testid=\"table-settings-trigger\"\n (click)=\"openTableSettings()\" [attr.aria-label]=\"getTableSettingsLabel()\"\n [matBadge]=\"schemaOutdated ? '!' : ''\"\n [matBadgeHidden]=\"!schemaOutdated\"\n matBadgeColor=\"warn\" matBadgeSize=\"small\" matBadgePosition=\"above after\"\n [matTooltip]=\"getTableSettingsTooltip()\"\n matTooltipPosition=\"below\">\n <mat-icon>settings</mat-icon>\n </button>\n }\n </praxis-table-toolbar>\n }\n @if (!showToolbar && enableCustomization) {\n <div class=\"ptable-header-actions\">\n @if (shouldShowAiAssistantEntrypoint()) {\n <button\n mat-icon-button\n color=\"primary\"\n type=\"button\"\n class=\"praxis-table-ai-trigger praxis-table-toolbar-action--ai\"\n [class.praxis-table-ai-trigger--minimized]=\"hasMinimizedAiAssistantSession()\"\n [attr.data-testid]=\"aiAssistantTriggerTestId('header-top')\"\n (click)=\"openAiAssistant()\"\n [attr.aria-label]=\"aiAssistantTriggerLabel()\"\n [matBadge]=\"aiAssistantTriggerBadge()\"\n [matBadgeHidden]=\"!hasMinimizedAiAssistantSession()\"\n matBadgeColor=\"accent\"\n matBadgeSize=\"small\"\n matBadgePosition=\"above after\"\n [matTooltip]=\"aiAssistantTriggerTooltip()\"\n matTooltipPosition=\"below\"\n >\n <mat-icon>{{ aiAssistantTriggerIcon() }}</mat-icon>\n </button>\n }\n <button mat-icon-button color=\"primary\" class=\"praxis-table-toolbar-action--configuration\" data-role=\"table-settings\" data-testid=\"table-settings-trigger\" (click)=\"openTableSettings()\" [attr.aria-label]=\"getTableSettingsLabel()\"\n [matBadge]=\"schemaOutdated ? '!' : ''\"\n [matBadgeHidden]=\"!schemaOutdated\"\n matBadgeColor=\"warn\" matBadgeSize=\"small\" matBadgePosition=\"above after\"\n [matTooltip]=\"getTableSettingsTooltip()\"\n matTooltipPosition=\"below\">\n <mat-icon>settings</mat-icon>\n </button>\n @if (isRemoteMode()) {\n <button mat-icon-button (click)=\"disconnect()\" [attr.aria-label]=\"getDisconnectLabel()\" [matTooltip]=\"getDisconnectTooltip()\">\n <mat-icon>link_off</mat-icon>\n </button>\n }\n </div>\n }\n </div>\n} @else {\n @if (shouldRenderDataSurface() && !schemaError && !dataError) {\n @if (showToolbar && shouldShowToolbarTopPlacement()) {\n <praxis-table-toolbar\n class=\"praxis-toolbar-stack-top\"\n [config]=\"config\"\n [backgroundColor]=\"getToolbarActionsBackgroundColor()\"\n [style.--pfx-filter-h]=\"getToolbarLayoutHeightHostStyle()\"\n [evaluationContext]=\"getToolbarEvaluationContext()\"\n [showActionsGroup]=\"shouldShowToolbarActionsTop()\"\n [showMobileActions]=\"shouldShowToolbarActionsTop()\"\n [exportBusy]=\"exportBusy\"\n (toolbarAction)=\"onToolbarAction($event)\"\n (exportAction)=\"onExportAction($event)\"\n >\n @if (shouldRenderAdvancedFilter()) {\n <praxis-filter\n advancedFilter\n [resourcePath]=\"getAdvancedFilterResourcePath()\"\n [filterId]=\"tableId\"\n [formId]=\"tableId\"\n [persistenceKey]=\"getAdvancedFilterPersistenceKey()\"\n [fieldMetadata]=\"getAdvancedFilterFieldMetadata()\"\n [enableCustomization]=\"enableCustomization\"\n [value]=\"advancedFilterValue\"\n\n [alwaysVisibleFields]=\"getAdvancedFilterAlwaysVisibleFields()\"\n [alwaysVisibleFieldMetadataOverrides]=\"getAdvancedFilterAlwaysVisibleFieldMetadataOverrides()\"\n [selectedFieldIds]=\"config.behavior?.filtering?.advancedFilters?.settings?.selectedFieldIds ?? []\"\n [allowSaveTags]=\"config.behavior?.filtering?.advancedFilters?.settings?.allowSaveTags\"\n [changeDebounceMs]=\"config.behavior?.filtering?.advancedFilters?.settings?.changeDebounceMs ?? 300\"\n [i18n]=\"getFilterI18n()\"\n [mode]=\"'filter'\"\n [showFilterSettings]=\"enableCustomization\"\n (change)=\"onAdvancedFilterChange($event)\"\n (requestSearch)=\"onAdvancedFilterSubmit($event)\"\n (clear)=\"onAdvancedFilterClear()\"\n ></praxis-filter>\n }\n <ng-content select=\"[advancedFilter]\" />\n <ng-content select=\"[toolbar]\" />\n @if (shouldShowAiAssistantEntrypoint()) {\n <button\n end-actions\n mat-icon-button\n color=\"primary\"\n type=\"button\"\n class=\"praxis-table-ai-trigger praxis-table-toolbar-action--ai\"\n [class.praxis-table-ai-trigger--minimized]=\"hasMinimizedAiAssistantSession()\"\n [attr.data-testid]=\"aiAssistantTriggerTestId('toolbar-stacked')\"\n (click)=\"openAiAssistant()\"\n [attr.aria-label]=\"aiAssistantTriggerLabel()\"\n [matBadge]=\"aiAssistantTriggerBadge()\"\n [matBadgeHidden]=\"!hasMinimizedAiAssistantSession()\"\n matBadgeColor=\"accent\"\n matBadgeSize=\"small\"\n matBadgePosition=\"above after\"\n [matTooltip]=\"aiAssistantTriggerTooltip()\"\n matTooltipPosition=\"below\"\n >\n <mat-icon>{{ aiAssistantTriggerIcon() }}</mat-icon>\n </button>\n }\n @if (enableCustomization) {\n <button end-actions mat-icon-button color=\"primary\" class=\"praxis-table-toolbar-action--configuration\" data-role=\"table-settings\" data-testid=\"table-settings-trigger\"\n (click)=\"openTableSettings()\" [attr.aria-label]=\"getTableSettingsLabel()\"\n [matBadge]=\"schemaOutdated ? '!' : ''\"\n [matBadgeHidden]=\"!schemaOutdated\"\n matBadgeColor=\"warn\" matBadgeSize=\"small\" matBadgePosition=\"above after\"\n [matTooltip]=\"getTableSettingsTooltip()\"\n matTooltipPosition=\"below\">\n <mat-icon>settings</mat-icon>\n </button>\n }\n </praxis-table-toolbar>\n }\n @if (!showToolbar && enableCustomization) {\n <div class=\"ptable-header-actions\">\n @if (shouldShowAiAssistantEntrypoint()) {\n <button\n mat-icon-button\n color=\"primary\"\n type=\"button\"\n class=\"praxis-table-ai-trigger praxis-table-toolbar-action--ai\"\n [class.praxis-table-ai-trigger--minimized]=\"hasMinimizedAiAssistantSession()\"\n [attr.data-testid]=\"aiAssistantTriggerTestId('header-stacked')\"\n (click)=\"openAiAssistant()\"\n [attr.aria-label]=\"aiAssistantTriggerLabel()\"\n [matBadge]=\"aiAssistantTriggerBadge()\"\n [matBadgeHidden]=\"!hasMinimizedAiAssistantSession()\"\n matBadgeColor=\"accent\"\n matBadgeSize=\"small\"\n matBadgePosition=\"above after\"\n [matTooltip]=\"aiAssistantTriggerTooltip()\"\n matTooltipPosition=\"below\"\n >\n <mat-icon>{{ aiAssistantTriggerIcon() }}</mat-icon>\n </button>\n }\n <button mat-icon-button color=\"primary\" class=\"praxis-table-toolbar-action--configuration\" data-role=\"table-settings\" data-testid=\"table-settings-trigger\" (click)=\"openTableSettings()\" [attr.aria-label]=\"getTableSettingsLabel()\"\n [matBadge]=\"schemaOutdated ? '!' : ''\"\n [matBadgeHidden]=\"!schemaOutdated\"\n matBadgeColor=\"warn\" matBadgeSize=\"small\" matBadgePosition=\"above after\"\n [matTooltip]=\"getTableSettingsTooltip()\"\n matTooltipPosition=\"below\">\n <mat-icon>settings</mat-icon>\n </button>\n </div>\n }\n }\n}\n<!-- Paginador superior -->\n@if (shouldRenderDataSurface() && !schemaError && !dataError && getPaginationEnabled() && (config.behavior?.pagination?.position === 'top' || config.behavior?.pagination?.position === 'both')) {\n <mat-paginator\n [length]=\"getPaginationLength()\"\n [pageSize]=\"getPaginationPageSize()\"\n [pageSizeOptions]=\"getPaginationPageSizeOptions()\"\n [selectConfig]=\"paginatorSelectConfig\"\n [showFirstLastButtons]=\"getPaginationShowFirstLast()\"\n (page)=\"onPageChange($event)\"\n [class.compact]=\"config.behavior?.pagination?.style === 'compact'\"\n >\n </mat-paginator>\n}\n<div class=\"px-scroll-viewport\"\n cdkScrollable\n [class.scroll-auto]=\"horizontalScroll === 'auto'\"\n [class.scroll-wrap]=\"horizontalScroll === 'wrap'\"\n [class.scroll-none]=\"horizontalScroll === 'none'\">\n\n @if (shouldRenderDataSurface() && !schemaError && !dataError) {\n <div class=\"praxis-visually-hidden-status\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">\n {{ columnReorderStatusMessage }}\n </div>\n @if (exportStatusMessage) {\n <div class=\"praxis-visually-hidden-status\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">\n {{ exportStatusMessage }}\n </div>\n }\n @if (columnReorderVisualStatusMessage) {\n <div class=\"praxis-column-reorder-status\" role=\"note\">\n {{ columnReorderVisualStatusMessage }}\n </div>\n }\n <table\n mat-table\n data-testid=\"table-column-drag-drop-list\"\n [dataSource]=\"dataSource\"\n [multiTemplateDataRows]=\"isRowExpansionRuntimeEnabled()\"\n cdkDropList\n [cdkDropListDisabled]=\"!isColumnDraggingEnabled() || isColumnResizeActive()\"\n [cdkDropListData]=\"visibleDataColumnsForDrag\"\n cdkDropListOrientation=\"horizontal\"\n (cdkDropListDropped)=\"onColumnDrop($event)\"\n matSort\n (matSortChange)=\"onSortChange($event)\"\n [matSortDisabled]=\"!getSortingEnabled() || isColumnResizeActive()\"\n [ngClass]=\"getTableElevationClassName()\"\n [class.table-stack-top]=\"hasTopToolbarStack()\"\n [class.pfx-column-drag-enabled]=\"isColumnDraggingEnabled()\"\n [class.pfx-column-drag-indicator]=\"isColumnDragIndicatorEnabled()\"\n [class.pfx-column-resize-enabled]=\"isColumnResizeEnabled()\"\n [class.pfx-column-resizing]=\"isColumnResizeActive()\"\n [style.width]=\"getColumnResizeTableWidthStyle()\"\n [style.min-width]=\"getColumnResizeTableWidthStyle()\"\n [style.max-width]=\"getColumnResizeTableWidthStyle()\"\n >\n @if (isSelectionColumnEnabled()) {\n <ng-container\n matColumnDef=\"_select\"\n >\n <th mat-header-cell *matHeaderCellDef>\n @if (canSelectAll()) {\n <mat-checkbox\n (change)=\"masterToggle()\"\n [checked]=\"isAllSelected()\"\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\"\n [attr.aria-label]=\"getMasterSelectionAriaLabel()\"\n ></mat-checkbox>\n }\n </th>\n <td mat-cell *matCellDef=\"let row; let i = index\">\n @if (config.behavior?.selection?.type !== 'multiple') {\n <mat-radio-button\n (click)=\"$event.stopPropagation(); toggleRow(row)\"\n [checked]=\"selection.isSelected(row)\"\n [attr.aria-label]=\"getRowSelectionAriaLabel(row, i)\"\n ></mat-radio-button>\n } @else {\n <mat-checkbox\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleRow(row)\"\n [checked]=\"selection.isSelected(row)\"\n [attr.aria-label]=\"getRowSelectionAriaLabel(row, i)\"\n ></mat-checkbox>\n }\n </td>\n </ng-container>\n }\n\n @if (isRowExpansionRuntimeEnabled()) {\n <ng-container matColumnDef=\"_expander\">\n <th mat-header-cell *matHeaderCellDef class=\"pfx-expansion-col-header\">\n <span class=\"praxis-visually-hidden-status\">Expandir detalhes da linha</span>\n </th>\n <td mat-cell *matCellDef=\"let row; let i = index\" class=\"pfx-expansion-col-cell\">\n <button\n mat-icon-button\n class=\"pfx-expansion-toggle\"\n [disabled]=\"!isRowExpandable(row, i) || !isExpansionIconTriggerEnabled()\"\n [attr.aria-expanded]=\"isRowExpanded(row, i) ? 'true' : 'false'\"\n [attr.aria-controls]=\"getRowExpansionDetailId(row, i)\"\n [attr.aria-label]=\"getRowExpansionToggleAriaLabel(row, i)\"\n (click)=\"onExpansionToggleFromIcon(row, i, $event)\"\n (keydown)=\"onExpansionToggleKeydown($event, row, i)\"\n >\n <mat-icon [praxisIcon]=\"isRowExpanded(row, i)\n ? getExpansionExpandedIcon()\n : getExpansionCollapsedIcon()\"></mat-icon>\n </button>\n </td>\n </ng-container>\n }\n @for (column of visibleColumns; track column.field) {\n <ng-container\n [matColumnDef]=\"column.field\"\n [sticky]=\"column.sticky === true || column.sticky === 'start'\"\n [stickyEnd]=\"column.sticky === 'end'\"\n >\n <th\n mat-header-cell\n *matHeaderCellDef\n cdkDrag\n [cdkDragData]=\"column\"\n cdkDragLockAxis=\"x\"\n cdkDragPreviewClass=\"pfx-column-drag-preview\"\n (cdkDragStarted)=\"onColumnDragStarted(column)\"\n (cdkDragEnded)=\"onColumnDragEnded($event, column)\"\n [cdkDragDisabled]=\"!isColumnDraggingEnabled() || !isColumnDraggable(column) || isColumnResizeActive()\"\n [class.praxis-header-draggable]=\"isColumnDraggingEnabled() && isColumnDraggable(column)\"\n [class.praxis-header-resizable]=\"isColumnResizable(column)\"\n [class.praxis-header-resizing]=\"isColumnResizeActive(column)\"\n [class.praxis-header-align-left]=\"column.align === 'left'\"\n [class.praxis-header-align-center]=\"column.align === 'center'\"\n [class.praxis-header-align-right]=\"column.align === 'right'\"\n [style.text-align]=\"getColumnTextAlignStyle(column)\"\n [style.width]=\"getColumnWidthStyle(column)\"\n [attr.style]=\"getColumnHeaderAttrStyle(column)\"\n [ngStyle]=\"getColumnHeaderNgStyle(column)\"\n >\n <span\n class=\"praxis-header-sort-trigger\"\n [mat-sort-header]=\"column.field\"\n [disabled]=\"!getSortingEnabled() || column.sortable === false || isColumnResizeActive()\"\n (keydown)=\"onColumnHeaderReorderKeydown($event, column)\"\n >\n <span class=\"praxis-header-label\" data-testid=\"column-header-label\">\n <span class=\"praxis-header-label-text\">{{ column.header }}</span>\n </span>\n </span>\n <ng-template cdkDragPreview [matchSize]=\"true\">\n <div\n class=\"pfx-column-drag-preview pfx-column-drag-preview-custom\"\n [class.praxis-header-align-left]=\"column.align === 'left'\"\n [class.praxis-header-align-center]=\"column.align === 'center'\"\n [class.praxis-header-align-right]=\"column.align === 'right'\"\n [style.text-align]=\"getColumnTextAlignStyle(column)\"\n >\n <span class=\"praxis-header-label\">\n <span class=\"praxis-header-label-text\">{{ column.header }}</span>\n </span>\n </div>\n </ng-template>\n @if (isColumnResizable(column)) {\n <span\n class=\"praxis-column-resize-handle\"\n role=\"separator\"\n aria-orientation=\"vertical\"\n tabindex=\"0\"\n [attr.aria-label]=\"getColumnResizeHandleAriaLabel(column)\"\n [attr.aria-valuemin]=\"getColumnResizeMinWidthAriaValue(column)\"\n [attr.aria-valuemax]=\"getColumnResizeMaxWidthAriaValue(column)\"\n [attr.aria-valuenow]=\"getColumnResizeCurrentWidthAriaValue(column)\"\n [attr.title]=\"getColumnResizeHandleTooltip(column)\"\n (pointerdown)=\"onColumnResizePointerDown($event, column)\"\n (keydown)=\"onColumnResizeHandleKeydown($event, column)\"\n (click)=\"onColumnResizeHandleClick($event)\"\n ></span>\n }\n </th>\n <td\n mat-cell\n *matCellDef=\"let element\"\n [style.text-align]=\"getColumnTextAlignStyle(column)\"\n [style.width]=\"getColumnWidthStyle(column)\"\n [attr.style]=\"getColumnCellAttrStyle(column)\"\n [ngClass]=\"getCellClasses(element, column)\"\n [ngStyle]=\"getCellNgStyle(element, column)\"\n [matTooltip]=\"getCellTooltip(element, column) || ''\"\n [matTooltipPosition]=\"getCellTooltipPosition(element, column)\"\n [matTooltipDisabled]=\"!getCellTooltip(element, column)\"\n [attr.title]=\"getCellTooltip(element, column) || null\"\n >\n <div\n class=\"pfx-cell-content\"\n [ngClass]=\"getCellContentClasses(element, column)\"\n [ngStyle]=\"getCellContentNgStyle(element, column)\"\n >\n @switch (getEffectiveRendererType(element, column)) {\n <!-- Icon renderer -->\n @case ('icon') {\n <span\n class=\"pfx-icon-renderer\"\n [style.color]=\"getIconColor(element, column) || null\"\n [ngStyle]=\"getIconStyle(element, column)\"\n [attr.aria-label]=\"getIconAriaLabel(element, column) || null\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-icon-renderer__content\"\n [nodes]=\"getIconRichContentNodes(element, column)\"\n ></praxis-rich-content>\n </span>\n }\n <!-- Image renderer -->\n @case ('image') {\n <span class=\"pfx-cell-image\">\n <praxis-rich-content\n rootClassName=\"pfx-cell-image__content\"\n [nodes]=\"getImageRichContentNodes(element, column)\"\n ></praxis-rich-content>\n </span>\n }\n <!-- Badge renderer -->\n @case ('badge') {\n @if (shouldRenderBadge(element, column)) {\n <span class=\"pfx-badge\" [ngClass]=\"getBadgeClasses(element, column)\">\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-badge__content\"\n [nodes]=\"getBadgeRichContentNodes(element, column)\"\n ></praxis-rich-content>\n </span>\n }\n }\n <!-- Link renderer -->\n @case ('link') {\n <a\n class=\"pfx-link\"\n [attr.href]=\"getLinkHref(element, column) || null\"\n [attr.target]=\"getLinkTarget(element, column) || null\"\n [attr.rel]=\"getLinkRel(element, column) || null\"\n (click)=\"$event.stopPropagation()\"\n ><praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-link__content\"\n [nodes]=\"getLinkRichContentNodes(element, column)\"\n ></praxis-rich-content></a\n >\n }\n <!-- Button renderer -->\n @case ('button') {\n @switch (getButtonVariant(element, column)) {\n @case ('outlined') {\n <button\n mat-stroked-button\n [color]=\"getButtonColor(element, column) || null\"\n [disabled]=\"isButtonDisabled(element, column)\"\n [attr.aria-label]=\"getButtonAriaLabel(element, column) || getButtonLabel(element, column)\"\n (click)=\"onButtonClick(element, column, $event)\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-button-renderer__content\"\n [nodes]=\"getButtonRichContentNodes(element, column)\"\n ></praxis-rich-content>\n </button>\n }\n @case ('text') {\n <button\n mat-button\n [color]=\"getButtonColor(element, column) || null\"\n [disabled]=\"isButtonDisabled(element, column)\"\n [attr.aria-label]=\"getButtonAriaLabel(element, column) || getButtonLabel(element, column)\"\n (click)=\"onButtonClick(element, column, $event)\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-button-renderer__content\"\n [nodes]=\"getButtonRichContentNodes(element, column)\"\n ></praxis-rich-content>\n </button>\n }\n @default {\n <button\n mat-flat-button\n [color]=\"getButtonColor(element, column) || null\"\n [disabled]=\"isButtonDisabled(element, column)\"\n [attr.aria-label]=\"getButtonAriaLabel(element, column) || getButtonLabel(element, column)\"\n (click)=\"onButtonClick(element, column, $event)\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-button-renderer__content\"\n [nodes]=\"getButtonRichContentNodes(element, column)\"\n ></praxis-rich-content>\n </button>\n }\n }\n }\n <!-- Chip renderer -->\n @case ('chip') {\n @if (shouldRenderChip(element, column)) {\n <span class=\"pfx-chip\" [ngClass]=\"getChipClasses(element, column)\">\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-chip__content\"\n [nodes]=\"getChipRichContentNodes(element, column)\"\n ></praxis-rich-content>\n </span>\n }\n }\n <!-- Progress renderer -->\n @case ('progress') {\n <div class=\"pfx-progress\">\n <praxis-rich-content\n rootClassName=\"pfx-progress__content\"\n [context]=\"getProgressRichContentContext(element, column)\"\n [nodes]=\"getProgressRichContentNodes(element, column)\"\n ></praxis-rich-content>\n </div>\n }\n <!-- Micro visualization renderer -->\n @case ('microVisualization') {\n <span class=\"pfx-micro-viz-cell\" [innerHTML]=\"getMicroVisualizationHtml(element, column)\"></span>\n }\n <!-- Avatar renderer -->\n @case ('avatar') {\n <span class=\"pfx-avatar-renderer\"\n [ngStyle]=\"getAvatarStyle(element, column)\"\n [class.shape-rounded]=\"getAvatarShape(element, column) === 'rounded'\"\n [class.shape-circle]=\"getAvatarShape(element, column) === 'circle'\">\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-avatar-renderer__content\"\n [nodes]=\"getAvatarRichContentNodes(element, column)\"\n ></praxis-rich-content>\n </span>\n }\n <!-- Toggle renderer -->\n @case ('toggle') {\n <mat-slide-toggle\n [checked]=\"getToggleState(element, column)\"\n [disabled]=\"isToggleDisabled(element, column)\"\n [attr.aria-label]=\"getToggleAriaLabel(element, column) || 'Alternar'\"\n (change)=\"onToggleChange(element, column, $event)\"\n (click)=\"$event.stopPropagation()\"\n ></mat-slide-toggle>\n }\n <!-- Menu renderer -->\n @case ('menu') {\n <button mat-icon-button [matMenuTriggerFor]=\"menuRef\" (click)=\"$event.stopPropagation()\" [attr.aria-label]=\"getMenuAriaLabel(element, column) || 'Menu'\">\n <praxis-rich-content rootClassName=\"pfx-menu-trigger__content\" [nodes]=\"getMenuTriggerRichContentNodes()\"></praxis-rich-content>\n </button>\n <mat-menu #menuRef=\"matMenu\">\n @for (it of getMenuItems(element, column); track it.id) {\n <button mat-menu-item (click)=\"onMenuItemClick(it, element, $event)\" [disabled]=\"!it.__visible\" >\n <praxis-rich-content\n rootClassName=\"pfx-menu-item__content\"\n [nodes]=\"getMenuItemRichContentNodes(it)\"\n ></praxis-rich-content>\n </button>\n }\n </mat-menu>\n }\n <!-- Rating renderer -->\n @case ('rating') {\n <praxis-table-rating\n class=\"pfx-rating-cell\"\n [itemsCount]=\"getRatingMax(element, column)\"\n [value]=\"getRatingValue(element, column)\"\n [size]=\"getRatingSize(element, column)\"\n [ratingColor]=\"getRatingColor(element, column)\"\n [outlineColor]=\"getRatingOutlineColor(element, column)\"\n [ariaLabel]=\"getRatingAriaLabel(element, column) || column.header\">\n </praxis-table-rating>\n }\n <!-- HTML renderer (sanitizado) -->\n @case ('html') {\n <span [innerHTML]=\"getSafeHtml(element, column)\"></span>\n }\n <!-- Compose renderer -->\n @case ('compose') {\n <span class=\"pfx-cell-compose\" [ngClass]=\"getComposeClasses(element, column)\" [ngStyle]=\"getComposeGapStyle(element, column)\">\n @for (it of getComposeItems(element, column); track trackComposeItem($index, it)) {\n @switch (getItemEffectiveType(element, column, it)) {\n <!-- Reuse helpers by projecting item as faux column -->\n @case ('icon') {\n <span class=\"pfx-icon-renderer\" [style.color]=\"getIconColor(element, asItemColumn(column, it)) || null\" [ngStyle]=\"getIconStyle(element, asItemColumn(column, it))\" [attr.aria-label]=\"getIconAriaLabel(element, asItemColumn(column, it)) || null\"><praxis-rich-content [layout]=\"'inline'\" rootClassName=\"pfx-icon-renderer__content\" [nodes]=\"getIconRichContentNodes(element, asItemColumn(column, it))\"></praxis-rich-content></span>\n }\n @case ('image') {\n <span class=\"pfx-cell-image\"><praxis-rich-content rootClassName=\"pfx-cell-image__content\" [nodes]=\"getImageRichContentNodes(element, asItemColumn(column, it))\"></praxis-rich-content></span>\n }\n @case ('badge') {\n @if (shouldRenderBadge(element, asItemColumn(column, it))) {\n <span class=\"pfx-badge\" [ngClass]=\"getBadgeClasses(element, asItemColumn(column, it))\"><praxis-rich-content [layout]=\"'inline'\" rootClassName=\"pfx-badge__content\" [nodes]=\"getBadgeRichContentNodes(element, asItemColumn(column, it))\"></praxis-rich-content></span>\n }\n }\n @case ('link') {\n <a class=\"pfx-link\" [attr.href]=\"getLinkHref(element, asItemColumn(column, it)) || null\" [attr.target]=\"getLinkTarget(element, asItemColumn(column, it)) || null\" [attr.rel]=\"getLinkRel(element, asItemColumn(column, it)) || null\" (click)=\"$event.stopPropagation()\"><praxis-rich-content [layout]=\"'inline'\" rootClassName=\"pfx-link__content\" [nodes]=\"getLinkRichContentNodes(element, asItemColumn(column, it))\"></praxis-rich-content></a>\n }\n @case ('button') {\n @switch (getButtonVariant(element, asItemColumn(column, it))) {\n @case ('outlined') {\n <button mat-stroked-button [color]=\"getButtonColor(element, asItemColumn(column, it)) || null\" [disabled]=\"isButtonDisabled(element, asItemColumn(column, it))\" [attr.aria-label]=\"getButtonAriaLabel(element, asItemColumn(column, it)) || getButtonLabel(element, asItemColumn(column, it))\" (click)=\"onButtonClick(element, asItemColumn(column, it), $event)\"><praxis-rich-content [layout]=\"'inline'\" rootClassName=\"pfx-button-renderer__content\" [nodes]=\"getButtonRichContentNodes(element, asItemColumn(column, it))\"></praxis-rich-content></button>\n }\n @case ('text') {\n <button mat-button [color]=\"getButtonColor(element, asItemColumn(column, it)) || null\" [disabled]=\"isButtonDisabled(element, asItemColumn(column, it))\" [attr.aria-label]=\"getButtonAriaLabel(element, asItemColumn(column, it)) || getButtonLabel(element, asItemColumn(column, it))\" (click)=\"onButtonClick(element, asItemColumn(column, it), $event)\"><praxis-rich-content [layout]=\"'inline'\" rootClassName=\"pfx-button-renderer__content\" [nodes]=\"getButtonRichContentNodes(element, asItemColumn(column, it))\"></praxis-rich-content></button>\n }\n @default {\n <button mat-flat-button [color]=\"getButtonColor(element, asItemColumn(column, it)) || null\" [disabled]=\"isButtonDisabled(element, asItemColumn(column, it))\" [attr.aria-label]=\"getButtonAriaLabel(element, asItemColumn(column, it)) || getButtonLabel(element, asItemColumn(column, it))\" (click)=\"onButtonClick(element, asItemColumn(column, it), $event)\"><praxis-rich-content [layout]=\"'inline'\" rootClassName=\"pfx-button-renderer__content\" [nodes]=\"getButtonRichContentNodes(element, asItemColumn(column, it))\"></praxis-rich-content></button>\n }\n }\n }\n @case ('chip') {\n @if (shouldRenderChip(element, asItemColumn(column, it))) {\n <span class=\"pfx-chip\" [ngClass]=\"getChipClasses(element, asItemColumn(column, it))\"><praxis-rich-content [layout]=\"'inline'\" rootClassName=\"pfx-chip__content\" [nodes]=\"getChipRichContentNodes(element, asItemColumn(column, it))\"></praxis-rich-content></span>\n }\n }\n @case ('progress') {\n <div class=\"pfx-progress\">\n <praxis-rich-content\n rootClassName=\"pfx-progress__content\"\n [context]=\"getProgressRichContentContext(element, asItemColumn(column, it))\"\n [nodes]=\"getProgressRichContentNodes(element, asItemColumn(column, it))\"\n ></praxis-rich-content>\n </div>\n }\n @case ('microVisualization') {\n <span class=\"pfx-micro-viz-cell\" [innerHTML]=\"getMicroVisualizationHtml(element, asItemColumn(column, it))\"></span>\n }\n @case ('avatar') {\n <span class=\"pfx-avatar-renderer\" [ngStyle]=\"getAvatarStyle(element, asItemColumn(column, it))\" [class.shape-rounded]=\"getAvatarShape(element, asItemColumn(column, it)) === 'rounded'\" [class.shape-circle]=\"getAvatarShape(element, asItemColumn(column, it)) === 'circle'\"><praxis-rich-content rootClassName=\"pfx-avatar-renderer__content\" [nodes]=\"getAvatarRichContentNodes(element, asItemColumn(column, it))\"></praxis-rich-content></span>\n }\n @case ('toggle') {\n <mat-slide-toggle [checked]=\"getToggleState(element, asItemColumn(column, it))\" [disabled]=\"isToggleDisabled(element, asItemColumn(column, it))\" [attr.aria-label]=\"getToggleAriaLabel(element, asItemColumn(column, it)) || 'Alternar'\" (change)=\"onToggleChange(element, asItemColumn(column, it), $event)\" (click)=\"$event.stopPropagation()\"></mat-slide-toggle>\n }\n @case ('menu') {\n <button mat-icon-button [matMenuTriggerFor]=\"menuRef\" (click)=\"$event.stopPropagation()\" [attr.aria-label]=\"getMenuAriaLabel(element, asItemColumn(column, it)) || 'Menu'\"><praxis-rich-content rootClassName=\"pfx-menu-trigger__content\" [nodes]=\"getMenuTriggerRichContentNodes()\"></praxis-rich-content></button>\n <mat-menu #menuRef=\"matMenu\">\n @for (mi of getMenuItems(element, asItemColumn(column, it)); track mi.id) {\n <button mat-menu-item (click)=\"onMenuItemClick(mi, element, $event)\" [disabled]=\"!mi.__visible\">\n <praxis-rich-content\n rootClassName=\"pfx-menu-item__content\"\n [nodes]=\"getMenuItemRichContentNodes(mi)\"\n ></praxis-rich-content>\n </button>\n }\n </mat-menu>\n }\n @case ('rating') {\n <praxis-table-rating\n class=\"pfx-rating-cell\"\n [itemsCount]=\"getRatingMax(element, asItemColumn(column, it))\"\n [value]=\"getRatingValue(element, asItemColumn(column, it))\"\n [size]=\"getRatingSize(element, asItemColumn(column, it))\"\n [ratingColor]=\"getRatingColor(element, asItemColumn(column, it))\"\n [outlineColor]=\"getRatingOutlineColor(element, asItemColumn(column, it))\"\n [ariaLabel]=\"getRatingAriaLabel(element, asItemColumn(column, it)) || column.header\">\n </praxis-table-rating>\n }\n @case ('html') {\n <span [innerHTML]=\"getSafeHtml(element, asItemColumn(column, it))\"></span>\n }\n <!-- Value item: render base cell text alongside visuals -->\n @case ('value') {\n <span class=\"pfx-cell-value\">{{ getComposeItemValue(element, column, it) }}</span>\n }\n }\n }\n </span>\n }\n <!-- Default text rendering -->\n @default {\n {{ getCellValue(element, column) }}\n }\n }\n </div>\n </td>\n </ng-container>\n }\n @if (config.actions?.row?.enabled) {\n <ng-container matColumnDef=\"_actions\" [sticky]=\"config.actions?.row?.sticky === true || config.actions?.row?.sticky === 'start'\" [stickyEnd]=\"config.actions?.row?.sticky === 'end'\">\n <th mat-header-cell *matHeaderCellDef #actionsHeaderCell [style.width]=\"getRowActionsWidthStyle()\" class=\"praxis-actions-header\" [class.align-start]=\"getActionsHeaderAlign() === 'start'\" [class.align-center]=\"getActionsHeaderAlign() === 'center'\" [class.align-end]=\"getActionsHeaderAlign() === 'end'\">\n <div class=\"praxis-actions-header__content\" [matTooltip]=\"getActionsHeaderTooltip() || ''\" [matTooltipDisabled]=\"!getActionsHeaderTooltip()\">\n <praxis-rich-content\n rootClassName=\"praxis-actions-header__nodes\"\n [nodes]=\"getActionsHeaderRichContentNodes()\"\n ></praxis-rich-content>\n </div>\n </th>\n <td\n mat-cell\n *matCellDef=\"let row\"\n class=\"praxis-actions-cell\"\n [class.dense]=\"dense\"\n [style.width]=\"getRowActionsWidthStyle()\"\n >\n <div\n class=\"praxis-actions-cell__content\"\n [class.praxis-actions-cell__content--discovering]=\"isRowDiscoveryPending(row)\"\n [attr.aria-busy]=\"isRowDiscoveryPending(row) ? 'true' : null\"\n >\n <!-- A\u00C3\u00A7\u00C3\u00B5es inline -->\n <!-- Inline actions: icons mode -->\n @if (config.actions?.row?.display === 'icons' || !config.actions?.row?.display) {\n @for (a of getInlineRowActions(row); track trackAction($index, a)) {\n <span\n class=\"praxis-row-action-anchor\"\n [class.praxis-row-action-anchor--workflow]=\"isWorkflowRowAction(a)\"\n [class.praxis-row-action-anchor--blocked]=\"isBlockedWorkflowRowAction(a, row)\"\n [matTooltip]=\"getActionTooltip(a, row)\"\n [matTooltipDisabled]=\"!getActionTooltip(a, row)\"\n matTooltipPosition=\"above\"\n matTooltipClass=\"praxis-tooltip\"\n >\n <button\n mat-icon-button\n class=\"praxis-icon-btn\"\n [class.praxis-icon-btn--workflow]=\"isWorkflowRowAction(a)\"\n [class.praxis-icon-btn--blocked]=\"isBlockedWorkflowRowAction(a, row)\"\n [disabled]=\"isActionDisabled(a, row)\"\n (click)=\"onRowAction(getActionId(a), row, $event, getRowActionRuntimeOptions(a, row))\"\n [attr.aria-label]=\"a.label || getActionId(a)\"\n [color]=\"a.color || null\"\n >\n <praxis-rich-content\n layout=\"inline\"\n rootClassName=\"praxis-row-action__content\"\n [nodes]=\"getRowActionIconRichContentNodes(a)\"\n ></praxis-rich-content>\n </button>\n </span>\n }\n }\n\n <!-- Inline actions: buttons mode (show label + icon) -->\n @if (config.actions?.row?.display === 'buttons') {\n @for (a of getInlineRowActions(row); track trackAction($index, a)) {\n <span\n class=\"praxis-row-action-anchor\"\n [class.praxis-row-action-anchor--workflow]=\"isWorkflowRowAction(a)\"\n [class.praxis-row-action-anchor--blocked]=\"isBlockedWorkflowRowAction(a, row)\"\n [matTooltip]=\"getActionTooltip(a, row)\"\n [matTooltipDisabled]=\"!getActionTooltip(a, row)\"\n matTooltipPosition=\"above\"\n matTooltipClass=\"praxis-tooltip\"\n >\n <button\n mat-flat-button\n class=\"praxis-row-btn\"\n [class.praxis-row-btn--workflow]=\"isWorkflowRowAction(a)\"\n [class.praxis-row-btn--blocked]=\"isBlockedWorkflowRowAction(a, row)\"\n [disabled]=\"isActionDisabled(a, row)\"\n (click)=\"onRowAction(getActionId(a), row, $event, getRowActionRuntimeOptions(a, row))\"\n [attr.aria-label]=\"a.label || getActionId(a)\"\n [color]=\"a.color || null\"\n >\n <praxis-rich-content\n layout=\"inline\"\n rootClassName=\"praxis-row-action__content\"\n [nodes]=\"getRowActionRichContentNodes(a)\"\n ></praxis-rich-content>\n </button>\n </span>\n }\n }\n\n <!-- Menu de overflow -->\n @if (hasOverflowRowActions(row)) {\n <button\n mat-icon-button\n class=\"praxis-icon-btn praxis-more-btn\"\n [matMenuTriggerFor]=\"rowMoreMenu\"\n (menuOpened)=\"onRowOverflowMenuOpened(row)\"\n [color]=\"getRowMenuButtonColor() || null\"\n [attr.aria-label]=\"getRowMenuTooltip(row)\"\n [matTooltip]=\"getRowMenuTooltip(row)\"\n matTooltipPosition=\"above\"\n >\n <mat-icon [praxisIcon]=\"getRowMenuIcon()\"></mat-icon>\n </button>\n }\n <mat-menu #rowMoreMenu=\"matMenu\" xPosition=\"before\">\n @if (hasRowOverflowMenuLoadingState(row)) {\n <button mat-menu-item disabled>\n <mat-icon>hourglass_empty</mat-icon>\n <praxis-rich-content\n rootClassName=\"praxis-row-overflow-menu__label\"\n [nodes]=\"getTableChromeTextRichContentNodes(getRowOverflowMenuLoadingLabel(), 'praxis-row-overflow-menu__label-text')\"\n ></praxis-rich-content>\n </button>\n }\n @for (a of getOverflowRowActions(row); track trackAction($index, a)) {\n <button\n mat-menu-item\n (click)=\"onRowAction(getActionId(a), row, $event, getRowActionRuntimeOptions(a, row))\"\n [disabled]=\"isActionDisabled(a, row)\"\n >\n <mat-icon [color]=\"a.color || null\" [praxisIcon]=\"a.icon\"></mat-icon>\n <praxis-rich-content\n rootClassName=\"praxis-row-overflow-menu__label\"\n [nodes]=\"getTableChromeTextRichContentNodes(a.label || getActionId(a), 'praxis-row-overflow-menu__label-text')\"\n ></praxis-rich-content>\n </button>\n }\n @if (hasRowOverflowMenuEmptyState(row)) {\n <button mat-menu-item disabled>\n <mat-icon>info</mat-icon>\n <praxis-rich-content\n rootClassName=\"praxis-row-overflow-menu__label\"\n [nodes]=\"getTableChromeTextRichContentNodes(getRowOverflowMenuEmptyLabel(row), 'praxis-row-overflow-menu__label-text')\"\n ></praxis-rich-content>\n </button>\n }\n </mat-menu>\n </div>\n </td>\n </ng-container>\n }\n\n <tr\n mat-header-row\n *matHeaderRowDef=\"displayedColumns\"\n ></tr>\n @if (!isVirtualized()) {\n <tr\n mat-row\n *matRowDef=\"let row; let i = index; columns: displayedColumns\"\n [class.pfx-row-selected]=\"selection.isSelected(row)\"\n [class.pfx-row-click-selectable]=\"isRowClickSelectable()\"\n [class.pfx-row-expanded]=\"isRowExpansionRuntimeEnabled() && isRowExpanded(row, i)\"\n [attr.aria-selected]=\"config.behavior?.selection?.enabled ? (selection.isSelected(row) ? 'true' : 'false') : null\"\n [attr.aria-expanded]=\"isRowExpansionRuntimeEnabled() ? (isRowExpanded(row, i) ? 'true' : 'false') : null\"\n [ngClass]=\"getRowClasses(row)\"\n [ngStyle]=\"getRowNgStyle(row)\"\n [matTooltip]=\"getRowTooltip(row) || null\"\n [matTooltipDisabled]=\"!getRowTooltip(row)\"\n [matTooltipPosition]=\"getRowTooltipPosition(row)\"\n [matTooltipShowDelay]=\"getRowTooltipShowDelay(row)\"\n (click)=\"onRowClicked(row, i, $event)\"\n (dblclick)=\"onRowDoubleClicked(row, i)\"\n ></tr>\n @if (isRowExpansionRuntimeEnabled()) {\n <ng-container matColumnDef=\"_detail\">\n <td\n mat-cell\n *matCellDef=\"let row; let i = index\"\n class=\"pfx-expansion-detail-cell\"\n [attr.colspan]=\"displayedColumns.length\"\n >\n <section\n class=\"pfx-expansion-detail-panel\"\n [ngClass]=\"getExpansionMotionPresetClass()\"\n [ngStyle]=\"getExpansionMotionStyle()\"\n [attr.id]=\"getRowExpansionDetailId(row, i)\"\n role=\"region\"\n [attr.aria-label]=\"getRowExpansionRegionAriaLabel(row, i)\"\n [attr.aria-busy]=\"getExpansionDetailViewState(row, i).status === 'loading' ? 'true' : 'false'\"\n >\n @let detailState = getExpansionDetailViewState(row, i);\n @if (detailState.status === 'loading') {\n <div class=\"pfx-expansion-detail-message\" role=\"status\" aria-live=\"polite\">\n <praxis-rich-content\n rootClassName=\"pfx-expansion-detail-message__content\"\n [nodes]=\"getExpansionDetailTextRichContentNodes('Carregando detail schema...', 'pfx-expansion-detail-message__text')\"\n [context]=\"getExpansionDetailRichContentContext(row, i)\"\n ></praxis-rich-content>\n </div>\n } @else if (detailState.status !== 'ready') {\n <div\n class=\"pfx-expansion-detail-message pfx-expansion-detail-message--error\"\n role=\"alert\"\n aria-live=\"assertive\"\n aria-atomic=\"true\"\n >\n <praxis-rich-content\n rootClassName=\"pfx-expansion-detail-message__content\"\n [nodes]=\"getExpansionDetailTextRichContentNodes(detailState.message || 'Detail indispon\u00EDvel para esta linha.', 'pfx-expansion-detail-message__text')\"\n [context]=\"getExpansionDetailRichContentContext(row, i)\"\n ></praxis-rich-content>\n </div>\n } @else {\n @if (getExpansionDetailLayout(detailState.schema) === 'tabs') {\n @let detailTabs = getExpansionDetailTabs(detailState.schema);\n @if (detailTabs.length) {\n <div class=\"pfx-expansion-detail-tabs\" role=\"tablist\" aria-label=\"Se\u00C3\u00A7\u00C3\u00B5es do detail\">\n @for (tab of detailTabs; track $index; let tabIndex = $index) {\n <button\n type=\"button\"\n class=\"pfx-expansion-detail-tab-btn\"\n role=\"tab\"\n [attr.id]=\"getExpansionDetailTabId(row, i, tab, tabIndex)\"\n [attr.aria-controls]=\"getExpansionDetailPanelId(row, i, tab, tabIndex)\"\n [attr.aria-selected]=\"isExpansionDetailTabActive(row, i, tab, tabIndex, detailTabs) ? 'true' : 'false'\"\n [attr.tabindex]=\"isExpansionDetailTabActive(row, i, tab, tabIndex, detailTabs) ? '0' : '-1'\"\n [class.is-active]=\"isExpansionDetailTabActive(row, i, tab, tabIndex, detailTabs)\"\n (click)=\"onExpansionDetailTabSelect(row, i, tab, tabIndex, $event)\"\n (keydown)=\"onExpansionDetailTabKeydown($event, row, i, tabIndex, detailTabs)\"\n >\n <praxis-rich-content\n rootClassName=\"pfx-expansion-detail-tab-btn__content\"\n [nodes]=\"getExpansionDetailTabButtonRichContentNodes(tab)\"\n [context]=\"getExpansionDetailRichContentContext(row, i)\"\n ></praxis-rich-content>\n </button>\n }\n </div>\n @for (tab of detailTabs; track $index; let tabIndex = $index) {\n @if (isExpansionDetailTabActive(row, i, tab, tabIndex, detailTabs)) {\n <div\n class=\"pfx-expansion-detail-tab-panel\"\n role=\"tabpanel\"\n [attr.id]=\"getExpansionDetailPanelId(row, i, tab, tabIndex)\"\n [attr.aria-labelledby]=\"getExpansionDetailTabId(row, i, tab, tabIndex)\"\n >\n @if (getExpansionDetailTabRichContentNodes(tab, row, i); as richNodes) {\n <praxis-rich-content\n class=\"pfx-expansion-node-host pfx-expansion-node-host--tab\"\n [nodes]=\"richNodes\"\n [context]=\"getExpansionDetailRichContentContext(row, i)\"\n ></praxis-rich-content>\n } @else {\n @for (childNode of getExpansionDetailNodeChildren(tab); track $index) {\n <ng-container\n *ngTemplateOutlet=\"\n expansionDetailNodeTemplate;\n context: { $implicit: childNode, row: row, index: i }\n \"\n ></ng-container>\n }\n }\n </div>\n }\n }\n } @else {\n <div class=\"pfx-expansion-detail-message\">\n <praxis-rich-content\n rootClassName=\"pfx-expansion-detail-message__content\"\n [nodes]=\"getExpansionDetailTextRichContentNodes('Schema em layout tabs sem abas v\u00E1lidas.', 'pfx-expansion-detail-message__text')\"\n [context]=\"getExpansionDetailRichContentContext(row, i)\"\n ></praxis-rich-content>\n </div>\n }\n } @else {\n <div class=\"pfx-expansion-detail-stack\">\n @for (node of getExpansionDetailItems(detailState.schema); track $index) {\n <ng-container\n *ngTemplateOutlet=\"\n expansionDetailNodeTemplate;\n context: { $implicit: node, row: row, index: i }\n \"\n ></ng-container>\n }\n </div>\n }\n }\n\n <ng-template #expansionDetailNodeTemplate let-node let-row=\"row\" let-index=\"index\">\n @if (getExpansionDetailRichContentNodes(node, row, index); as richNodes) {\n <praxis-rich-content\n class=\"pfx-expansion-node-host\"\n [nodes]=\"richNodes\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n } @else {\n @switch (getExpansionDetailNodeType(node)) {\n @case ('list') {\n <section class=\"pfx-expansion-node pfx-expansion-node-list\">\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-list__title\"\n [nodes]=\"getExpansionDetailTextRichContentNodes(getExpansionDetailNodeTitle(node, 'Lista'), 'pfx-expansion-node-list__title-text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n @let listItems = getExpansionDetailListItems(row, node);\n @let listEntries = getExpansionDetailListEntries(row, node);\n @if (listItems.length) {\n <ul>\n @for (entry of listEntries; track $index) {\n <li>\n @if (getExpansionDetailListItemRichContentNodes(entry); as richNodes) {\n <praxis-rich-content\n class=\"pfx-expansion-node-list__item-host\"\n [nodes]=\"richNodes\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n } @else {\n {{ formatExpansionDetailListEntry(entry) }}\n }\n </li>\n }\n </ul>\n } @else {\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-placeholder\"\n [nodes]=\"getExpansionDetailTextRichContentNodes('Sem itens.', 'pfx-expansion-node-placeholder__text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n }\n </section>\n }\n @case ('detailList') {\n <section class=\"pfx-expansion-node pfx-expansion-node-rich-list\">\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-rich-list__title\"\n [nodes]=\"getExpansionDetailTextRichContentNodes(getExpansionDetailNodeTitle(node, 'Cole\u00E7\u00E3o rica'), 'pfx-expansion-node-rich-list__title-text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n @let richListEntries = getExpansionDetailRichListEntries(row, node);\n @if (richListEntries.length) {\n <div class=\"pfx-expansion-node-rich-list__items\">\n @for (entry of richListEntries; track $index) {\n <article [class]=\"getExpansionDetailRichListItemClassName(node)\">\n <praxis-rich-content\n class=\"pfx-expansion-node-rich-list__item-host\"\n [nodes]=\"getExpansionDetailRichListItemNodes(node)\"\n [context]=\"getExpansionDetailRichListItemContext(row, index, node, entry, $index)\"\n ></praxis-rich-content>\n @let itemActions = getExpansionDetailRichListItemActions(node, row, index, entry, $index);\n @if (itemActions.length) {\n <div class=\"pfx-expansion-node-rich-list__item-actions\">\n @for (action of itemActions; track action.actionId) {\n <button\n type=\"button\"\n mat-stroked-button\n class=\"pfx-expansion-node-rich-list__item-action-btn\"\n [disabled]=\"isExpansionDetailRichListItemActionDisabled(action, row, index, node, entry, $index)\"\n (click)=\"onExpansionDetailRichListItemAction(action, row, index, node, entry, $index, $event)\"\n >\n <praxis-rich-content\n class=\"pfx-expansion-node-rich-list__item-action-host\"\n [nodes]=\"getExpansionDetailRichListItemActionNodes(action)\"\n [context]=\"getExpansionDetailRichListItemContext(row, index, node, entry, $index)\"\n ></praxis-rich-content>\n </button>\n }\n </div>\n }\n </article>\n }\n </div>\n } @else {\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-placeholder\"\n [nodes]=\"getExpansionDetailTextRichContentNodes(getExpansionDetailRichListEmptyText(node), 'pfx-expansion-node-placeholder__text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n }\n </section>\n }\n @case ('card') {\n <section class=\"pfx-expansion-node pfx-expansion-node-card\">\n <header class=\"pfx-expansion-node-card__header\">\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-card__title\"\n [nodes]=\"getExpansionDetailTextRichContentNodes(getExpansionDetailNodeTitle(node, 'Card'), 'pfx-expansion-node-card__title-text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n @if (node?.subtitle) {\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-card__subtitle\"\n [nodes]=\"getExpansionDetailTextRichContentNodes(node.subtitle, 'pfx-expansion-node-card__subtitle-text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n }\n </header>\n @if (getExpansionDetailNodeChildren(node).length) {\n <div class=\"pfx-expansion-node-card__content\">\n @for (childNode of getExpansionDetailNodeChildren(node); track $index) {\n <ng-container\n *ngTemplateOutlet=\"\n expansionDetailNodeTemplate;\n context: { $implicit: childNode, row: row, index: index }\n \"\n ></ng-container>\n }\n </div>\n }\n </section>\n }\n @case ('cardGrid') {\n <section class=\"pfx-expansion-node pfx-expansion-node-card-grid\">\n @if (getExpansionDetailCardGridHeaderNodes(node); as cardGridHeaderNodes) {\n @if (cardGridHeaderNodes.length) {\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-card-grid__header\"\n [nodes]=\"cardGridHeaderNodes\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n }\n }\n @let gridCards = getExpansionDetailCardGridCards(node);\n @if (gridCards.length) {\n <div\n class=\"pfx-expansion-node-card-grid__cards\"\n [ngStyle]=\"getExpansionDetailCardGridStyles(node)\"\n >\n @for (card of gridCards; track $index) {\n <praxis-rich-content\n class=\"pfx-expansion-node-card-grid__card-host\"\n [nodes]=\"getExpansionDetailCardGridCardNodes(card)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n }\n </div>\n } @else {\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-placeholder\"\n [nodes]=\"getExpansionDetailTextRichContentNodes('Sem itens.', 'pfx-expansion-node-placeholder__text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n }\n </section>\n }\n @case ('richText') {\n <div\n class=\"pfx-expansion-node pfx-expansion-node-richtext\"\n [innerHTML]=\"getExpansionDetailRichText(node)\"\n ></div>\n }\n @case ('formRef') {\n <section class=\"pfx-expansion-node pfx-expansion-node-embed\">\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-embed__header\"\n [nodes]=\"getExpansionDetailEmbedHeaderNodes(node)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-embed__meta\"\n [nodes]=\"getExpansionDetailEmbedMetaNodes(node)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-embed__empty\"\n [nodes]=\"getExpansionDetailTextRichContentNodes(getExpansionDetailEmbedEmptyText(node), 'pfx-expansion-node-embed__empty-text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n @if (getExpansionDetailEmbedAction(node, row, index); as embedAction) {\n <button\n type=\"button\"\n mat-stroked-button\n class=\"pfx-expansion-node-embed__action-btn\"\n [disabled]=\"isExpansionDetailEmbedActionDisabled(embedAction, row, index)\"\n (click)=\"onExpansionDetailEmbedAction(embedAction, row, index, $event)\"\n >\n <praxis-rich-content\n class=\"pfx-expansion-node-embed__action-host\"\n [nodes]=\"getExpansionDetailEmbedActionNodes(embedAction)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n </button>\n }\n </section>\n }\n @case ('tableRef') {\n <section class=\"pfx-expansion-node pfx-expansion-node-embed\">\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-embed__header\"\n [nodes]=\"getExpansionDetailEmbedHeaderNodes(node)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-embed__meta\"\n [nodes]=\"getExpansionDetailEmbedMetaNodes(node)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-embed__empty\"\n [nodes]=\"getExpansionDetailTextRichContentNodes(getExpansionDetailEmbedEmptyText(node), 'pfx-expansion-node-embed__empty-text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n @if (getExpansionDetailEmbedAction(node, row, index); as embedAction) {\n <button\n type=\"button\"\n mat-stroked-button\n class=\"pfx-expansion-node-embed__action-btn\"\n [disabled]=\"isExpansionDetailEmbedActionDisabled(embedAction, row, index)\"\n (click)=\"onExpansionDetailEmbedAction(embedAction, row, index, $event)\"\n >\n <praxis-rich-content\n class=\"pfx-expansion-node-embed__action-host\"\n [nodes]=\"getExpansionDetailEmbedActionNodes(embedAction)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n </button>\n }\n </section>\n }\n @case ('chartRef') {\n @if (getExpansionDetailInlineRendererView(node, row, index); as inlineRenderer) {\n <section class=\"pfx-expansion-node pfx-expansion-node-embed pfx-expansion-node-embed--inline pfx-expansion-node-embed--chart\">\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-embed__header\"\n [nodes]=\"getExpansionDetailEmbedHeaderNodes(node)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n <ng-container\n *ngComponentOutlet=\"inlineRenderer.component; inputs: inlineRenderer.inputs\"\n ></ng-container>\n @if (getExpansionDetailEmbedAction(node, row, index); as embedAction) {\n <button\n type=\"button\"\n mat-stroked-button\n class=\"pfx-expansion-node-embed__action-btn\"\n [disabled]=\"isExpansionDetailEmbedActionDisabled(embedAction, row, index)\"\n (click)=\"onExpansionDetailEmbedAction(embedAction, row, index, $event)\"\n >\n <praxis-rich-content\n class=\"pfx-expansion-node-embed__action-host\"\n [nodes]=\"getExpansionDetailEmbedActionNodes(embedAction)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n </button>\n }\n </section>\n } @else {\n <section class=\"pfx-expansion-node pfx-expansion-node-embed\">\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-embed__header\"\n [nodes]=\"getExpansionDetailEmbedHeaderNodes(node)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-embed__meta\"\n [nodes]=\"getExpansionDetailEmbedMetaNodes(node)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-embed__empty\"\n [nodes]=\"getExpansionDetailTextRichContentNodes(getExpansionDetailEmbedEmptyText(node), 'pfx-expansion-node-embed__empty-text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n @if (getExpansionDetailEmbedAction(node, row, index); as embedAction) {\n <button\n type=\"button\"\n mat-stroked-button\n class=\"pfx-expansion-node-embed__action-btn\"\n [disabled]=\"isExpansionDetailEmbedActionDisabled(embedAction, row, index)\"\n (click)=\"onExpansionDetailEmbedAction(embedAction, row, index, $event)\"\n >\n <praxis-rich-content\n class=\"pfx-expansion-node-embed__action-host\"\n [nodes]=\"getExpansionDetailEmbedActionNodes(embedAction)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n </button>\n }\n </section>\n }\n }\n @case ('templateRef') {\n <section class=\"pfx-expansion-node pfx-expansion-node-embed\">\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-embed__header\"\n [nodes]=\"getExpansionDetailEmbedHeaderNodes(node)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-embed__meta\"\n [nodes]=\"getExpansionDetailEmbedMetaNodes(node)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-embed__empty\"\n [nodes]=\"getExpansionDetailTextRichContentNodes(getExpansionDetailEmbedEmptyText(node), 'pfx-expansion-node-embed__empty-text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n @if (getExpansionDetailEmbedAction(node, row, index); as embedAction) {\n <button\n type=\"button\"\n mat-stroked-button\n class=\"pfx-expansion-node-embed__action-btn\"\n [disabled]=\"isExpansionDetailEmbedActionDisabled(embedAction, row, index)\"\n (click)=\"onExpansionDetailEmbedAction(embedAction, row, index, $event)\"\n >\n <praxis-rich-content\n class=\"pfx-expansion-node-embed__action-host\"\n [nodes]=\"getExpansionDetailEmbedActionNodes(embedAction)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n </button>\n }\n </section>\n }\n @case ('diagramEmbed') {\n <section class=\"pfx-expansion-node pfx-expansion-node-embed\">\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-embed__header\"\n [nodes]=\"getExpansionDetailEmbedHeaderNodes(node)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-embed__meta\"\n [nodes]=\"getExpansionDetailEmbedMetaNodes(node)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n @if (getExpansionDetailDiagramSource(row, node); as diagramSource) {\n <div class=\"pfx-expansion-node-embed__diagram\">\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-embed__diagram-label\"\n [nodes]=\"getExpansionDetailTextRichContentNodes(getExpansionDetailDiagramSourceLabel(), 'pfx-expansion-node-embed__diagram-label-text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n <pre class=\"pfx-expansion-node-embed__diagram-source\">{{ diagramSource }}</pre>\n </div>\n } @else {\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-embed__empty\"\n [nodes]=\"getExpansionDetailTextRichContentNodes(getExpansionDetailEmbedEmptyText(node), 'pfx-expansion-node-embed__empty-text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n }\n @if (getExpansionDetailEmbedAction(node, row, index); as embedAction) {\n <button\n type=\"button\"\n mat-stroked-button\n class=\"pfx-expansion-node-embed__action-btn\"\n [disabled]=\"isExpansionDetailEmbedActionDisabled(embedAction, row, index)\"\n (click)=\"onExpansionDetailEmbedAction(embedAction, row, index, $event)\"\n >\n <praxis-rich-content\n class=\"pfx-expansion-node-embed__action-host\"\n [nodes]=\"getExpansionDetailEmbedActionNodes(embedAction)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n </button>\n }\n </section>\n }\n @case ('action') {\n <div class=\"pfx-expansion-node pfx-expansion-node-action\">\n <button\n type=\"button\"\n mat-stroked-button\n [disabled]=\"isExpansionDetailActionDisabled(node)\"\n (click)=\"onExpansionDetailAction(node, row, $event)\"\n >\n <praxis-rich-content\n class=\"pfx-expansion-node-action__content\"\n [nodes]=\"getExpansionDetailActionRichContentNodes(node)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n </button>\n @if (getExpansionDetailActionStatusText(node); as actionStatusText) {\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-action__status\"\n [nodes]=\"getExpansionDetailTextRichContentNodes(actionStatusText, 'pfx-expansion-node-action__status-text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n }\n </div>\n }\n @case ('actionBar') {\n <section class=\"pfx-expansion-node pfx-expansion-node-action-bar\">\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-action-bar__title\"\n [nodes]=\"getExpansionDetailTextRichContentNodes(getExpansionDetailActionBarTitle(node), 'pfx-expansion-node-action-bar__title-text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n @let actionBarActions = getExpansionDetailActionBarActions(node, row, index);\n @if (actionBarActions.length) {\n <div class=\"pfx-expansion-node-action-bar__actions\">\n @for (action of actionBarActions; track action.actionId) {\n <button\n type=\"button\"\n mat-stroked-button\n class=\"pfx-expansion-node-action-bar__action-btn\"\n [disabled]=\"isExpansionDetailActionBarActionDisabled(action, row, index)\"\n (click)=\"onExpansionDetailActionBarAction(action, row, index, $event)\"\n >\n <praxis-rich-content\n class=\"pfx-expansion-node-action-bar__action-host\"\n [nodes]=\"getExpansionDetailActionBarActionNodes(action)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n </button>\n }\n </div>\n } @else {\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-placeholder\"\n [nodes]=\"getExpansionDetailTextRichContentNodes(getExpansionDetailActionBarEmptyText(node), 'pfx-expansion-node-placeholder__text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n }\n </section>\n }\n @case ('tab') {\n <div class=\"pfx-expansion-node pfx-expansion-node-placeholder\">\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-placeholder__content\"\n [nodes]=\"getExpansionDetailTextRichContentNodes('Node', 'pfx-expansion-node-placeholder__text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n <code>tab</code>\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-placeholder__content\"\n [nodes]=\"getExpansionDetailTextRichContentNodes('fora de contexto de tabs.', 'pfx-expansion-node-placeholder__text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n </div>\n }\n @default {\n <div class=\"pfx-expansion-node pfx-expansion-node-placeholder\">\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-placeholder__content\"\n [nodes]=\"getExpansionDetailTextRichContentNodes('Node n\u00E3o suportado:', 'pfx-expansion-node-placeholder__text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n <code>{{ getExpansionDetailNodeType(node) }}</code>\n </div>\n }\n }\n }\n </ng-template>\n </section>\n </td>\n </ng-container>\n <tr\n mat-row\n *matRowDef=\"let row; columns: expansionDetailRowColumns; when: isExpansionDetailRow\"\n class=\"pfx-expansion-detail-row\"\n ></tr>\n }\n }\n </table>\n }\n\n <!-- Virtual rows path (header preserved above) -->\n @if (shouldRenderDataSurface() && !schemaError && !dataError && isVirtualized()) {\n <cdk-virtual-scroll-viewport\n class=\"ptable-viewport\"\n [itemSize]=\"getVirtItemHeight()\"\n [minBufferPx]=\"getVirtBufferSize() * getVirtItemHeight()\"\n [maxBufferPx]=\"getVirtBufferSize() * getVirtItemHeight() * 2\"\n [style.minHeight]=\"getVirtMinHeightHostStyle()\"\n >\n <table\n class=\"mat-mdc-table\"\n [ngClass]=\"getTableElevationClassName()\"\n [class.table-stack-top]=\"hasTopToolbarStack()\"\n [style.width]=\"getVirtualTableWidthStyle()\"\n >\n <tbody>\n <tr class=\"mat-mdc-row\"\n *cdkVirtualFor=\"let row of dataSource.data; let i = index; trackBy: trackByRow\"\n [class.pfx-row-selected]=\"selection.isSelected(row)\"\n [class.pfx-row-click-selectable]=\"isRowClickSelectable()\"\n [attr.aria-selected]=\"config.behavior?.selection?.enabled ? (selection.isSelected(row) ? 'true' : 'false') : null\"\n [ngClass]=\"getRowClasses(row)\"\n [ngStyle]=\"getRowNgStyle(row)\"\n [matTooltip]=\"getRowTooltip(row) || null\"\n [matTooltipDisabled]=\"!getRowTooltip(row)\"\n [matTooltipPosition]=\"getRowTooltipPosition(row)\"\n [matTooltipShowDelay]=\"getRowTooltipShowDelay(row)\"\n (click)=\"onRowClicked(row, i, $event)\"\n (dblclick)=\"onRowDoubleClicked(row, i)\">\n <!-- Selection column -->\n @if (isSelectionColumnEnabled()) { <td class=\"mat-mdc-cell\">\n <mat-checkbox\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleRow(row)\"\n [checked]=\"selection.isSelected(row)\">\n </mat-checkbox>\n </td> }\n <!-- Data columns -->\n @for (column of visibleColumns; track column.field) {\n <td class=\"mat-mdc-cell\"\n [style.text-align]=\"getColumnTextAlignStyle(column)\"\n [style.width]=\"getColumnWidthStyle(column)\"\n [attr.style]=\"getColumnCellAttrStyle(column)\"\n [ngClass]=\"getCellClasses(row, column)\"\n [ngStyle]=\"getCellNgStyle(row, column)\"\n [matTooltip]=\"getCellTooltip(row, column) || ''\"\n [matTooltipPosition]=\"getCellTooltipPosition(row, column)\"\n [matTooltipDisabled]=\"!getCellTooltip(row, column)\"\n [attr.title]=\"getCellTooltip(row, column) || null\">\n <div\n class=\"pfx-cell-content\"\n [ngClass]=\"getCellContentClasses(row, column)\"\n [ngStyle]=\"getCellContentNgStyle(row, column)\"\n >\n @switch (getEffectiveRendererType(row, column)) {\n @case ('icon') {\n <span class=\"pfx-icon-renderer\"\n [style.color]=\"getIconColor(row, column) || null\"\n [ngStyle]=\"getIconStyle(row, column)\"\n [attr.aria-label]=\"getIconAriaLabel(row, column) || null\">\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-icon-renderer__content\"\n [nodes]=\"getIconRichContentNodes(row, column)\"\n ></praxis-rich-content>\n </span>\n }\n @case ('image') {\n <span class=\"pfx-cell-image\">\n <praxis-rich-content\n rootClassName=\"pfx-cell-image__content\"\n [nodes]=\"getImageRichContentNodes(row, column)\"\n ></praxis-rich-content>\n </span>\n }\n @case ('badge') {\n @if (shouldRenderBadge(row, column)) {\n <span class=\"pfx-badge\" [ngClass]=\"getBadgeClasses(row, column)\">\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-badge__content\"\n [nodes]=\"getBadgeRichContentNodes(row, column)\"\n ></praxis-rich-content>\n </span>\n }\n }\n @case ('chip') {\n @if (shouldRenderChip(row, column)) {\n <span class=\"pfx-chip\" [ngClass]=\"getChipClasses(row, column)\">\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-chip__content\"\n [nodes]=\"getChipRichContentNodes(row, column)\"\n ></praxis-rich-content>\n </span>\n }\n }\n @case ('progress') {\n <div class=\"pfx-progress\">\n <praxis-rich-content\n rootClassName=\"pfx-progress__content\"\n [context]=\"getProgressRichContentContext(row, column)\"\n [nodes]=\"getProgressRichContentNodes(row, column)\"\n ></praxis-rich-content>\n </div>\n }\n @case ('microVisualization') {\n <span class=\"pfx-micro-viz-cell\" [innerHTML]=\"getMicroVisualizationHtml(row, column)\"></span>\n }\n @case ('avatar') {\n <span\n class=\"pfx-avatar-renderer\"\n [ngStyle]=\"getAvatarStyle(row, column)\"\n [class.shape-rounded]=\"getAvatarShape(row, column) === 'rounded'\"\n [class.shape-circle]=\"getAvatarShape(row, column) === 'circle'\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-avatar-renderer__content\"\n [nodes]=\"getAvatarRichContentNodes(row, column)\"\n ></praxis-rich-content>\n </span>\n }\n @case ('link') {\n <a\n class=\"pfx-link\"\n [attr.href]=\"getLinkHref(row, column) || null\"\n [attr.target]=\"getLinkTarget(row, column) || null\"\n [attr.rel]=\"getLinkRel(row, column) || null\"\n (click)=\"$event.stopPropagation()\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-link__content\"\n [nodes]=\"getLinkRichContentNodes(row, column)\"\n ></praxis-rich-content>\n </a>\n }\n @case ('button') {\n @switch (getButtonVariant(row, column)) {\n @case ('outlined') {\n <button\n mat-stroked-button\n [color]=\"getButtonColor(row, column) || null\"\n [disabled]=\"isButtonDisabled(row, column)\"\n [attr.aria-label]=\"getButtonAriaLabel(row, column) || getButtonLabel(row, column)\"\n (click)=\"onButtonClick(row, column, $event)\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-button-renderer__content\"\n [nodes]=\"getButtonRichContentNodes(row, column)\"\n ></praxis-rich-content>\n </button>\n }\n @case ('text') {\n <button\n mat-button\n [color]=\"getButtonColor(row, column) || null\"\n [disabled]=\"isButtonDisabled(row, column)\"\n [attr.aria-label]=\"getButtonAriaLabel(row, column) || getButtonLabel(row, column)\"\n (click)=\"onButtonClick(row, column, $event)\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-button-renderer__content\"\n [nodes]=\"getButtonRichContentNodes(row, column)\"\n ></praxis-rich-content>\n </button>\n }\n @default {\n <button\n mat-flat-button\n [color]=\"getButtonColor(row, column) || null\"\n [disabled]=\"isButtonDisabled(row, column)\"\n [attr.aria-label]=\"getButtonAriaLabel(row, column) || getButtonLabel(row, column)\"\n (click)=\"onButtonClick(row, column, $event)\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-button-renderer__content\"\n [nodes]=\"getButtonRichContentNodes(row, column)\"\n ></praxis-rich-content>\n </button>\n }\n }\n }\n @case ('menu') {\n <button\n mat-icon-button\n [matMenuTriggerFor]=\"menuRef\"\n (click)=\"$event.stopPropagation()\"\n [attr.aria-label]=\"getMenuAriaLabel(row, column) || 'Menu'\"\n >\n <praxis-rich-content\n rootClassName=\"pfx-menu-trigger__content\"\n [nodes]=\"getMenuTriggerRichContentNodes()\"\n ></praxis-rich-content>\n </button>\n <mat-menu #menuRef=\"matMenu\">\n @for (it of getMenuItems(row, column); track it.id) {\n <button\n mat-menu-item\n (click)=\"onMenuItemClick(it, row, $event)\"\n [disabled]=\"!it.__visible\"\n >\n <praxis-rich-content\n rootClassName=\"pfx-menu-item__content\"\n [nodes]=\"getMenuItemRichContentNodes(it)\"\n ></praxis-rich-content>\n </button>\n }\n </mat-menu>\n }\n @default {\n {{ getCellValue(row, column) }}\n }\n }\n </div>\n </td>\n }\n\n <!-- Actions column -->\n @if (config.actions?.row?.enabled) {\n <td class=\"mat-mdc-cell praxis-actions-cell\" [class.dense]=\"dense\" [style.width]=\"getRowActionsWidthStyle()\">\n <div\n class=\"praxis-actions-cell__content\"\n [class.praxis-actions-cell__content--discovering]=\"isRowDiscoveryPending(row)\"\n [attr.aria-busy]=\"isRowDiscoveryPending(row) ? 'true' : null\"\n >\n @if (config.actions?.row?.display === 'icons' || !config.actions?.row?.display) {\n @for (a of getInlineRowActions(row); track trackAction($index, a)) {\n <span\n class=\"praxis-row-action-anchor\"\n [class.praxis-row-action-anchor--workflow]=\"isWorkflowRowAction(a)\"\n [class.praxis-row-action-anchor--blocked]=\"isBlockedWorkflowRowAction(a, row)\"\n [matTooltip]=\"getActionTooltip(a, row)\"\n [matTooltipDisabled]=\"!getActionTooltip(a, row)\"\n matTooltipPosition=\"above\"\n matTooltipClass=\"praxis-tooltip\"\n >\n <button mat-icon-button class=\"praxis-icon-btn\"\n [class.praxis-icon-btn--workflow]=\"isWorkflowRowAction(a)\"\n [class.praxis-icon-btn--blocked]=\"isBlockedWorkflowRowAction(a, row)\"\n [disabled]=\"isActionDisabled(a, row)\"\n (click)=\"onRowAction(getActionId(a), row, $event, getRowActionRuntimeOptions(a, row))\"\n [attr.aria-label]=\"a.label || getActionId(a)\"\n [color]=\"a.color || null\">\n <praxis-rich-content\n layout=\"inline\"\n rootClassName=\"praxis-row-action__content\"\n [nodes]=\"getRowActionIconRichContentNodes(a)\"\n ></praxis-rich-content>\n </button>\n </span>\n }\n }\n @if (config.actions?.row?.display === 'buttons') {\n @for (a of getInlineRowActions(row); track trackAction($index, a)) {\n <span\n class=\"praxis-row-action-anchor\"\n [class.praxis-row-action-anchor--workflow]=\"isWorkflowRowAction(a)\"\n [class.praxis-row-action-anchor--blocked]=\"isBlockedWorkflowRowAction(a, row)\"\n [matTooltip]=\"getActionTooltip(a, row)\"\n [matTooltipDisabled]=\"!getActionTooltip(a, row)\"\n matTooltipPosition=\"above\"\n matTooltipClass=\"praxis-tooltip\"\n >\n <button mat-flat-button class=\"praxis-row-btn\"\n [class.praxis-row-btn--workflow]=\"isWorkflowRowAction(a)\"\n [class.praxis-row-btn--blocked]=\"isBlockedWorkflowRowAction(a, row)\"\n [disabled]=\"isActionDisabled(a, row)\"\n (click)=\"onRowAction(getActionId(a), row, $event, getRowActionRuntimeOptions(a, row))\"\n [attr.aria-label]=\"a.label || getActionId(a)\"\n [color]=\"a.color || null\">\n <praxis-rich-content\n layout=\"inline\"\n rootClassName=\"praxis-row-action__content\"\n [nodes]=\"getRowActionRichContentNodes(a)\"\n ></praxis-rich-content>\n </button>\n </span>\n }\n }\n @if (hasOverflowRowActions(row)) {\n <button mat-icon-button class=\"praxis-icon-btn praxis-more-btn\"\n [matMenuTriggerFor]=\"rowMoreMenuV\"\n (menuOpened)=\"onRowOverflowMenuOpened(row)\"\n [color]=\"getRowMenuButtonColor() || null\"\n [attr.aria-label]=\"getRowMenuTooltip(row)\"\n [matTooltip]=\"getRowMenuTooltip(row)\"\n matTooltipPosition=\"above\">\n <mat-icon [praxisIcon]=\"getRowMenuIcon()\"></mat-icon>\n </button>\n }\n <mat-menu #rowMoreMenuV=\"matMenu\" xPosition=\"before\">\n @if (hasRowOverflowMenuLoadingState(row)) {\n <button mat-menu-item disabled>\n <mat-icon>hourglass_empty</mat-icon>\n <praxis-rich-content\n rootClassName=\"praxis-row-overflow-menu__label\"\n [nodes]=\"getTableChromeTextRichContentNodes(getRowOverflowMenuLoadingLabel(), 'praxis-row-overflow-menu__label-text')\"\n ></praxis-rich-content>\n </button>\n }\n @for (a of getOverflowRowActions(row); track trackAction($index, a)) {\n <button mat-menu-item (click)=\"onRowAction(getActionId(a), row, $event, getRowActionRuntimeOptions(a, row))\" [disabled]=\"isActionDisabled(a, row)\">\n <mat-icon [color]=\"a.color || null\" [praxisIcon]=\"a.icon\"></mat-icon>\n <praxis-rich-content\n rootClassName=\"praxis-row-overflow-menu__label\"\n [nodes]=\"getTableChromeTextRichContentNodes(a.label || getActionId(a), 'praxis-row-overflow-menu__label-text')\"\n ></praxis-rich-content>\n </button>\n }\n @if (hasRowOverflowMenuEmptyState(row)) {\n <button mat-menu-item disabled>\n <mat-icon>info</mat-icon>\n <praxis-rich-content\n rootClassName=\"praxis-row-overflow-menu__label\"\n [nodes]=\"getTableChromeTextRichContentNodes(getRowOverflowMenuEmptyLabel(row), 'praxis-row-overflow-menu__label-text')\"\n ></praxis-rich-content>\n </button>\n }\n </mat-menu>\n </div>\n </td>\n }\n </tr>\n </tbody>\n </table>\n </cdk-virtual-scroll-viewport>\n }\n\n</div>\n@if (shouldShowLoadingSurface()) {\n <div class=\"ptable-loading-state\" role=\"status\" aria-live=\"polite\">\n <div class=\"ptable-loading-state__hero\" aria-hidden=\"true\">\n <span class=\"ptable-loading-state__line ptable-loading-state__line--wide\"></span>\n <span class=\"ptable-loading-state__line ptable-loading-state__line--short\"></span>\n <div class=\"ptable-loading-state__rows\">\n @for (placeholder of [1, 2, 3]; track placeholder) {\n <div class=\"ptable-loading-state__row\">\n <span class=\"ptable-loading-state__cell ptable-loading-state__cell--short\"></span>\n <span class=\"ptable-loading-state__cell\"></span>\n <span class=\"ptable-loading-state__cell ptable-loading-state__cell--wide\"></span>\n </div>\n }\n </div>\n </div>\n <div class=\"ptable-loading-state__message\">\n {{ getLoadingSurfaceMessage() }}\n </div>\n </div>\n}\n@if (shouldShowNoDataState()) {\n <div class=\"ptable-no-data-state\" role=\"status\" aria-live=\"polite\">\n <praxis-empty-state-card\n [icon]=\"getNoDataStateIcon()\"\n [title]=\"getNoDataStateTitle()\"\n [description]=\"getNoDataStateDescription()\"\n [primaryAction]=\"getNoDataStatePrimaryAction()\"\n [secondaryActions]=\"getNoDataStateSecondaryActions()\"\n [inline]=\"true\"\n ></praxis-empty-state-card>\n </div>\n}\n@if (\n shouldRenderDataSurface()\n && !schemaError\n && !dataError\n && shouldRenderFloatingBulkActions()\n && getFloatingBulkActions().length\n && !shouldHideFloatingBulkActions()\n ) {\n <div [class]=\"'praxis-floating-bulk-actions ' + getFloatingBulkPositionClass()\">\n @for (action of getFloatingBulkActions(); track getActionId(action)) {\n <button\n mat-mini-fab\n [color]=\"action.color || 'primary'\"\n [disabled]=\"isFloatingBulkActionDisabled(action)\"\n (click)=\"onToolbarAction({ action: getActionId(action), actionConfig: action })\"\n [attr.aria-label]=\"action.label || getActionId(action)\"\n [matTooltip]=\"action.label || getActionId(action)\"\n matTooltipPosition=\"left\"\n >\n <praxis-rich-content\n rootClassName=\"praxis-floating-bulk-actions__content\"\n [nodes]=\"getFloatingBulkActionRichContentNodes(action)\"\n ></praxis-rich-content>\n </button>\n }\n </div>\n}\n<!-- Barra de a\u00C3\u00A7\u00C3\u00B5es no rodap\u00C3\u00A9 (opcional) -->\n@if (shouldRenderDataSurface() && !schemaError && !dataError && showToolbar && shouldRenderFooterToolbar()) {\n <praxis-table-toolbar\n [config]=\"config\"\n [backgroundColor]=\"getToolbarActionsBackgroundColor()\"\n [style.--pfx-filter-h]=\"getToolbarLayoutHeightHostStyle()\"\n [class.footer-flat]=\"hasBottomPaginator()\"\n class=\"praxis-toolbar-footer\"\n placement=\"footer\"\n [showMain]=\"shouldShowFooterToolbarMain()\"\n [showEndActions]=\"shouldShowFooterToolbarEndActions()\"\n [showActionsGroup]=\"shouldShowToolbarActionsBottom()\"\n [showMobileActions]=\"shouldShowToolbarActionsBottom()\"\n [evaluationContext]=\"getToolbarEvaluationContext()\"\n [columnVisibilityController]=\"toolbarColumnVisibilityController\"\n [exportBusy]=\"exportBusy\"\n (toolbarAction)=\"onToolbarAction($event)\"\n (exportAction)=\"onExportAction($event)\"\n >\n @if (shouldShowFooterToolbarMain() && shouldRenderAdvancedFilter()) {\n <praxis-filter\n advancedFilter\n [resourcePath]=\"getAdvancedFilterResourcePath()\"\n [filterId]=\"tableId\"\n [formId]=\"tableId\"\n [persistenceKey]=\"getAdvancedFilterPersistenceKey()\"\n [fieldMetadata]=\"getAdvancedFilterFieldMetadata()\"\n [enableCustomization]=\"enableCustomization\"\n [value]=\"advancedFilterValue\"\n [alwaysVisibleFields]=\"getAdvancedFilterAlwaysVisibleFields()\"\n [alwaysVisibleFieldMetadataOverrides]=\"getAdvancedFilterAlwaysVisibleFieldMetadataOverrides()\"\n [selectedFieldIds]=\"config.behavior?.filtering?.advancedFilters?.settings?.selectedFieldIds ?? []\"\n [allowSaveTags]=\"config.behavior?.filtering?.advancedFilters?.settings?.allowSaveTags\"\n [changeDebounceMs]=\"config.behavior?.filtering?.advancedFilters?.settings?.changeDebounceMs ?? 300\"\n [i18n]=\"getFilterI18n()\"\n [mode]=\"'filter'\"\n [showFilterSettings]=\"enableCustomization\"\n (change)=\"onAdvancedFilterChange($event)\"\n (requestSearch)=\"onAdvancedFilterSubmit($event)\"\n (clear)=\"onAdvancedFilterClear()\"\n ></praxis-filter>\n }\n @if (shouldShowFooterToolbarMain() && shouldRenderAdvancedFilter()) {\n <ng-content select=\"[advancedFilter]\"></ng-content>\n }\n @if (shouldShowFooterToolbarMain() && shouldRenderAdvancedFilter()) {\n <ng-content select=\"[toolbar]\"></ng-content>\n }\n @if (shouldShowFooterToolbarMain() && shouldRenderAdvancedFilter()) {\n @if (shouldShowAiAssistantEntrypoint()) {\n <button\n end-actions\n mat-icon-button\n color=\"primary\"\n type=\"button\"\n class=\"praxis-table-ai-trigger praxis-table-toolbar-action--ai\"\n [class.praxis-table-ai-trigger--minimized]=\"hasMinimizedAiAssistantSession()\"\n [attr.data-testid]=\"aiAssistantTriggerTestId('footer')\"\n (click)=\"openAiAssistant()\"\n [attr.aria-label]=\"aiAssistantTriggerLabel()\"\n [matBadge]=\"aiAssistantTriggerBadge()\"\n [matBadgeHidden]=\"!hasMinimizedAiAssistantSession()\"\n matBadgeColor=\"accent\"\n matBadgeSize=\"small\"\n matBadgePosition=\"above after\"\n [matTooltip]=\"aiAssistantTriggerTooltip()\"\n matTooltipPosition=\"below\"\n >\n <mat-icon>{{ aiAssistantTriggerIcon() }}</mat-icon>\n </button>\n }\n }\n @if (shouldShowFooterToolbarMain() && shouldRenderAdvancedFilter() && enableCustomization) {\n <button\n end-actions\n mat-icon-button\n color=\"primary\"\n data-role=\"table-settings\"\n class=\"praxis-table-toolbar-action--configuration\"\n data-testid=\"table-settings-trigger\"\n (click)=\"openTableSettings()\"\n [attr.aria-label]=\"getTableSettingsLabel()\"\n [matBadge]=\"schemaOutdated ? '!' : ''\"\n [matBadgeHidden]=\"!schemaOutdated\"\n matBadgeColor=\"warn\"\n matBadgeSize=\"small\"\n matBadgePosition=\"above after\"\n [matTooltip]=\"getTableSettingsTooltip()\"\n matTooltipPosition=\"below\"\n >\n <mat-icon>settings</mat-icon>\n </button>\n }\n </praxis-table-toolbar>\n}\n@if (shouldRenderDataSurface() && !schemaError && !dataError && getPaginationEnabled() && (config.behavior?.pagination?.position === 'bottom' || config.behavior?.pagination?.position === 'both' || !config.behavior?.pagination?.position)) {\n <mat-paginator\n [length]=\"getPaginationLength()\"\n [pageSize]=\"getPaginationPageSize()\"\n [pageSizeOptions]=\"getPaginationPageSizeOptions()\"\n [selectConfig]=\"paginatorSelectConfig\"\n [showFirstLastButtons]=\"getPaginationShowFirstLast()\"\n (page)=\"onPageChange($event)\"\n [class.compact]=\"config.behavior?.pagination?.style === 'compact'\"\n [class.footer-stack]=\"shouldShowToolbarActionsBottom()\"\n >\n </mat-paginator>\n}\n", styles: ["@charset \"UTF-8\";table{width:100%}.praxis-visually-hidden-status{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}.praxis-column-reorder-status{margin:8px 0;padding:10px 12px;border-radius:8px;border:1px solid var(--p-table-border-color);background:var(--p-table-row-hover-bg);color:var(--p-table-header-fg);font-size:12px;line-height:1.4;box-shadow:0 4px 12px #00000014;animation:pfx-column-reorder-status-in var(--p-table-drag-status-enter-duration, .18s) var(--p-table-motion-easing, cubic-bezier(0, 0, .2, 1))}@keyframes pfx-column-reorder-status-in{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}.praxis-actions-cell{height:100%;padding-inline:12px;white-space:nowrap}.pfx-expansion-col-header,.pfx-expansion-col-cell{width:52px;min-width:52px;text-align:center}.pfx-expansion-toggle:focus-visible{outline:2px solid var(--md-sys-color-primary);outline-offset:2px}.pfx-expansion-detail-row{background:var(--md-sys-color-surface-container-low)}.pfx-expansion-detail-cell{padding:0!important;border-bottom:1px solid var(--p-table-border-color)}.pfx-expansion-detail-panel{padding:12px 16px;border-left:3px solid var(--md-sys-color-primary)}.pfx-expansion-detail-panel.pfx-expansion-motion-none{animation:none;transition:none}.pfx-expansion-detail-panel.pfx-expansion-motion-subtle-slide{animation:pfx-expansion-subtle-slide-in var(--pfx-expansion-motion-duration, .16s) var(--pfx-expansion-motion-easing, cubic-bezier(.2, 0, 0, 1))}.pfx-expansion-detail-panel.pfx-expansion-motion-accordion{animation:pfx-expansion-accordion-in var(--pfx-expansion-motion-duration, .18s) var(--pfx-expansion-motion-easing, cubic-bezier(.2, 0, 0, 1));transform-origin:top center}.pfx-expansion-detail-panel.pfx-expansion-motion-fade-scale{animation:pfx-expansion-fade-scale-in var(--pfx-expansion-motion-duration, .16s) var(--pfx-expansion-motion-easing, cubic-bezier(.2, 0, 0, 1));transform-origin:top center}@keyframes pfx-expansion-subtle-slide-in{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}@keyframes pfx-expansion-accordion-in{0%{opacity:0;transform:scaleY(.96)}to{opacity:1;transform:scaleY(1)}}@keyframes pfx-expansion-fade-scale-in{0%{opacity:0;transform:translateY(-2px) scale(.985)}to{opacity:1;transform:translateY(0) scale(1)}}.pfx-expansion-detail-schema{margin:0;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:12px;line-height:1.4;white-space:pre-wrap;word-break:break-word;color:var(--md-sys-color-on-surface-variant)}.pfx-expansion-detail-message{font-size:13px;color:var(--md-sys-color-on-surface-variant)}.pfx-expansion-detail-message--error{color:var(--md-sys-color-error)}.pfx-expansion-detail-stack{display:grid;gap:10px}.pfx-expansion-detail-tabs{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:10px}.pfx-expansion-detail-tab-btn{border:1px solid var(--p-table-border-color);background:var(--md-sys-color-surface);color:var(--md-sys-color-on-surface);border-radius:999px;padding:6px 12px;font-size:12px;line-height:1.2;cursor:pointer}.pfx-expansion-detail-tab-btn__content{display:inline-flex;align-items:center;gap:6px;min-width:0}.pfx-expansion-detail-tab-btn__icon .prx-rich-icon{font-size:16px;line-height:1}.pfx-expansion-detail-tab-btn__title{white-space:nowrap}.pfx-expansion-detail-tab-btn__badge .prx-rich-badge{padding:0 8px;min-height:18px;background:color-mix(in srgb,currentColor 12%,transparent);color:inherit}.pfx-expansion-detail-tab-btn.is-active{border-color:var(--md-sys-color-primary);color:var(--md-sys-color-primary);font-weight:600}.pfx-expansion-detail-tab-btn:focus-visible{outline:2px solid var(--md-sys-color-primary);outline-offset:2px}.pfx-expansion-detail-tab-panel{display:grid;gap:10px}.pfx-expansion-node{border:1px solid var(--p-table-border-color);border-radius:8px;padding:10px 12px;background:var(--md-sys-color-surface)}.pfx-expansion-node-card__header{margin-bottom:8px}.pfx-expansion-node-card__title{margin:0;font-size:14px;line-height:1.3}.pfx-expansion-node-card__subtitle{margin:4px 0 0;font-size:12px;color:var(--md-sys-color-on-surface-variant)}.pfx-expansion-node-card__content{display:grid;gap:10px}.pfx-expansion-node-value{display:flex;align-items:baseline;gap:8px}.pfx-expansion-node-value__label{color:var(--md-sys-color-on-surface-variant);font-size:12px}.pfx-expansion-node-value__content{font-size:14px}.pfx-expansion-node-list__title{margin:0 0 6px;font-size:13px}.pfx-expansion-node-list ul{margin:0;padding-left:18px}.pfx-expansion-node-rich-list__title{margin:0 0 8px;font-size:13px}.pfx-expansion-node-rich-list__items{display:grid;gap:12px}.pfx-expansion-node-rich-list__item{display:grid;gap:10px;padding:12px;border:1px solid var(--md-sys-color-outline-variant, #d7dbe5);border-radius:14px;background:var(--md-sys-color-surface-container-lowest, #fff)}.pfx-expansion-node-rich-list__item--row{grid-template-columns:minmax(0,1fr) auto;align-items:center}.pfx-expansion-node-rich-list__item--stack{grid-template-columns:minmax(0,1fr)}.pfx-expansion-node-rich-list__item--card-list{grid-template-columns:minmax(0,1fr);box-shadow:0 4px 14px #0f172a0a}.pfx-expansion-node-rich-list__item-host{min-width:0}.pfx-expansion-node-rich-list__item-actions{display:flex;flex-wrap:wrap;gap:8px;align-items:center}.pfx-expansion-node-rich-list__item-action-btn{min-width:0}.pfx-expansion-node-rich-list__item-action-host{display:inline-flex;align-items:center}.pfx-expansion-node-action-bar__title{margin:0 0 12px}.pfx-expansion-node-action-bar__actions{display:flex;flex-wrap:wrap;gap:8px;align-items:center}.pfx-expansion-node-action-bar__action-btn{min-width:0}.pfx-expansion-node-action-bar__action-host{display:inline-flex;align-items:center}.pfx-expansion-node-card-grid__header{margin:0 0 12px}.pfx-expansion-node-card-grid__cards{display:grid;gap:12px;grid-template-columns:var(--pfx-expansion-card-grid-columns, repeat(auto-fit, minmax(var(--pfx-expansion-card-grid-min-width, 220px), 1fr)))}.pfx-expansion-node-card-grid__card-host{min-width:0}.pfx-expansion-node-card-grid__card-host [data-rich-node-type=card]{height:100%}.pfx-expansion-node-richtext :where(p,ul,ol,h1,h2,h3,h4,h5,h6){margin-top:0;margin-bottom:8px}.pfx-expansion-node-placeholder{font-size:12px;color:var(--md-sys-color-on-surface-variant)}:host.density-compact{--p-table-header-height-default: 32px;--p-table-row-height-default: 30px;--p-header-padding-default: 4px 8px;--p-cell-padding-default: 3px 8px;--p-header-font-size-default: 11.5px;--p-cell-font-size-default: 12px;--p-actions-btn-size-default: 28px;--p-actions-icon-size-default: 15px;--p-actions-more-btn-size-default: 28px;--p-actions-more-icon-size-default: 15px;--p-table-paginator-container-min-height-default: 32px;--p-table-paginator-container-padding-default: 2px 8px;--p-table-paginator-container-gap-default: 6px;--p-table-paginator-select-width-default: 64px;--p-table-paginator-select-height-default: 28px;--p-table-paginator-select-padding-inline-default: 8px 6px;--p-table-paginator-action-size-default: 28px}:host.density-comfortable{--p-table-header-height-default: 40px;--p-table-row-height-default: 44px;--p-header-padding-default: 10px 14px;--p-cell-padding-default: 10px 14px;--p-header-font-size-default: inherit;--p-cell-font-size-default: inherit;--p-actions-btn-size-default: 36px;--p-actions-icon-size-default: 18px;--p-actions-more-btn-size-default: 36px;--p-actions-more-icon-size-default: 18px;--p-table-paginator-container-min-height-default: 44px;--p-table-paginator-container-padding-default: 6px 10px;--p-table-paginator-container-gap-default: 10px;--p-table-paginator-select-width-default: 78px;--p-table-paginator-select-height-default: 36px;--p-table-paginator-select-padding-inline-default: 12px 10px;--p-table-paginator-action-size-default: 36px}:host.density-spacious{--p-table-header-height-default: 52px;--p-table-row-height-default: 56px;--p-header-padding-default: 16px 20px;--p-cell-padding-default: 16px 20px;--p-header-font-size-default: inherit;--p-cell-font-size-default: inherit;--p-actions-btn-size-default: 44px;--p-actions-icon-size-default: 24px;--p-actions-more-btn-size-default: 44px;--p-actions-more-icon-size-default: 24px;--p-table-paginator-container-min-height-default: 52px;--p-table-paginator-container-padding-default: 8px 14px;--p-table-paginator-container-gap-default: 12px;--p-table-paginator-select-width-default: 86px;--p-table-paginator-select-height-default: 40px;--p-table-paginator-select-padding-inline-default: 14px 12px;--p-table-paginator-action-size-default: 40px}@media(pointer:coarse){:host.density-compact{--p-table-row-height-default: 44px;--p-table-header-height-default: 44px;--p-table-paginator-container-min-height-default: 44px;--p-table-paginator-action-size-default: 40px}}:host.density-compact .praxis-actions-cell{padding-inline:8px}:host.density-spacious .praxis-actions-cell{padding-inline:16px}.praxis-actions-cell__content{display:flex;align-items:center;justify-content:flex-end;gap:6px;width:100%;transition:opacity .12s ease}.praxis-actions-cell.dense .praxis-actions-cell__content{gap:6px}.praxis-actions-cell__content--discovering{opacity:.78}.praxis-row-action-anchor{display:inline-flex;align-items:center}.praxis-row-action-anchor--workflow{position:relative}.praxis-row-action-anchor--workflow:after{content:\"\";position:absolute;right:4px;top:4px;width:6px;height:6px;border-radius:999px;background:var(--md-sys-color-secondary);opacity:.9;pointer-events:none}.praxis-row-action-anchor--blocked:after{background:var(--md-sys-color-error)}.praxis-icon-btn{width:var(--p-actions-btn-size, var(--p-actions-btn-size-default, 40px));height:var(--p-actions-btn-size, var(--p-actions-btn-size-default, 40px));border:0;background:transparent;padding:0;display:inline-flex;align-items:center;justify-content:center;border-radius:9999px;cursor:pointer;--mat-icon-button-state-layer-size: var(--p-actions-btn-size, var(--p-actions-btn-size-default, 40px))}.praxis-icon-btn:hover{background:var(--md-sys-color-surface-variant)}.praxis-icon-btn:focus-visible{outline:2px solid var(--md-sys-color-primary);outline-offset:2px}.praxis-icon-btn mat-icon,.praxis-icon-btn .mat-icon{font-size:var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px));width:var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px));height:var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px));line-height:var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px))}.praxis-icon-btn praxis-rich-content{display:inline-flex;align-items:center;justify-content:center;width:var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px));height:var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px));line-height:var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px))}:host ::ng-deep .praxis-icon-btn .praxis-row-action__content,:host ::ng-deep .praxis-icon-btn .praxis-row-action__icon{display:inline-flex;align-items:center;justify-content:center;width:var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px));height:var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px));line-height:var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px))}:host ::ng-deep .praxis-icon-btn .praxis-row-action__icon .prx-rich-icon{font-size:var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px));width:var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px));height:var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px));line-height:var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px))}.praxis-icon-btn--workflow{background:color-mix(in srgb,var(--md-sys-color-secondary-container) 36%,transparent)}.praxis-icon-btn--blocked{background:color-mix(in srgb,var(--md-sys-color-error-container) 42%,transparent)}.praxis-more-btn{width:var(--p-actions-more-btn-size, var(--p-actions-more-btn-size-default, var(--p-actions-btn-size, var(--p-actions-btn-size-default, 40px))));height:var(--p-actions-more-btn-size, var(--p-actions-more-btn-size-default, var(--p-actions-btn-size, var(--p-actions-btn-size-default, 40px))));--mat-icon-button-state-layer-size: var(--p-actions-more-btn-size, var(--p-actions-more-btn-size-default, var(--p-actions-btn-size, var(--p-actions-btn-size-default, 40px))));background-image:var(--p-actions-more-btn-gradient, none);background-size:100% 100%;background-repeat:no-repeat}.praxis-more-btn mat-icon,.praxis-more-btn .mat-icon{font-size:var(--p-actions-more-icon-size, var(--p-actions-more-icon-size-default, var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px))));width:var(--p-actions-more-icon-size, var(--p-actions-more-icon-size-default, var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px))));height:var(--p-actions-more-icon-size, var(--p-actions-more-icon-size-default, var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px))));line-height:var(--p-actions-more-icon-size, var(--p-actions-more-icon-size-default, var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px))));color:var(--p-actions-more-icon-color);background-image:var(--p-actions-more-icon-gradient, none);-webkit-background-clip:text;background-clip:text}.praxis-row-btn--workflow{box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--md-sys-color-secondary) 28%,transparent)}.praxis-row-btn--blocked{box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--md-sys-color-error) 28%,transparent)}.praxis-icon-btn.destructive mat-icon{color:var(--md-sys-color-error)}.mat-mdc-tooltip.praxis-tooltip{margin-top:-8px;margin-bottom:8px}.spacer{flex:1 1 auto}.praxis-table-header{display:flex;flex-wrap:wrap;align-items:flex-start;gap:6px;margin:10px 0 8px;width:100%;clear:both;position:relative}.praxis-table-header.stacked{margin:0}.praxis-table-header>praxis-table-toolbar{flex:1 0 100%}.praxis-floating-bulk-actions{position:fixed;z-index:var(--praxis-layer-floating-local, 200);display:inline-flex;align-items:center;gap:8px;padding:8px;border-radius:999px;background:var(--md-sys-color-surface-container-highest);box-shadow:0 8px 20px #00000029}.praxis-floating-bulk-actions.pos-bottom-right{right:20px;bottom:20px}.praxis-floating-bulk-actions.pos-bottom-left{left:20px;bottom:20px}.praxis-floating-bulk-actions.pos-top-right{right:20px;top:20px}.praxis-floating-bulk-actions.pos-top-left{left:20px;top:20px}@media(max-width:768px){.praxis-floating-bulk-actions{gap:6px;padding:6px}.praxis-floating-bulk-actions.pos-bottom-right{right:12px;left:auto;bottom:12px}.praxis-floating-bulk-actions.pos-bottom-left{left:12px;right:auto;bottom:12px}.praxis-floating-bulk-actions.pos-top-right{right:12px;left:auto;top:12px}.praxis-floating-bulk-actions.pos-top-left{left:12px;right:auto;top:12px}}:host{display:block;width:100%;min-width:0;max-width:100%;--pfx-toolbar-pad-y: 6px;--pfx-toolbar-pad-x: 12px;--p-table-bg: var(--md-sys-color-surface-container-highest);--p-table-text-color: var(--md-sys-color-on-surface);--p-table-header-bg: var(--md-sys-color-surface-container-highest);--p-table-header-fg: var(--md-sys-color-on-surface);--p-table-border-color: var(--md-sys-color-outline-variant);--p-table-row-even-bg: var(--md-sys-color-surface-container);--p-table-row-hover-bg: var(--md-sys-color-surface-container-high);--p-table-row-selected-bg: var(--md-sys-color-primary-container);--p-table-row-selected-fg: var(--md-sys-color-on-primary-container);--p-table-row-selected-font-weight: 600;--p-table-row-selected-indicator: linear-gradient( 180deg, var(--md-sys-color-primary), var(--md-sys-color-secondary) );--p-table-badge-soft-primary-bg: var(--md-sys-color-primary-container);--p-table-badge-soft-primary-fg: var(--md-sys-color-on-primary-container);--p-table-badge-soft-accent-bg: var(--md-sys-color-secondary-container);--p-table-badge-soft-accent-fg: var(--md-sys-color-on-secondary-container);--p-table-badge-soft-warn-bg: var(--md-sys-color-error-container);--p-table-badge-soft-warn-fg: var(--md-sys-color-on-error-container);--p-table-state-success-bg: var(--md-sys-color-tertiary-container);--p-table-state-success-fg: var(--md-sys-color-on-tertiary-container);--p-table-state-warning-bg: var(--md-sys-color-secondary-container);--p-table-state-warning-fg: var(--md-sys-color-on-secondary-container);--p-table-state-danger-bg: var(--md-sys-color-error-container);--p-table-state-danger-fg: var(--md-sys-color-on-error-container);--p-table-state-highlight-bg: var(--md-sys-color-primary-container);--p-table-state-highlight-fg: var(--md-sys-color-on-primary-container);--p-table-reorder-transition-duration: .16s;--p-table-drag-preview-scale: 1.01;--p-table-drag-status-enter-duration: .18s;--p-table-drag-preview-shadow: 0 14px 32px rgba(0, 0, 0, .28), 0 0 0 1px var(--p-table-border-color);--p-table-column-resize-hit-area: 10px;--p-table-column-resize-line-width: 1px;--p-table-column-resize-separator-color: color-mix( in srgb, var(--p-table-border-color) 78%, transparent );--p-table-column-resize-separator-hover-color: var(--md-sys-color-primary);--p-table-column-resize-active-color: var(--md-sys-color-primary)}:host ::ng-deep .mat-mdc-table{background:var(--p-table-bg);color:var(--p-table-text-color);border-radius:12px 12px 0 0;width:100%;box-shadow:var(--p-table-surface-shadow);transition:box-shadow var(--p-table-selection-transition-duration, .18s) var(--p-table-motion-easing, cubic-bezier(0, 0, .2, 1))}:host ::ng-deep .mat-mdc-table:hover{box-shadow:var(--p-table-surface-shadow-hover, var(--p-table-surface-shadow))}:host ::ng-deep .mat-mdc-table.pfx-column-resize-enabled{table-layout:fixed}:host ::ng-deep .mat-mdc-table.table-stack-top{border-top-left-radius:0;border-top-right-radius:0}:host ::ng-deep .praxis-toolbar-footer{border:0 solid var(--p-table-border-color);border-top:0;border-radius:0;background:var(--p-table-bg)}:host ::ng-deep .mat-mdc-paginator.footer-stack{border-top-left-radius:0;border-top-right-radius:0;border-top:0}:host ::ng-deep .mat-mdc-paginator.footer-stack .mat-mdc-paginator-container{padding:var(--p-table-paginator-footer-stack-padding, 6px 10px)}:host ::ng-deep .mat-mdc-paginator{--p-table-paginator-bg-default: color-mix( in srgb, var(--p-table-bg) 94%, var(--md-sys-color-surface, white) 6% );--p-table-paginator-border-color-default: color-mix(in srgb, var(--p-table-border-color) 82%, transparent);--p-table-paginator-select-bg-default: color-mix(in srgb, var(--p-table-bg) 88%, var(--p-table-text-color) 12%);--p-table-paginator-select-border-color-default: color-mix( in srgb, var(--p-table-border-color) 74%, transparent );--p-table-paginator-select-border-color-hover-default: color-mix( in srgb, var(--md-sys-color-primary) 36%, var(--p-table-border-color) );--p-table-paginator-select-border-color-focus-default: color-mix( in srgb, var(--md-sys-color-primary) 72%, var(--p-table-border-color) );--p-table-paginator-select-focus-ring-default: color-mix(in srgb, var(--md-sys-color-primary) 18%, transparent);--p-table-paginator-select-radius-default: 999px;--p-table-paginator-select-shadow-default: inset 0 1px 0 color-mix(in srgb, var(--md-sys-color-on-surface) 8%, transparent);--p-table-paginator-select-text-color-default: var(--p-table-text-color);--p-table-paginator-select-icon-color-default: color-mix(in srgb, var(--p-table-text-color) 72%, transparent);--p-table-paginator-range-text-color-default: color-mix(in srgb, var(--p-table-text-color) 78%, transparent);border-top:1px solid var(--p-table-paginator-border-color, var(--p-table-paginator-border-color-default));background:var(--p-table-paginator-bg, var(--p-table-paginator-bg-default))}:host ::ng-deep .mat-mdc-paginator .mat-mdc-paginator-container{min-height:var(--p-table-paginator-container-min-height, var(--p-table-paginator-container-min-height-default, 44px));padding:var(--p-table-paginator-container-padding, var(--p-table-paginator-container-padding-default, 6px 10px));gap:var(--p-table-paginator-container-gap, var(--p-table-paginator-container-gap-default, 10px))}:host ::ng-deep .mat-mdc-paginator.compact{--p-table-paginator-container-min-height-default: 30px;--p-table-paginator-container-padding-default: 2px 8px;--p-table-paginator-container-gap-default: 6px;--p-table-paginator-select-width-default: 62px;--p-table-paginator-select-height-default: 28px;--p-table-paginator-select-padding-inline-default: 8px 6px;--p-table-paginator-action-size-default: 28px}:host ::ng-deep .mat-mdc-paginator .mat-mdc-icon-button{width:var(--p-table-paginator-action-size, var(--p-table-paginator-action-size-default, 36px));height:var(--p-table-paginator-action-size, var(--p-table-paginator-action-size-default, 36px));display:inline-grid;place-items:center;padding:0;line-height:0;--mdc-icon-button-state-layer-size: var(--p-table-paginator-action-size, var(--p-table-paginator-action-size-default, 36px));--mat-icon-button-state-layer-size: var(--p-table-paginator-action-size, var(--p-table-paginator-action-size-default, 36px))}:host ::ng-deep .mat-mdc-paginator .mat-mdc-paginator-icon{display:block;flex:0 0 auto;margin:0}.praxis-table-ai-trigger{transition:background-color .16s ease,box-shadow .16s ease,color .16s ease}.praxis-table-ai-trigger--minimized{background:color-mix(in srgb,var(--md-sys-color-primary-container, rgba(59, 130, 246, .22)) 72%,transparent);color:var(--md-sys-color-on-primary-container, var(--md-sys-color-primary, #2563eb));box-shadow:0 0 0 1px color-mix(in srgb,var(--md-sys-color-primary, #2563eb) 34%,transparent),0 8px 20px color-mix(in srgb,var(--md-sys-color-primary, #2563eb) 16%,transparent)}.praxis-table-ai-trigger--minimized:hover,.praxis-table-ai-trigger--minimized:focus-visible{background:color-mix(in srgb,var(--md-sys-color-primary-container, rgba(59, 130, 246, .22)) 86%,transparent)}:host ::ng-deep .mat-mdc-paginator .mat-mdc-paginator-page-size-select{margin-left:4px;width:var(--p-table-paginator-select-width, var(--p-table-paginator-select-width-default, 78px))}:host ::ng-deep .mat-mdc-paginator .mat-mdc-paginator-page-size-select .mat-mdc-text-field-wrapper{--mdc-outlined-text-field-container-color: var( --p-table-paginator-select-bg, var(--p-table-paginator-select-bg-default) );--mdc-outlined-text-field-input-text-color: var( --p-table-paginator-select-text-color, var(--p-table-paginator-select-text-color-default) );min-height:var(--p-table-paginator-select-height, var(--p-table-paginator-select-height-default, 36px));height:var(--p-table-paginator-select-height, var(--p-table-paginator-select-height-default, 36px));padding-inline:var(--p-table-paginator-select-padding-inline, var(--p-table-paginator-select-padding-inline-default, 12px 10px));border:1px solid var(--p-table-paginator-select-border-color, var(--p-table-paginator-select-border-color-default));border-radius:var(--p-table-paginator-select-radius, var(--p-table-paginator-select-radius-default));background:var(--p-table-paginator-select-bg, var(--p-table-paginator-select-bg-default))!important;background-color:var(--p-table-paginator-select-bg, var(--p-table-paginator-select-bg-default))!important;color:var(--p-table-paginator-select-text-color, var(--p-table-paginator-select-text-color-default))!important;box-shadow:var(--p-table-paginator-select-shadow, var(--p-table-paginator-select-shadow-default))}:host ::ng-deep .mat-mdc-paginator .mat-mdc-paginator-page-size-select .mat-mdc-text-field-wrapper:hover{border-color:var(--p-table-paginator-select-border-color-hover, var(--p-table-paginator-select-border-color-hover-default))}:host ::ng-deep .mat-mdc-paginator .mat-mdc-paginator-page-size-select.mat-focused .mat-mdc-text-field-wrapper{border-color:var(--p-table-paginator-select-border-color-focus, var(--p-table-paginator-select-border-color-focus-default));box-shadow:0 0 0 3px var(--p-table-paginator-select-focus-ring, var(--p-table-paginator-select-focus-ring-default)),var(--p-table-paginator-select-shadow, var(--p-table-paginator-select-shadow-default))}:host ::ng-deep .mat-mdc-paginator .mat-mdc-paginator-page-size-select .mat-mdc-form-field-flex{min-height:var(--p-table-paginator-select-height, var(--p-table-paginator-select-height-default, 36px));align-items:center}:host ::ng-deep .mat-mdc-paginator .mat-mdc-paginator-page-size-select .mat-mdc-form-field-infix{display:flex;align-items:center;min-height:var(--p-table-paginator-select-height, var(--p-table-paginator-select-height-default, 36px));padding-block:0;width:auto}:host ::ng-deep .mat-mdc-paginator .mat-mdc-paginator-page-size-select .mat-mdc-select-trigger{min-height:var(--p-table-paginator-select-height, var(--p-table-paginator-select-height-default, 36px));padding-right:2px;color:var(--p-table-paginator-select-text-color, var(--p-table-paginator-select-text-color-default))}:host ::ng-deep .mat-mdc-paginator .mat-mdc-paginator-page-size-select .mat-mdc-select-arrow{color:var(--p-table-paginator-select-icon-color, var(--p-table-paginator-select-icon-color-default))}:host ::ng-deep .mat-mdc-paginator .mat-mdc-paginator-page-size-select .mdc-notched-outline__leading,:host ::ng-deep .mat-mdc-paginator .mat-mdc-paginator-page-size-select .mdc-notched-outline__notch,:host ::ng-deep .mat-mdc-paginator .mat-mdc-paginator-page-size-select .mdc-notched-outline__trailing{border-color:transparent!important;border-width:0!important}:host ::ng-deep .mat-mdc-paginator .mat-mdc-paginator-page-size-select .mat-mdc-form-field-subscript-wrapper{display:none}:host ::ng-deep .mat-mdc-paginator .mat-mdc-paginator-range-label{font-size:12px;font-weight:600;color:var(--p-table-paginator-range-text-color, var(--p-table-paginator-range-text-color-default))}:host ::ng-deep .mat-mdc-paginator .mat-mdc-select-value-text{font-size:12px;font-weight:700;color:var(--p-table-paginator-select-text-color, var(--p-table-paginator-select-text-color-default))}::ng-deep .praxis-table-paginator-select-panel.mat-mdc-select-panel{--mat-select-panel-background-color: var(--md-sys-color-surface-container, #fff);background:var(--md-sys-color-surface-container, #fff)!important;background-color:var(--md-sys-color-surface-container, #fff)!important;border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant, #d7dbe5) 70%,transparent);box-shadow:0 12px 28px color-mix(in srgb,var(--md-sys-color-shadow, #000) 28%,transparent)}::ng-deep .praxis-table-paginator-select-panel .mat-mdc-option{--mat-option-label-text-color: var(--md-sys-color-on-surface, #111827);color:var(--md-sys-color-on-surface, #111827)!important}::ng-deep .praxis-table-paginator-select-panel .mat-mdc-option:hover:not(.mdc-list-item--disabled),::ng-deep .praxis-table-paginator-select-panel .mat-mdc-option.mat-mdc-option-active{--mat-option-hover-state-layer-color: color-mix( in srgb, var(--md-sys-color-primary, #2f7cff) 14%, transparent );background:color-mix(in srgb,var(--md-sys-color-primary, #2f7cff) 14%,transparent)!important;color:var(--md-sys-color-on-surface, #111827)!important}:host [data-role=table-settings].mat-mdc-icon-button{--mdc-icon-button-icon-color: var(--md-sys-color-primary);color:var(--md-sys-color-primary)}.pfx-link{color:var(--md-sys-color-primary);text-decoration:underline;cursor:pointer}.pfx-chip{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;border-radius:10px;font-size:12px;line-height:1;border:1px solid transparent;white-space:nowrap;--prx-rich-content-inline-gap: 6px}.pfx-chip-icon{font-size:14px;width:14px;height:14px}.pfx-chip--plain{background:transparent;border-color:transparent;color:var(--md-sys-color-on-surface)}.pfx-chip--outlined{background:transparent;border-color:var(--md-sys-color-outline-variant);color:var(--md-sys-color-on-surface)}.pfx-chip--filled-primary{background:var(--md-sys-color-primary);color:var(--md-sys-color-on-primary)}.pfx-chip--filled-accent{background:var(--md-sys-color-secondary);color:var(--md-sys-color-on-secondary)}.pfx-chip--filled-warn,.pfx-chip--filled-danger{background:var(--md-sys-color-error);color:var(--md-sys-color-on-error)}.pfx-chip--filled-success{background:var(--p-table-state-success-bg);color:var(--p-table-state-success-fg)}.pfx-chip--filled-info{background:var(--md-sys-color-tertiary);color:var(--md-sys-color-on-tertiary)}.pfx-chip--filled-basic{background:var(--md-sys-color-surface-container-highest);color:var(--md-sys-color-on-surface);border-color:var(--md-sys-color-outline-variant)}.pfx-chip--soft-primary{background:var(--p-table-badge-soft-primary-bg);color:var(--p-table-badge-soft-primary-fg)}.pfx-chip--soft-accent{background:var(--p-table-badge-soft-accent-bg);color:var(--p-table-badge-soft-accent-fg)}.pfx-chip--soft-warn{background:var(--p-table-badge-soft-warn-bg);color:var(--p-table-badge-soft-warn-fg)}.pfx-chip--soft-danger{background:color-mix(in srgb,var(--p-table-state-danger-bg) 72%,transparent);color:var(--p-table-state-danger-fg);border-color:color-mix(in srgb,var(--p-table-state-danger-fg) 18%,transparent)}.pfx-chip--soft-success{background:color-mix(in srgb,var(--p-table-state-success-bg) 72%,transparent);color:var(--p-table-state-success-fg);border-color:color-mix(in srgb,var(--p-table-state-success-fg) 18%,transparent)}.pfx-chip--soft-info{background:color-mix(in srgb,var(--md-sys-color-tertiary-container) 72%,transparent);color:var(--md-sys-color-on-tertiary-container);border-color:color-mix(in srgb,var(--md-sys-color-tertiary) 18%,transparent)}.pfx-chip--soft-basic{background:color-mix(in srgb,var(--md-sys-color-surface-container-highest) 82%,transparent);color:color-mix(in srgb,var(--md-sys-color-on-surface) 76%,transparent);border-color:color-mix(in srgb,var(--md-sys-color-outline-variant) 65%,transparent)}.pfx-progress{position:relative;width:100%;min-width:0;max-width:140px;display:inline-block;vertical-align:middle}.pfx-progress .pfx-progress__content{width:100%;min-width:0}.pfx-progress .prx-rich-progress{width:100%}.pfx-progress-bar{height:100%;background:var(--md-sys-color-primary);transition:width .2s ease}.pfx-progress-label{margin-left:8px;font-size:12px;opacity:.8;display:inline-block;vertical-align:middle}.pfx-micro-viz-cell{display:inline-block;width:min(100%,180px);min-width:112px;max-width:220px;vertical-align:middle}.pfx-micro-viz-cell .pfx-micro-viz{display:grid;gap:4px;width:100%;min-width:0;color:var(--md-sys-color-on-surface);font-size:12px;line-height:1.2}.pfx-micro-viz-cell .pfx-micro-viz__row{display:grid;grid-template-columns:minmax(42px,.8fr) minmax(52px,1fr) auto;align-items:center;gap:6px;min-width:0}.pfx-micro-viz-cell .pfx-micro-viz__label,.pfx-micro-viz-cell .pfx-micro-viz__value{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pfx-micro-viz-cell .pfx-micro-viz__track{position:relative;display:block;height:8px;min-width:0;border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-outline-variant) 62%,transparent);overflow:hidden}.pfx-micro-viz-cell .pfx-micro-viz__bar,.pfx-micro-viz-cell .pfx-micro-viz__segment{display:block;height:100%;border-radius:inherit;background:var(--md-sys-color-primary)}.pfx-micro-viz-cell .pfx-micro-viz__row[data-tone=success] .pfx-micro-viz__bar,.pfx-micro-viz-cell .pfx-micro-viz__segment[data-tone=success],.pfx-micro-viz-cell .pfx-micro-viz[data-tone=success] .pfx-micro-viz__bar{background:var(--p-table-state-success-fg, #168a4a)}.pfx-micro-viz-cell .pfx-micro-viz__row[data-tone=warning] .pfx-micro-viz__bar,.pfx-micro-viz-cell .pfx-micro-viz__segment[data-tone=warning],.pfx-micro-viz-cell .pfx-micro-viz[data-tone=warning] .pfx-micro-viz__bar{background:var(--p-table-state-warning-fg, #b45f06)}.pfx-micro-viz-cell .pfx-micro-viz__row[data-tone=danger] .pfx-micro-viz__bar,.pfx-micro-viz-cell .pfx-micro-viz__segment[data-tone=danger],.pfx-micro-viz-cell .pfx-micro-viz[data-tone=danger] .pfx-micro-viz__bar{background:var(--p-table-state-danger-fg, #b3261e)}.pfx-micro-viz-cell .pfx-micro-viz__segments{display:flex;width:100%;height:8px;overflow:hidden;border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-outline-variant) 62%,transparent)}.pfx-micro-viz-cell .pfx-micro-viz__meta{display:flex;justify-content:space-between;gap:8px;min-width:0;color:color-mix(in srgb,var(--md-sys-color-on-surface) 72%,transparent)}.pfx-micro-viz-cell .pfx-micro-viz__bullet .pfx-micro-viz__target{position:absolute;top:-2px;bottom:-2px;width:2px;border-radius:999px;background:var(--md-sys-color-on-surface)}.pfx-micro-viz-cell .pfx-micro-viz__delta[data-tone=success]{color:var(--p-table-state-success-fg, #168a4a)}.pfx-micro-viz-cell .pfx-micro-viz__delta[data-tone=warning]{color:var(--p-table-state-warning-fg, #b45f06)}.pfx-micro-viz-cell .pfx-micro-viz__delta[data-tone=danger]{color:var(--p-table-state-danger-fg, #b3261e)}.pfx-micro-viz-cell .pfx-micro-viz__fallback{display:inline-block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pfx-micro-viz-cell .pfx-micro-viz.pfx-micro-viz__radial,.pfx-micro-viz-cell .pfx-micro-viz.pfx-micro-viz__harvey,.pfx-micro-viz-cell .pfx-micro-viz.pfx-micro-viz__process{display:inline-flex}.pfx-micro-viz__radial{align-items:center;justify-content:center;position:relative}.pfx-micro-radial-svg{width:24px;height:24px;overflow:visible;flex-shrink:0;display:block}.pfx-micro-radial-svg__track{fill:none;stroke:var(--pfx-micro-track-color, var(--md-sys-color-surface-container-high, #e5e7eb));stroke-width:3}.pfx-micro-radial-svg__bar{fill:none;stroke:currentColor;stroke-width:3;stroke-linecap:round;transform:rotate(-90deg);transform-origin:50% 50%;transition:stroke-dasharray .35s ease}.pfx-micro-radial-svg__text{font-size:8px;font-weight:700;text-anchor:middle;fill:currentColor;font-family:var(--md-sys-typescale-body-medium-font-family, sans-serif)}.pfx-micro-viz__harvey{align-items:center;gap:0}.pfx-micro-harvey-svg{width:18px;height:18px;overflow:visible;flex-shrink:0}.pfx-micro-harvey-svg__track{fill:none;stroke:var(--pfx-micro-track-color, var(--md-sys-color-surface-container-high, #e5e7eb));stroke-width:2}.pfx-micro-harvey-svg__bar{fill:none;stroke:currentColor;stroke-width:16;transform:rotate(-90deg);transform-origin:50% 50%;transition:stroke-dasharray .35s ease}.pfx-micro-harvey-fraction{display:inline-flex;align-items:center;font-size:11px;font-variant-numeric:tabular-nums;margin-left:6px;font-family:var(--md-sys-typescale-body-medium-font-family, sans-serif)}.pfx-micro-harvey-fraction strong{color:currentColor;font-weight:700}.pfx-separator{opacity:.6;color:var(--md-sys-color-on-surface-variant, #4b5563);margin-inline:2px}.pfx-total{color:var(--md-sys-color-on-surface-variant, #4b5563)}.pfx-micro-viz__bullet{display:flex;flex-direction:column;gap:4px;width:100%}.pfx-micro-bullet__top{display:flex;justify-content:space-between;align-items:baseline;font-size:11px}.pfx-micro-bullet__label{color:var(--md-sys-color-on-surface-variant, #4b5563);font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pfx-micro-bullet__value{font-weight:700;color:currentColor;font-variant-numeric:tabular-nums;flex-shrink:0}.pfx-micro-bullet__target-val{font-weight:400;font-size:10px;color:var(--md-sys-color-on-surface-variant, #4b5563);margin-left:4px}.pfx-micro-bullet__track{position:relative;display:block;overflow:hidden;border-radius:var(--pfx-micro-track-radius, 999px);background:var(--pfx-micro-track-color, var(--md-sys-color-surface-container-high, #e5e7eb));block-size:10px;width:100%}.pfx-micro-bullet__range{position:absolute;inset-block:0;display:block;block-size:100%;opacity:.32}.pfx-micro-bullet__range[data-tone=success]{background:var(--p-table-state-success-fg, #168a4a)}.pfx-micro-bullet__range[data-tone=warning]{background:var(--p-table-state-warning-fg, #b45f06)}.pfx-micro-bullet__range[data-tone=danger],.pfx-micro-bullet__range[data-tone=critical]{background:var(--p-table-state-danger-fg, #b3261e)}.pfx-micro-bullet__range[data-tone=info]{background:var(--md-sys-color-primary, #2563eb)}.pfx-micro-bullet__actual{position:absolute;inset-block-start:3px;inset-inline-start:0;block-size:4px;border-radius:inherit}.pfx-micro-bullet__actual[data-tone=success]{background:var(--p-table-state-success-fg, #168a4a)}.pfx-micro-bullet__actual[data-tone=warning]{background:var(--p-table-state-warning-fg, #b45f06)}.pfx-micro-bullet__actual[data-tone=danger],.pfx-micro-bullet__actual[data-tone=critical]{background:var(--p-table-state-danger-fg, #b3261e)}.pfx-micro-bullet__actual[data-tone=info]{background:var(--md-sys-color-primary, #2563eb)}.pfx-micro-bullet__target{position:absolute;inset-block:0;inline-size:2px;background:var(--md-sys-color-on-surface, #111827)}.pfx-micro-bullet__bottom{display:flex;justify-content:space-between;font-size:9px;color:var(--md-sys-color-on-surface-variant, #4b5563)}.pfx-micro-viz-container{display:flex;align-items:center;gap:8px;width:100%}.pfx-micro-trend__label-col{display:flex;flex-direction:column;justify-content:center;font-size:11px;line-height:1.2;flex-shrink:0;min-width:24px;font-family:var(--md-sys-typescale-body-medium-font-family, sans-serif)}.pfx-micro-trend__label-col--start{align-items:flex-end;text-align:right}.pfx-micro-trend__label-col--end{align-items:flex-start;text-align:left}.pfx-micro-trend__value{font-weight:700;color:var(--md-sys-color-on-surface, #1f2937)}.pfx-micro-trend__label{color:var(--md-sys-color-on-surface-variant, #4b5563);font-size:9px}.pfx-micro-viz__line,.pfx-micro-viz__area,.pfx-micro-viz__column{display:block;width:100%;height:30px;overflow:visible;flex:1 1 auto}.pfx-micro-line__svg,.pfx-micro-area__svg,.pfx-micro-column__svg{width:100%;height:100%;display:block;overflow:visible}.pfx-micro-line__path,.pfx-micro-area__path{stroke:currentColor}.pfx-micro-area__fill{fill:currentColor}.pfx-micro-trend__marker{fill:currentColor;stroke:var(--md-sys-color-surface, #ffffff);stroke-width:1.5px}.pfx-micro-trend__marker[data-tone=success]{fill:var(--p-table-state-success-fg, #168a4a)}.pfx-micro-trend__marker[data-tone=warning]{fill:var(--p-table-state-warning-fg, #b45f06)}.pfx-micro-trend__marker[data-tone=danger],.pfx-micro-trend__marker[data-tone=critical]{fill:var(--p-table-state-danger-fg, #b3261e)}.pfx-micro-trend__marker[data-tone=info]{fill:var(--md-sys-color-primary, #2563eb)}.pfx-micro-viz__process{align-items:center;width:100%;min-width:120px;padding-block:4px;overflow-x:auto;-webkit-overflow-scrolling:touch}.pfx-micro-step{display:flex;align-items:center;flex:1 1 0%;min-width:0}.pfx-micro-step[data-state=future]{opacity:.38}.pfx-micro-step[data-state=disabled]{opacity:.28;pointer-events:none}.pfx-micro-step__node-wrapper{display:flex;flex-direction:column;align-items:center;position:relative;flex-shrink:0}.pfx-micro-step__node{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;border-radius:50%;font-size:11px;font-weight:700;background:var(--md-sys-color-surface-container-high, #e5e7eb);color:var(--md-sys-color-on-surface, #1f2937);border:2px solid transparent;transition:all .2s ease}.pfx-micro-step__node[data-tone=success]{background:var(--p-table-state-success-fg, #168a4a);color:#fff}.pfx-micro-step__node[data-tone=warning]{background:var(--p-table-state-warning-fg, #b45f06);color:#fff}.pfx-micro-step__node[data-tone=danger],.pfx-micro-step__node[data-tone=critical]{background:var(--p-table-state-danger-fg, #b3261e);color:#fff}.pfx-micro-step__node[data-tone=info]{background:var(--md-sys-color-primary, #2563eb);color:#fff}.pfx-micro-step__icon{font-size:12px}.pfx-micro-step__label{font-size:9px;margin-top:4px;text-align:center;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:72px;color:var(--md-sys-color-on-surface-variant, #4b5563)}.pfx-micro-step__connector{flex:1 1 auto;height:2px;background:var(--md-sys-color-surface-container-high, #e5e7eb);margin-inline:8px;min-width:16px}.pfx-micro-step__connector[data-tone=success]{background:var(--p-table-state-success-fg, #168a4a)}.pfx-micro-step__connector[data-tone=warning]{background:var(--p-table-state-warning-fg, #b45f06)}.pfx-micro-step__connector[data-tone=danger],.pfx-micro-step__connector[data-tone=critical]{background:var(--p-table-state-danger-fg, #b3261e)}.pfx-micro-step__connector[data-tone=info]{background:var(--md-sys-color-primary, #2563eb)}.pfx-micro-viz[data-tone=success]{color:var(--p-table-state-success-fg, #168a4a)}.pfx-micro-viz[data-tone=warning]{color:var(--p-table-state-warning-fg, #b45f06)}.pfx-micro-viz[data-tone=danger],.pfx-micro-viz[data-tone=critical]{color:var(--p-table-state-danger-fg, #b3261e)}.pfx-micro-viz[data-tone=info]{color:var(--md-sys-color-primary, #2563eb)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz[data-tone=success]{color:var(--p-table-state-success-fg, #168a4a)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz[data-tone=warning]{color:var(--p-table-state-warning-fg, #b45f06)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz[data-tone=danger],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz[data-tone=critical]{color:var(--p-table-state-danger-fg, #b3261e)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz[data-tone=info]{color:var(--md-sys-color-primary, #2563eb)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz.pfx-micro-viz__delta{display:inline-flex;align-items:center;justify-content:flex-end;gap:5px;width:auto;min-width:0;font-weight:700;font-variant-numeric:tabular-nums;white-space:nowrap}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__delta-symbol{display:inline-grid;width:12px;min-width:12px;height:12px;min-height:12px;place-items:center;border-radius:0;background:transparent;font-size:11px;line-height:1;transform:translateY(-.5px)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz.pfx-micro-viz__radial,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz.pfx-micro-viz__harvey{display:inline-flex;align-items:center;justify-content:center;width:auto;min-width:0;height:auto;gap:8px}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz.pfx-micro-viz__radial{justify-content:flex-start;gap:7px}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-radial-svg{display:block;width:24px;height:24px;overflow:visible;flex:0 0 auto}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-radial-svg__track{fill:none;stroke:var(--pfx-micro-track-color, var(--md-sys-color-surface-container-high, #e5e7eb));stroke-width:3.4}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-radial-svg__bar{fill:none;stroke:currentColor;stroke-width:3.4;stroke-linecap:round;transform:rotate(-90deg);transform-origin:50% 50%}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-radial-svg__text{font-family:var(--md-sys-typescale-body-medium-font-family, sans-serif);font-size:8.5px;font-weight:700;text-anchor:middle;fill:currentColor}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-radial-value{color:currentColor;font-family:var(--md-sys-typescale-body-medium-font-family, sans-serif);font-size:12px;font-weight:700;font-variant-numeric:tabular-nums;line-height:1;white-space:nowrap}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-harvey-svg{display:block;width:26px;height:26px;overflow:visible;flex:0 0 auto}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-harvey-svg__track{fill:none;stroke:var(--pfx-micro-track-color, var(--md-sys-color-surface-container-high, #e5e7eb));stroke-width:2.4}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-harvey-svg__bar{fill:none;stroke:currentColor;stroke-width:16;transform:rotate(-90deg);transform-origin:50% 50%}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-harvey-fraction{display:inline-flex;align-items:center;font-family:var(--md-sys-typescale-body-medium-font-family, sans-serif);font-size:12px;font-variant-numeric:tabular-nums;white-space:nowrap}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-harvey-fraction strong{color:currentColor;font-weight:700}:host ::ng-deep .pfx-micro-viz-cell .pfx-separator{margin-inline:2px;color:var(--md-sys-color-on-surface-variant, #4b5563);opacity:.6}:host ::ng-deep .pfx-micro-viz-cell .pfx-total{color:var(--md-sys-color-on-surface-variant, #4b5563)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz.pfx-micro-viz__process{display:inline-flex;align-items:center;justify-content:center;width:100%;min-width:112px;overflow:hidden}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz-container{display:flex;align-items:center;gap:8px;width:100%;min-width:0}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz.pfx-micro-viz__line,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz.pfx-micro-viz__area,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz.pfx-micro-viz__column{display:block;flex:1 1 auto;width:100%;min-width:0;height:30px;overflow:visible}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-line__svg,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-area__svg,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-column__svg{display:block;width:100%;height:100%;overflow:visible}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-line__path,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-area__path{stroke:currentColor}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-area__fill{fill:currentColor}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-column__bar,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-trend__marker{fill:currentColor}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-column__bar[data-tone=success],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-trend__marker[data-tone=success]{fill:var(--p-table-state-success-fg, #168a4a)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-column__bar[data-tone=warning],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-trend__marker[data-tone=warning]{fill:var(--p-table-state-warning-fg, #b45f06)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-column__bar[data-tone=danger],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-column__bar[data-tone=critical],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-trend__marker[data-tone=danger],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-trend__marker[data-tone=critical]{fill:var(--p-table-state-danger-fg, #b3261e)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-column__bar[data-tone=info],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-trend__marker[data-tone=info]{fill:var(--md-sys-color-primary, #2563eb)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step{display:flex;align-items:center;flex:0 1 auto;min-width:0}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__node-wrapper{display:inline-flex;align-items:center;min-width:0}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__node{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;border-radius:50%;background:var(--md-sys-color-surface-container-high, #e5e7eb);color:var(--md-sys-color-on-surface, #1f2937);font-size:12px;font-weight:700;line-height:1;flex:0 0 auto}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__icon{font-size:15px;line-height:1}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__label{display:none}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__connector{flex:0 1 24px;min-width:12px;max-width:28px;height:2px;margin-inline:6px;background:var(--md-sys-color-surface-container-high, #e5e7eb)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__node[data-tone=success],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__connector[data-tone=success]{background:var(--p-table-state-success-fg, #168a4a)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__node[data-tone=warning],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__connector[data-tone=warning]{background:var(--p-table-state-warning-fg, #b45f06)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__node[data-tone=danger],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__node[data-tone=critical],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__connector[data-tone=danger],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__connector[data-tone=critical]{background:var(--p-table-state-danger-fg, #b3261e)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__node[data-tone=info],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__connector[data-tone=info]{background:var(--md-sys-color-primary, #2563eb)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__node[data-tone=success],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__node[data-tone=warning],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__node[data-tone=danger],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__node[data-tone=critical],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__node[data-tone=info]{color:var(--md-sys-color-on-primary, #ffffff)}.pfx-avatar{display:inline-flex;align-items:center;justify-content:center;background:var(--md-sys-color-surface-container);color:var(--md-sys-color-on-surface);border-radius:4px;overflow:hidden;font-weight:600}.pfx-avatar.shape-rounded{border-radius:8px}.pfx-avatar.shape-circle{border-radius:999px}.pfx-avatar--initials{text-transform:uppercase;font-size:12px}.pfx-cell-compose{display:inline-flex;align-items:center;gap:6px}.pfx-cell-compose.dir-col{flex-direction:column;align-items:stretch}.pfx-cell-compose.align-start{justify-content:flex-start}.pfx-cell-compose.align-center{justify-content:center}.pfx-cell-compose.align-end{justify-content:flex-end}.pfx-cell-compose.wrap{flex-wrap:wrap}.pfx-cell-compose.ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.px-scroll-viewport{width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;overscroll-behavior-x:contain;background:var(--p-table-bg);border-radius:12px 12px 0 0}.px-scroll-viewport:has(.mat-mdc-table.table-stack-top){border-top-left-radius:0;border-top-right-radius:0}.px-scroll-viewport.scroll-none{overflow-x:visible}.px-scroll-viewport.scroll-auto ::ng-deep .mat-mdc-table{width:max-content;min-width:100%}.px-scroll-viewport.scroll-wrap ::ng-deep .mat-mdc-header-cell,.px-scroll-viewport.scroll-wrap ::ng-deep .mat-mdc-cell{white-space:normal;text-overflow:initial}.px-scroll-viewport.scroll-wrap ::ng-deep .mat-mdc-table{width:100%}:host ::ng-deep .mat-mdc-header-row{position:sticky;top:0;z-index:var(--praxis-layer-sticky-local, 100);height:var(--p-table-header-height, var(--p-table-header-height-default, var(--mat-table-header-container-height, 40px)));min-height:var(--p-table-header-height, var(--p-table-header-height-default, var(--mat-table-header-container-height, 40px)));background:var(--p-table-header-bg);color:var(--p-table-header-fg);box-shadow:var(--p-table-header-shadow, 0 1px 0 var(--p-table-border-color));border-bottom:1px solid var(--p-table-border-color)}:host ::ng-deep .mat-mdc-header-cell{color:var(--p-table-header-fg);font-weight:600}:host ::ng-deep .mat-sort-header-content,:host ::ng-deep .mat-mdc-header-row .mat-icon{color:inherit;font-weight:600}:host ::ng-deep .mat-mdc-header-cell.mat-sort-header-sorted .mat-sort-header-arrow,:host ::ng-deep .mat-mdc-header-cell:hover .mat-sort-header-arrow{color:var(--p-table-header-fg)!important}:host ::ng-deep .mat-mdc-header-cell.mat-sort-header-sorted .mat-sort-header-arrow .mat-sort-header-indicator,:host ::ng-deep .mat-mdc-header-cell.mat-sort-header-sorted .mat-sort-header-arrow .mat-sort-header-stem,:host ::ng-deep .mat-mdc-header-cell.mat-sort-header-sorted .mat-sort-header-arrow .mat-sort-header-pointer,:host ::ng-deep .mat-mdc-header-cell.mat-sort-header-sorted .mat-sort-header-arrow .mat-sort-header-pointer-left,:host ::ng-deep .mat-mdc-header-cell.mat-sort-header-sorted .mat-sort-header-arrow .mat-sort-header-pointer-right{border-color:var(--p-table-header-fg)!important;background:var(--p-table-header-fg)!important}:host ::ng-deep .mat-mdc-header-cell{height:var(--p-table-header-height, var(--p-table-header-height-default, var(--mat-table-header-container-height, 40px)));padding:var(--p-header-padding, var(--p-header-padding-default, 12px 16px))!important;font-size:var(--p-header-font-size, var(--p-header-font-size-default, inherit));font-weight:var(--p-header-font-weight, 600);letter-spacing:var(--p-header-letter-spacing, normal);text-transform:var(--p-header-text-transform, none);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;position:relative}:host ::ng-deep .mat-mdc-header-cell.praxis-header-align-left .mat-sort-header-container{justify-content:flex-start}:host ::ng-deep .mat-mdc-header-cell.praxis-header-align-center .mat-sort-header-container{justify-content:center}:host ::ng-deep .mat-mdc-header-cell.praxis-header-align-right .mat-sort-header-container{justify-content:flex-end}:host ::ng-deep .mat-mdc-header-cell.praxis-header-align-left .praxis-header-label-text{text-align:left}:host ::ng-deep .mat-mdc-header-cell.praxis-header-align-center .praxis-header-label-text{text-align:center}:host ::ng-deep .mat-mdc-header-cell.praxis-header-align-right .praxis-header-label-text{text-align:right}:host ::ng-deep .pfx-column-drag-enabled .mat-mdc-header-cell.praxis-header-draggable .mat-sort-header-container{display:flex;align-items:center;width:100%;gap:4px}:host ::ng-deep .pfx-column-drag-enabled .mat-mdc-header-cell.praxis-header-draggable{-webkit-user-select:none;user-select:none}:host ::ng-deep .mat-mdc-header-cell .praxis-header-sort-trigger{display:block;width:100%;min-width:0}:host ::ng-deep .mat-mdc-header-cell.praxis-header-resizable{overflow:visible}:host ::ng-deep .mat-mdc-header-cell .praxis-column-resize-handle{position:absolute;z-index:2;inset-block:0;inset-inline-end:0;width:var(--p-table-column-resize-hit-area);cursor:col-resize;touch-action:none;-webkit-user-select:none;user-select:none}:host ::ng-deep .mat-mdc-header-cell .praxis-column-resize-handle:after{content:\"\";position:absolute;inset-block:6px;inset-inline-start:calc((var(--p-table-column-resize-hit-area) - var(--p-table-column-resize-line-width)) / 2);width:var(--p-table-column-resize-line-width);background:var(--p-table-column-resize-separator-color);opacity:.76;transition:background-color .12s ease,opacity .12s ease,transform .12s ease,inset-block .12s ease}:host ::ng-deep .mat-mdc-header-cell .praxis-column-resize-handle:focus-visible{outline:2px solid var(--p-table-column-resize-separator-hover-color);outline-offset:-2px}:host ::ng-deep .mat-mdc-header-cell.praxis-header-resizable:hover .praxis-column-resize-handle:after,:host ::ng-deep .mat-mdc-header-cell.praxis-header-resizable:focus-within .praxis-column-resize-handle:after,:host ::ng-deep .mat-mdc-header-cell .praxis-column-resize-handle:hover:after,:host ::ng-deep .mat-mdc-header-cell .praxis-column-resize-handle:focus-visible:after{background:var(--p-table-column-resize-separator-hover-color);opacity:1}:host ::ng-deep .mat-mdc-header-cell.praxis-header-resizing .praxis-column-resize-handle:after{background:var(--p-table-column-resize-active-color);inset-block:0;opacity:1;transform:scaleX(2)}:host ::ng-deep .pfx-column-resizing,:host ::ng-deep .pfx-column-resizing .mat-mdc-header-cell{cursor:col-resize}:host ::ng-deep .pfx-column-drag-enabled .mat-mdc-header-cell.praxis-header-draggable.cdk-drag-dragging{cursor:grabbing}:host ::ng-deep .pfx-column-drag-enabled .mat-mdc-header-cell.praxis-header-draggable .mat-sort-header-content{display:inline-flex;align-items:center;gap:4px;flex:1 1 auto;min-width:0;max-width:100%;overflow:hidden}:host ::ng-deep .pfx-column-drag-enabled .mat-mdc-header-cell .praxis-header-label{display:inline-flex;align-items:center;gap:4px;flex:1 1 auto;min-width:0}:host ::ng-deep .pfx-column-drag-enabled .mat-mdc-header-cell .praxis-header-label-text{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}:host ::ng-deep .pfx-column-drag-indicator .cdk-drop-list-dragging .mat-mdc-header-cell:not(.cdk-drag-placeholder){transition:transform var(--p-table-reorder-transition-duration, .18s) var(--p-table-motion-easing, cubic-bezier(0, 0, .2, 1))}:host ::ng-deep .pfx-column-drag-indicator .mat-mdc-header-cell.cdk-drag-animating{transition:transform var(--p-table-reorder-transition-duration, .16s) var(--p-table-motion-easing, cubic-bezier(0, 0, .2, 1))}.pfx-column-drag-preview{box-sizing:border-box;display:flex;align-items:center;border-radius:10px;border:1px solid var(--p-table-border-color);background:linear-gradient(135deg,var(--p-table-header-bg) 0%,var(--p-table-row-hover-bg) 100%);color:var(--p-table-header-fg);box-shadow:var(--p-table-drag-preview-shadow);transform:scale(var(--p-table-drag-preview-scale, 1.01));pointer-events:none;z-index:var(--praxis-layer-authoring-hover, 300)}.pfx-column-drag-preview-custom{height:100%;padding:var(--p-header-padding, var(--p-header-padding-default, 12px 16px))}.pfx-column-drag-preview .mat-sort-header-arrow,.pfx-column-drag-preview .mat-sort-header-indicator,.pfx-column-drag-preview .mat-sort-header-stem,.pfx-column-drag-preview .mat-sort-header-pointer,.pfx-column-drag-preview .mat-sort-header-pointer-left,.pfx-column-drag-preview .mat-sort-header-pointer-right{display:none!important}.pfx-column-drag-preview .mat-sort-header-container{display:flex;align-items:center;width:100%;min-height:100%;padding-right:0!important}.pfx-column-drag-preview .praxis-header-sort-trigger{display:block;width:100%;min-width:0}.pfx-column-drag-preview .mat-sort-header-content,.pfx-column-drag-preview .praxis-header-label{display:inline-flex;align-items:center;flex:1 1 auto;min-width:0;width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pfx-column-drag-preview.praxis-header-align-left .mat-sort-header-container,.pfx-column-drag-preview.praxis-header-align-left,.pfx-column-drag-preview.praxis-header-align-left .mat-sort-header-content,.pfx-column-drag-preview.praxis-header-align-left .praxis-header-label{justify-content:flex-start}.pfx-column-drag-preview.praxis-header-align-center .mat-sort-header-container,.pfx-column-drag-preview.praxis-header-align-center,.pfx-column-drag-preview.praxis-header-align-center .mat-sort-header-content,.pfx-column-drag-preview.praxis-header-align-center .praxis-header-label{justify-content:center}.pfx-column-drag-preview.praxis-header-align-right .mat-sort-header-container,.pfx-column-drag-preview.praxis-header-align-right,.pfx-column-drag-preview.praxis-header-align-right .mat-sort-header-content,.pfx-column-drag-preview.praxis-header-align-right .praxis-header-label{justify-content:flex-end}.pfx-column-drag-preview.praxis-header-align-right .mat-sort-header-content{flex:0 1 auto;width:auto;margin-inline-start:auto}.pfx-column-drag-preview.praxis-header-align-right .praxis-header-label{width:auto}.pfx-column-drag-preview.praxis-header-align-left .praxis-header-label-text{text-align:left}.pfx-column-drag-preview.praxis-header-align-center .praxis-header-label-text{text-align:center}.pfx-column-drag-preview.praxis-header-align-right .praxis-header-label-text{text-align:right}:host ::ng-deep .pfx-column-drag-indicator .cdk-drag-placeholder{opacity:1;border:1px dashed var(--p-table-border-color);background:var(--p-table-row-hover-bg)}:host ::ng-deep .pfx-column-drag-indicator .cdk-drag-placeholder *{opacity:0}:host ::ng-deep .pfx-column-drag-indicator .mat-mdc-header-cell.cdk-drag-dragging{opacity:.58}@media(prefers-reduced-motion:reduce){:host ::ng-deep .pfx-column-drag-indicator .cdk-drop-list-dragging .mat-mdc-header-cell:not(.cdk-drag-placeholder){transition:none}.pfx-column-drag-preview{transition:none;transform:none}.praxis-column-reorder-status{animation:none}.pfx-expansion-detail-panel{animation:none!important;transition:none!important;transform:none!important}:host ::ng-deep .mat-mdc-row{transition:none}:host ::ng-deep .mat-mdc-table{transition:none}}.praxis-actions-header{text-align:right}.praxis-actions-header.align-start{text-align:left}.praxis-actions-header.align-center{text-align:center}.praxis-actions-header.align-end{text-align:right}.praxis-actions-header .praxis-actions-header__content{display:inline-flex;align-items:center;gap:var(--p-actions-header-gap, 6px);justify-content:center;max-width:100%;min-width:0;white-space:nowrap;color:var(--p-actions-header-color, inherit)}.praxis-actions-header .praxis-actions-header__content .mat-icon{font-size:18px;width:18px;height:18px;line-height:18px}.praxis-actions-header .praxis-actions-header__label{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@media(max-width:640px){.praxis-actions-header .praxis-actions-header__label{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap}}:host ::ng-deep .mat-mdc-header-cell .mat-sort-header-container{box-sizing:border-box;padding-inline-end:0;position:static}:host ::ng-deep .pfx-column-drag-enabled .mat-mdc-header-cell.praxis-header-draggable .mat-sort-header-container{padding-inline-end:0}:host ::ng-deep .mat-mdc-header-cell.praxis-header-resizable:not(.praxis-header-align-right) .mat-sort-header-container{padding-inline-end:calc(var(--p-table-column-resize-hit-area) + 8px)}:host ::ng-deep .mat-mdc-header-cell.praxis-header-resizable.praxis-header-align-center .mat-sort-header-container{padding-inline-start:calc(var(--p-table-column-resize-hit-area) + 8px)}:host ::ng-deep .mat-mdc-header-cell.praxis-header-resizable.praxis-header-align-right .mat-sort-header-container{padding-inline-end:0}:host ::ng-deep .mat-mdc-header-cell.praxis-header-resizable:not(.praxis-header-align-right) .mat-sort-header-content{box-sizing:border-box;padding-inline-end:18px}:host ::ng-deep .mat-mdc-header-cell.praxis-header-resizable.praxis-header-align-center .mat-sort-header-content{padding-inline-start:0;padding-inline-end:0}:host ::ng-deep .mat-mdc-header-cell.praxis-header-resizable.praxis-header-align-right .mat-sort-header-content{box-sizing:border-box;flex:0 1 auto;width:auto;padding-inline-start:0;padding-inline-end:0}:host ::ng-deep .mat-mdc-header-cell.praxis-header-resizable.praxis-header-align-right .praxis-header-label{width:auto}:host ::ng-deep .mat-mdc-header-cell .mat-sort-header-arrow{position:absolute;inset-inline-end:var(--p-table-sort-arrow-overlay-inset, 2px);top:50%;margin:0;transform:translateY(-50%)}:host ::ng-deep .mat-mdc-header-cell.praxis-header-resizable:not(.praxis-header-align-right) .mat-sort-header-arrow{inset-inline-end:calc(var(--p-table-column-resize-hit-area) + 2px)}:host ::ng-deep .mat-mdc-header-cell.praxis-header-align-right .mat-sort-header-arrow{position:static;order:-1;flex:0 0 auto;margin-inline:0 4px;transform:none}:host ::ng-deep .mat-mdc-cell{color:var(--p-table-text-color);height:var(--p-table-row-height, var(--p-table-row-height-default, 44px));padding:var(--p-cell-padding, var(--p-cell-padding-default, 10px 14px));font-size:var(--p-cell-font-size, var(--p-cell-font-size-default, inherit));line-height:1.25;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}:host ::ng-deep .mat-mdc-cell .pfx-cell-content,:host ::ng-deep .mat-cell .pfx-cell-content{display:inline-flex;align-items:center;gap:6px;width:100%;min-width:0;overflow:hidden}:host ::ng-deep .pfx-cell-content.pfx-cell-anim{animation-duration:var(--pfx-cell-anim-duration, .8s);animation-delay:var(--pfx-cell-anim-delay, 0ms);animation-fill-mode:both;animation-timing-function:ease-in-out}:host ::ng-deep .pfx-cell-content.pfx-cell-anim.pfx-cell-anim--once{animation-iteration-count:1}:host ::ng-deep .pfx-cell-content.pfx-cell-anim.pfx-cell-anim--loop{animation-iteration-count:infinite}:host ::ng-deep .pfx-cell-content.pfx-cell-anim.pfx-cell-anim--count{animation-iteration-count:var(--pfx-cell-anim-iteration-count, 1)}:host ::ng-deep .pfx-cell-content.pfx-cell-anim.pfx-cell-anim--on-hover{animation-play-state:paused}:host ::ng-deep .mat-mdc-cell:hover .pfx-cell-content.pfx-cell-anim.pfx-cell-anim--on-hover,:host ::ng-deep .mat-cell:hover .pfx-cell-content.pfx-cell-anim.pfx-cell-anim--on-hover{animation-play-state:running}:host ::ng-deep .pfx-cell-content.pfx-cell-anim.pfx-cell-anim--pulse{animation-name:pfx-cell-pulse}:host ::ng-deep .pfx-cell-content.pfx-cell-anim.pfx-cell-anim--blink{animation-name:pfx-cell-blink}:host ::ng-deep .pfx-cell-content.pfx-cell-anim.pfx-cell-anim--grow{animation-name:pfx-cell-grow}:host ::ng-deep .pfx-cell-content.pfx-cell-anim.pfx-cell-anim--fade{animation-name:pfx-cell-fade}:host ::ng-deep .pfx-cell-content.pfx-cell-anim.pfx-cell-anim--slide-in{animation-name:pfx-cell-slide-in}:host ::ng-deep .pfx-cell-content.pfx-cell-anim.pfx-cell-anim--border-pulse{animation-name:pfx-cell-border-pulse}@keyframes pfx-cell-pulse{0%{transform:scale(1)}50%{transform:scale(var(--pfx-cell-anim-scale-peak, 1.015))}to{transform:scale(1)}}@keyframes pfx-cell-blink{0%,49%{opacity:1}50%,to{opacity:var(--pfx-cell-anim-min-opacity, .35)}}@keyframes pfx-cell-grow{0%{transform:scale(.985)}to{transform:scale(1)}}@keyframes pfx-cell-fade{0%{opacity:0}to{opacity:1}}@keyframes pfx-cell-slide-in{0%{opacity:0;transform:translateY(var(--pfx-cell-anim-slide-distance, 4px))}to{opacity:1;transform:translateY(0)}}@keyframes pfx-cell-border-pulse{0%,to{box-shadow:inset 0 0 rgba(var(--pfx-cell-anim-border-rgb, 25, 118, 210),0)}50%{box-shadow:inset 0 0 0 2px rgba(var(--pfx-cell-anim-border-rgb, 25, 118, 210),var(--pfx-cell-anim-border-strength, .3))}}:host ::ng-deep .mat-mdc-row.pfx-row-anim{animation-duration:var(--pfx-row-anim-duration, .8s);animation-delay:var(--pfx-row-anim-delay, 0ms);animation-fill-mode:both;animation-timing-function:ease-in-out}:host ::ng-deep .mat-mdc-row.pfx-row-anim.pfx-row-anim--once{animation-iteration-count:1}:host ::ng-deep .mat-mdc-row.pfx-row-anim.pfx-row-anim--loop{animation-iteration-count:infinite}:host ::ng-deep .mat-mdc-row.pfx-row-anim.pfx-row-anim--count{animation-iteration-count:var(--pfx-row-anim-iteration-count, 1)}:host ::ng-deep .mat-mdc-row.pfx-row-anim.pfx-row-anim--on-hover{animation-play-state:paused}:host ::ng-deep .mat-mdc-row.pfx-row-anim.pfx-row-anim--on-hover:hover{animation-play-state:running}:host ::ng-deep .mat-mdc-row.pfx-row-anim.pfx-row-anim--pulse{animation-name:pfx-row-pulse}:host ::ng-deep .mat-mdc-row.pfx-row-anim.pfx-row-anim--blink{animation-name:pfx-row-blink}:host ::ng-deep .mat-mdc-row.pfx-row-anim.pfx-row-anim--grow{animation-name:pfx-row-grow}:host ::ng-deep .mat-mdc-row.pfx-row-anim.pfx-row-anim--fade{animation-name:pfx-row-fade}:host ::ng-deep .mat-mdc-row.pfx-row-anim.pfx-row-anim--slide-in{animation-name:pfx-row-slide-in}:host ::ng-deep .mat-mdc-row.pfx-row-anim.pfx-row-anim--border-pulse{animation-name:pfx-row-border-pulse}@keyframes pfx-row-pulse{0%{transform:scale(1)}50%{transform:scale(var(--pfx-row-anim-scale-peak, 1.015))}to{transform:scale(1)}}@keyframes pfx-row-blink{0%,49%{opacity:1}50%,to{opacity:var(--pfx-row-anim-min-opacity, .35)}}@keyframes pfx-row-grow{0%{transform:scale(.985)}to{transform:scale(1)}}@keyframes pfx-row-fade{0%{opacity:0}to{opacity:1}}@keyframes pfx-row-slide-in{0%{opacity:0;transform:translateY(var(--pfx-row-anim-slide-distance, 4px))}to{opacity:1;transform:translateY(0)}}@keyframes pfx-row-border-pulse{0%,to{box-shadow:inset 0 0 rgba(var(--pfx-row-anim-border-rgb, 25, 118, 210),0)}50%{box-shadow:inset 0 0 0 2px rgba(var(--pfx-row-anim-border-rgb, 25, 118, 210),var(--pfx-row-anim-border-strength, .3))}}@media(prefers-reduced-motion:reduce){:host ::ng-deep .pfx-cell-content.pfx-cell-anim,:host ::ng-deep .mat-mdc-row.pfx-row-anim{animation:none!important}}:host ::ng-deep .mat-mdc-row:hover{background:var(--p-table-row-hover-bg)}:host ::ng-deep .mat-mdc-row{height:var(--p-table-row-height, var(--p-table-row-height-default, 44px));min-height:var(--p-table-row-height, var(--p-table-row-height-default, 44px));transition:background-color var(--p-table-hover-transition-duration, .18s) var(--p-table-motion-easing, cubic-bezier(0, 0, .2, 1)),box-shadow var(--p-table-selection-transition-duration, .18s) var(--p-table-motion-easing, cubic-bezier(0, 0, .2, 1))}:host ::ng-deep .mat-mdc-row.pfx-row-click-selectable{cursor:pointer}:host ::ng-deep .mat-mdc-row:nth-child(2n){background:var(--p-table-row-even-bg)}:host ::ng-deep .mat-mdc-row:nth-child(2n):hover{background:var(--p-table-row-hover-bg)}:host ::ng-deep .mat-mdc-row.pfx-row-selected,:host ::ng-deep .mat-mdc-row.pfx-row-selected:hover{background:var(--p-table-row-selected-bg)}:host ::ng-deep .mat-mdc-row.pfx-row-selected .mat-mdc-cell{background:var(--p-table-row-selected-bg);color:var(--p-table-row-selected-fg);font-weight:var(--p-table-row-selected-font-weight)}:host ::ng-deep .mat-mdc-row.pfx-row-selected .mat-mdc-cell:first-child{position:relative}:host ::ng-deep .mat-mdc-row.pfx-row-selected .mat-mdc-cell:first-child:before{content:\"\";position:absolute;inset:0 auto 0 0;width:4px;border-radius:0 4px 4px 0;background:var(--p-table-row-selected-indicator);pointer-events:none}:host.row-borders ::ng-deep .mat-mdc-row .mat-mdc-cell{border-bottom:1px solid var(--p-table-border-color)}:host.row-borders ::ng-deep .mat-mdc-header-row .mat-mdc-header-cell{border-bottom:none}:host.col-borders ::ng-deep .mat-mdc-header-row .mat-mdc-header-cell,:host.col-borders ::ng-deep .mat-mdc-row .mat-mdc-cell{border-right:1px solid var(--p-table-border-color)}:host.col-borders ::ng-deep .mat-mdc-header-row .mat-mdc-header-cell:last-child,:host.col-borders ::ng-deep .mat-mdc-row .mat-mdc-cell:last-child{border-right:none}.ptable-error{display:flex;align-items:center;gap:12px;padding:12px;margin:8px 0;border:1px solid var(--md-sys-color-error);border-radius:8px}.ptable-error__content{flex:1}.ptable-error__title{font-weight:600}.ptable-info-banner{display:flex;gap:12px;align-items:center;padding:8px 12px;margin:8px 0;border-radius:8px;border:1px solid var(--md-sys-color-primary);background:var(--md-sys-color-primary-container);color:var(--md-sys-color-on-primary-container)}.ptable-info-banner .text{flex:1;font-weight:600}.ptable-info-banner .actions{display:flex;gap:8px}.pfx-cell-image{display:inline-block;vertical-align:middle;background:var(--md-sys-color-surface-variant);border:1px solid var(--md-sys-color-outline-variant)}.pfx-cell-image.shape-rounded{border-radius:8px}.pfx-cell-image.shape-circle{border-radius:9999px}.pfx-badge{display:inline-flex;align-items:center;gap:6px;line-height:1;padding:4px 8px;border-radius:9999px;font-size:12px;font-weight:600;border:1px solid transparent;white-space:nowrap;--prx-rich-content-inline-gap: 6px}.pfx-badge .pfx-badge-icon{font-size:16px;width:16px;height:16px}.pfx-badge--plain{background:transparent;border-color:transparent;color:inherit}.pfx-badge--filled-primary{background:var(--md-sys-color-primary);color:var(--md-sys-color-on-primary)}.pfx-badge--filled-accent{background:var(--md-sys-color-secondary);color:var(--md-sys-color-on-secondary)}.pfx-badge--filled-warn,.pfx-badge--filled-danger{background:var(--md-sys-color-error);color:var(--md-sys-color-on-error)}.pfx-badge--filled-success{background:var(--p-table-state-success-bg);color:var(--p-table-state-success-fg)}.pfx-badge--filled-info{background:var(--md-sys-color-tertiary);color:var(--md-sys-color-on-tertiary)}.pfx-badge--filled-basic{background:var(--md-sys-color-surface-container-highest);color:var(--md-sys-color-on-surface);border-color:var(--md-sys-color-outline-variant)}.pfx-badge--outlined{background:transparent;border-color:var(--md-sys-color-outline-variant);color:inherit}.pfx-badge--soft-primary{background:var(--p-table-badge-soft-primary-bg);color:var(--p-table-badge-soft-primary-fg)}.pfx-badge--soft-accent{background:var(--p-table-badge-soft-accent-bg);color:var(--p-table-badge-soft-accent-fg)}.pfx-badge--soft-warn{background:var(--p-table-badge-soft-warn-bg);color:var(--p-table-badge-soft-warn-fg)}.pfx-badge--soft-danger{background:color-mix(in srgb,var(--p-table-state-danger-bg) 72%,transparent);color:var(--p-table-state-danger-fg);border-color:color-mix(in srgb,var(--p-table-state-danger-fg) 18%,transparent)}.pfx-badge--soft-success{background:color-mix(in srgb,var(--p-table-state-success-bg) 72%,transparent);color:var(--p-table-state-success-fg);border-color:color-mix(in srgb,var(--p-table-state-success-fg) 18%,transparent)}.pfx-badge--soft-info{background:color-mix(in srgb,var(--md-sys-color-tertiary-container) 72%,transparent);color:var(--md-sys-color-on-tertiary-container);border-color:color-mix(in srgb,var(--md-sys-color-tertiary) 18%,transparent)}.pfx-badge--soft-basic{background:color-mix(in srgb,var(--md-sys-color-surface-container-highest) 82%,transparent);color:color-mix(in srgb,var(--md-sys-color-on-surface) 76%,transparent);border-color:color-mix(in srgb,var(--md-sys-color-outline-variant) 65%,transparent)}.row--success,.row--success td,td.row--success{background-color:var(--p-table-state-success-bg)!important;color:var(--p-table-state-success-fg)!important}.row--warning,.row--warning td,td.row--warning{background-color:var(--p-table-state-warning-bg)!important;color:var(--p-table-state-warning-fg)!important}.row--danger,.row--danger td,td.row--danger{background-color:var(--p-table-state-danger-bg)!important;color:var(--p-table-state-danger-fg)!important}.row--highlight,.row--highlight td,td.row--highlight{background-color:var(--p-table-state-highlight-bg)!important;color:var(--p-table-state-highlight-fg)!important;font-weight:600}.row--muted,.row--muted td,td.row--muted{opacity:.7;filter:saturate(.6)}.pfx-expansion-node-embed{display:flex;flex-direction:column;gap:12px;padding:16px;border:1px solid var(--md-sys-color-outline-variant);border-radius:16px;background:var(--md-sys-color-surface-container-low, var(--md-sys-color-surface))}.ptable-loading-state{padding:8px 12px 4px;display:grid;gap:10px}.ptable-loading-state__hero{display:grid;gap:10px;padding:14px;border-radius:8px;border:1px solid rgba(18,99,180,.08);background:linear-gradient(180deg,#ffffffa6,#ffffff47),linear-gradient(0deg,#1263b408,#1263b400)}.ptable-loading-state__rows{display:grid;gap:8px}.ptable-loading-state__row{display:grid;grid-template-columns:96px minmax(0,1fr) minmax(140px,1.2fr);gap:8px}.ptable-loading-state__line,.ptable-loading-state__cell{display:block;height:12px;border-radius:999px;background:linear-gradient(90deg,#1263b414,#1263b42e,#1263b414);background-size:200% 100%;animation:ptable-loading-wave 1.2s ease-in-out infinite}.ptable-loading-state__line--wide{width:180px}.ptable-loading-state__line--short{width:96px}.ptable-loading-state__cell--short{width:100%;max-width:84px}.ptable-loading-state__cell--wide{width:100%}.ptable-loading-state__message{font-size:.85rem;color:var(--md-sys-color-on-surface-variant, #5a5d67);padding-inline:4px}.pfx-expansion-node-embed__header,.pfx-expansion-node-embed__meta,.pfx-expansion-node-embed__empty,.pfx-expansion-node-embed__diagram-label{display:block}.pfx-expansion-node-embed--inline{min-width:0}.pfx-expansion-node-embed--chart praxis-chart{display:block;min-height:280px}.ptable-no-data-state{padding:8px 12px 4px}.ptable-no-data-state ::ng-deep .empty-card{margin:0;border-radius:8px}@keyframes ptable-loading-wave{0%{background-position:100% 0}to{background-position:-100% 0}}.pfx-expansion-node-embed__diagram{display:flex;flex-direction:column;gap:8px}.pfx-expansion-node-embed__diagram-source{margin:0;padding:12px;overflow:auto;border-radius:12px;border:1px solid var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface-container-highest, var(--md-sys-color-surface));color:var(--md-sys-color-on-surface);font-family:Consolas,Courier New,monospace;font-size:12px;line-height:1.4;white-space:pre-wrap}.pfx-expansion-node-embed__action-btn{align-self:flex-start}.pfx-expansion-node-embed__action-host{display:inline-flex}.praxis-table-columns-menu{max-height:320px;overflow-y:auto;padding:8px 0}.praxis-table-column-menu-item{display:flex!important;align-items:center;width:100%;box-sizing:border-box;padding:6px 16px;min-height:40px}.praxis-table-column-menu-item mat-checkbox{width:100%}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i10$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i10$1.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }, { kind: "directive", type: i10$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i10$1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: ScrollingModule }, { kind: "directive", type: i11$1.CdkScrollable, selector: "[cdk-scrollable], [cdkScrollable]" }, { kind: "directive", type: i12.ɵɵCdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i12.ɵɵCdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i12.ɵɵCdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i13.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer", "cdkDropListHasAnchor"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i13.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i13.CdkDragPreview, selector: "ng-template[cdkDragPreview]", inputs: ["data", "matchSize"] }, { kind: "ngmodule", type: MatBadgeModule }, { kind: "directive", type: i15$1.MatBadge, selector: "[matBadge]", inputs: ["matBadgeColor", "matBadgeOverlap", "matBadgeDisabled", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i3.MatMiniFabButton, selector: "button[mat-mini-fab], a[mat-mini-fab], button[matMiniFab], a[matMiniFab]", exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i8.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "aria-expanded", "aria-controls", "aria-owns", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatRadioModule }, { kind: "component", type: i17$1.MatRadioButton, selector: "mat-radio-button", inputs: ["id", "name", "aria-label", "aria-labelledby", "aria-describedby", "disableRipple", "tabIndex", "checked", "value", "labelPosition", "disabled", "required", "color", "disabledInteractive"], outputs: ["change"], exportAs: ["matRadioButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i5.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i5.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i5.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatPaginatorModule }, { kind: "component", type: i20.MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }, { kind: "ngmodule", type: MatSlideToggleModule }, { kind: "component", type: i5$1.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "ngmodule", type: MatSnackBarModule }, { kind: "ngmodule", type: MatSortModule }, { kind: "directive", type: i22.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i22.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "ngmodule", type: MatTableModule }, { kind: "component", type: i8$1.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i8$1.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i8$1.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i8$1.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i8$1.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i8$1.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i8$1.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i8$1.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i8$1.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i8$1.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i10.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: PraxisAiAssistantShellComponent, selector: "praxis-ai-assistant-shell", inputs: ["labels", "mode", "state", "contextItems", "attachments", "messages", "quickReplies", "recommendedIntents", "prompt", "statusText", "errorText", "testIdPrefix", "panelTestId", "submitTestId", "applyTestId", "primaryAction", "secondaryActions", "governanceActions", "busy", "canSubmit", "canApply", "submitOnEnter", "showAttachAction", "enablePastedAttachments", "enableFileAttachments", "attachmentAccept", "attachmentMultiple", "voiceInputMode", "voiceLanguage", "draggable", "resizable", "minWidth", "minHeight", "margin", "layout"], outputs: ["promptChange", "submitPrompt", "apply", "retryTurn", "cancelTurn", "shellAction", "close", "attach", "attachmentsPasted", "attachmentsSelected", "removeAttachment", "messageAction", "editMessage", "resendMessage", "quickReply", "recommendedIntent", "layoutChange"] }, { kind: "component", type: PraxisFilter, selector: "praxis-filter", inputs: ["resourcePath", "apiUrlEntry", "fieldMetadata", "filterId", "formId", "componentInstanceId", "mode", "notifyIfOutdated", "snoozeMs", "autoOpenSettingsOnOutdated", "enableCustomization", "value", "alwaysVisibleFields", "alwaysVisibleFieldMetadataOverrides", "selectedFieldIds", "tags", "allowSaveTags", "persistenceKey", "disablePersistence", "i18n", "changeDebounceMs", "showFilterSettings", "showAdvancedButton", "showAddButton", "showClearButton", "showSearchButton", "confirmTagDelete", "placeBooleansInActions", "showToggleLabels", "useInlineSelectVariant", "useInlineSearchableSelectVariant", "useInlineMultiSelectVariant", "useInlineInputVariant", "useInlineToggleVariant", "useInlineRangeVariant", "useInlineDateVariant", "useInlineDateRangeVariant", "useInlineTimeVariant", "useInlineTimeRangeVariant", "useInlineTreeSelectVariant", "alwaysMinWidth", "alwaysColsMd", "alwaysColsLg", "tagColor", "tagVariant", "tagButtonColor", "actionsButtonColor", "actionsVariant", "overlayVariant", "overlayBackdrop", "advancedOpenMode", "advancedClearButtonsEnabled"], outputs: ["submit", "change", "clear", "modeChange", "requestSearch", "tagsChange", "selectedFieldIdsChange", "metaChanged", "schemaStatusChange"] }, { kind: "directive", type: PraxisIconDirective, selector: "mat-icon[praxisIcon]", inputs: ["praxisIcon"] }, { kind: "component", type: PraxisTableToolbar, selector: "praxis-table-toolbar", inputs: ["config", "appearance", "backgroundColor", "placement", "showMain", "showActionsGroup", "showEndActions", "showMobileActions", "exportBusy", "evaluationContext", "columnVisibilityController"], outputs: ["toolbarAction", "exportAction", "columnVisibilityToggle"] }, { kind: "component", type: PraxisRichContent, selector: "praxis-rich-content", inputs: ["document", "nodes", "context", "hostCapabilities", "layout", "rootClassName"] }, { kind: "component", type: EmptyStateCardComponent, selector: "praxis-empty-state-card", inputs: ["icon", "title", "description", "primaryAction", "secondaryActions", "inline", "tone"] }, { kind: "component", type: TableRatingCellComponent, selector: "praxis-table-rating", inputs: ["itemsCount", "value", "size", "ratingColor", "outlineColor", "ariaLabel"] }] });
|
|
55775
|
+
], queries: [{ propertyName: "toolbar", first: true, predicate: PraxisTableToolbar, descendants: true }, { propertyName: "projectedFilter", first: true, predicate: ["projectedFilter"], descendants: true }], viewQueries: [{ propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "sort", first: true, predicate: MatSort, descendants: true }, { propertyName: "materialTable", first: true, predicate: MatTable, descendants: true }, { propertyName: "internalFilter", first: true, predicate: PraxisFilter, descendants: true }], usesOnChanges: true, ngImport: i0, template: "@if (shouldShowEmptyState()) {\n <praxis-empty-state-card\n icon=\"link\"\n [title]=\"'Escolha o recurso da tabela'\"\n [description]=\"'Selecione um recurso da API para carregar colunas, registros e a\u00E7\u00F5es da tabela automaticamente.'\"\n [primaryAction]=\"{ label: 'Selecionar recurso', icon: 'bolt', action: openQuickConnect.bind(this) }\"\n ></praxis-empty-state-card>\n}\n\n<!-- Error State with Quick Connect CTA -->\n@if (isRemoteMode() && (schemaError || dataError)) {\n <div class=\"ptable-error\" role=\"alert\" aria-live=\"assertive\">\n <mat-icon color=\"warn\" aria-hidden=\"true\">error</mat-icon>\n <div class=\"ptable-error__content\">\n <praxis-rich-content\n rootClassName=\"ptable-error__title\"\n [nodes]=\"getTableChromeTextRichContentNodes('Erro', 'ptable-error__title-text')\"\n ></praxis-rich-content>\n <praxis-rich-content\n rootClassName=\"ptable-error__message\"\n [nodes]=\"getTableChromeTextRichContentNodes(errorMessage || 'Ocorreu um erro ao carregar a tabela.', 'ptable-error__message-text')\"\n ></praxis-rich-content>\n </div>\n <button mat-flat-button color=\"primary\" (click)=\"openQuickConnect()\">\n <mat-icon>bolt</mat-icon>\n <praxis-rich-content\n rootClassName=\"ptable-error__action-label\"\n [nodes]=\"getTableChromeTextRichContentNodes('Selecionar recurso', 'ptable-error__action-label-text')\"\n ></praxis-rich-content>\n </button>\n @if (enableCustomization) {\n <button\n mat-icon-button\n color=\"primary\"\n data-role=\"table-settings\"\n data-testid=\"table-settings-trigger\"\n (click)=\"openTableSettings()\"\n [attr.aria-label]=\"getTableSettingsLabel()\"\n [matTooltip]=\"getTableSettingsLabel()\"\n matTooltipPosition=\"below\"\n >\n <mat-icon>settings</mat-icon>\n </button>\n }\n @if (!schemaError) {\n <button mat-stroked-button (click)=\"retryData()\">\n <praxis-rich-content\n rootClassName=\"ptable-error__action-label\"\n [nodes]=\"getTableChromeTextRichContentNodes('Tentar novamente', 'ptable-error__action-label-text')\"\n ></praxis-rich-content>\n </button>\n }\n @if (schemaError) {\n <button mat-stroked-button (click)=\"reloadSchema()\">\n <praxis-rich-content\n rootClassName=\"ptable-error__action-label\"\n [nodes]=\"getTableChromeTextRichContentNodes('Recarregar colunas', 'ptable-error__action-label-text')\"\n ></praxis-rich-content>\n </button>\n }\n </div>\n}\n\n<!-- Inline banner for schema change (only in edit mode) -->\n@if (shouldShowOutdatedInline()) {\n <div class=\"ptable-info-banner\" role=\"status\" aria-live=\"polite\">\n <praxis-rich-content\n rootClassName=\"text\"\n [nodes]=\"getTableChromeTextRichContentNodes('O schema do servidor mudou. Reconciliar agora?', 'ptable-info-banner__text')\"\n ></praxis-rich-content>\n <div class=\"actions\">\n <button mat-stroked-button color=\"primary\" (click)=\"onReconcileRequested()\">\n <mat-icon>sync</mat-icon>\n <praxis-rich-content\n rootClassName=\"ptable-info-banner__action-label\"\n [nodes]=\"getTableChromeTextRichContentNodes('Reconciliar', 'ptable-info-banner__action-label-text')\"\n ></praxis-rich-content>\n </button>\n <button mat-button (click)=\"onSnoozeOutdated()\">\n <praxis-rich-content\n rootClassName=\"ptable-info-banner__action-label\"\n [nodes]=\"getTableChromeTextRichContentNodes('Lembrar depois', 'ptable-info-banner__action-label-text')\"\n ></praxis-rich-content>\n </button>\n <button mat-button (click)=\"onIgnoreOutdated()\">\n <praxis-rich-content\n rootClassName=\"ptable-info-banner__action-label\"\n [nodes]=\"getTableChromeTextRichContentNodes('Ignorar', 'ptable-info-banner__action-label-text')\"\n ></praxis-rich-content>\n </button>\n </div>\n </div>\n}\n\n@if (isAiAssistantEnabled() && aiAssistantOpen && aiAssistantViewState) {\n <praxis-ai-assistant-shell\n [labels]=\"aiAssistantLabels\"\n [mode]=\"aiAssistantViewState.mode\"\n [state]=\"aiAssistantViewState.state\"\n [contextItems]=\"aiAssistantViewState.contextItems\"\n [attachments]=\"aiAssistantViewState.attachments\"\n [messages]=\"aiAssistantViewState.messages\"\n [quickReplies]=\"aiAssistantViewState.quickReplies\"\n [recommendedIntents]=\"getAiAssistantRecommendedIntents()\"\n [prompt]=\"aiAssistantPrompt\"\n [statusText]=\"aiAssistantViewState.statusText\"\n [errorText]=\"aiAssistantViewState.errorText\"\n [busy]=\"aiAssistantViewState.state === 'processing' || aiAssistantViewState.state === 'applying'\"\n [canApply]=\"aiAssistantViewState.canApply\"\n [showAttachAction]=\"false\"\n [enablePastedAttachments]=\"false\"\n [voiceInputMode]=\"aiAssistantVoiceInputMode\"\n [voiceLanguage]=\"aiAssistantVoiceLanguage\"\n [layout]=\"aiAssistantLayout\"\n testIdPrefix=\"table-ai-assistant\"\n panelTestId=\"table-ai-assistant-panel\"\n submitTestId=\"table-ai-assistant-submit\"\n applyTestId=\"table-ai-assistant-apply\"\n (promptChange)=\"onAiAssistantPromptChange($event)\"\n (submitPrompt)=\"onAiAssistantSubmit($event)\"\n (apply)=\"onAiAssistantApply()\"\n (retryTurn)=\"onAiAssistantRetry()\"\n (cancelTurn)=\"onAiAssistantCancel()\"\n (quickReply)=\"onAiAssistantQuickReply($event)\"\n (recommendedIntent)=\"onAiAssistantRecommendedIntent($event)\"\n (editMessage)=\"onAiAssistantEditMessage($event)\"\n (resendMessage)=\"onAiAssistantResendMessage($event)\"\n (layoutChange)=\"onAiAssistantLayoutChange($event)\"\n (close)=\"closeAiAssistant()\"\n ></praxis-ai-assistant-shell>\n}\n\n@if (shouldRenderDataSurface() && !schemaError && !dataError && toolbarV2) {\n <div class=\"praxis-table-header\" [class.edit-mode]=\"enableCustomization\" [class.stacked]=\"hasTopToolbarStack()\">\n @if (showToolbar && shouldShowToolbarTopPlacement()) {\n <praxis-table-toolbar\n class=\"praxis-toolbar-stack-top\"\n [config]=\"config\"\n [backgroundColor]=\"getToolbarActionsBackgroundColor()\"\n [style.--pfx-filter-h]=\"getToolbarLayoutHeightHostStyle()\"\n [evaluationContext]=\"getToolbarEvaluationContext()\"\n [columnVisibilityController]=\"toolbarColumnVisibilityController\"\n [showActionsGroup]=\"shouldShowToolbarActionsTop()\"\n [showMobileActions]=\"shouldShowToolbarActionsTop()\"\n [exportBusy]=\"exportBusy\"\n (toolbarAction)=\"onToolbarAction($event)\"\n (exportAction)=\"onExportAction($event)\"\n >\n @if (shouldRenderAdvancedFilter()) {\n <praxis-filter\n advancedFilter\n [resourcePath]=\"getAdvancedFilterResourcePath()\"\n [filterId]=\"tableId\"\n [formId]=\"tableId\"\n [persistenceKey]=\"getAdvancedFilterPersistenceKey()\"\n [fieldMetadata]=\"getAdvancedFilterFieldMetadata()\"\n [enableCustomization]=\"enableCustomization\"\n [value]=\"advancedFilterValue\"\n\n [alwaysVisibleFields]=\"getAdvancedFilterAlwaysVisibleFields()\"\n [alwaysVisibleFieldMetadataOverrides]=\"getAdvancedFilterAlwaysVisibleFieldMetadataOverrides()\"\n [selectedFieldIds]=\"config.behavior?.filtering?.advancedFilters?.settings?.selectedFieldIds ?? []\"\n [allowSaveTags]=\"config.behavior?.filtering?.advancedFilters?.settings?.allowSaveTags\"\n [changeDebounceMs]=\"config.behavior?.filtering?.advancedFilters?.settings?.changeDebounceMs ?? 300\"\n [i18n]=\"getFilterI18n()\"\n [mode]=\"'filter'\"\n [showFilterSettings]=\"enableCustomization\"\n (change)=\"onAdvancedFilterChange($event)\"\n (requestSearch)=\"onAdvancedFilterSubmit($event)\"\n (clear)=\"onAdvancedFilterClear()\"\n ></praxis-filter>\n }\n <ng-content select=\"[advancedFilter]\" />\n <ng-content select=\"[toolbar]\" />\n\n <!-- AI Assistant in Toolbar -->\n @if (shouldShowAiAssistantEntrypoint()) {\n <button\n end-actions\n mat-icon-button\n color=\"primary\"\n type=\"button\"\n class=\"praxis-table-ai-trigger praxis-table-toolbar-action--ai\"\n [class.praxis-table-ai-trigger--minimized]=\"hasMinimizedAiAssistantSession()\"\n [attr.data-testid]=\"aiAssistantTriggerTestId('toolbar-top')\"\n (click)=\"openAiAssistant()\"\n [attr.aria-label]=\"aiAssistantTriggerLabel()\"\n [matBadge]=\"aiAssistantTriggerBadge()\"\n [matBadgeHidden]=\"!hasMinimizedAiAssistantSession()\"\n matBadgeColor=\"accent\"\n matBadgeSize=\"small\"\n matBadgePosition=\"above after\"\n [matTooltip]=\"aiAssistantTriggerTooltip()\"\n matTooltipPosition=\"below\"\n >\n <mat-icon>{{ aiAssistantTriggerIcon() }}</mat-icon>\n </button>\n }\n\n @if (enableCustomization) {\n <button end-actions mat-icon-button color=\"primary\" class=\"praxis-table-toolbar-action--configuration\" data-role=\"table-settings\" data-testid=\"table-settings-trigger\"\n (click)=\"openTableSettings()\" [attr.aria-label]=\"getTableSettingsLabel()\"\n [matBadge]=\"schemaOutdated ? '!' : ''\"\n [matBadgeHidden]=\"!schemaOutdated\"\n matBadgeColor=\"warn\" matBadgeSize=\"small\" matBadgePosition=\"above after\"\n [matTooltip]=\"getTableSettingsTooltip()\"\n matTooltipPosition=\"below\">\n <mat-icon>settings</mat-icon>\n </button>\n }\n </praxis-table-toolbar>\n }\n @if (!showToolbar && enableCustomization) {\n <div class=\"ptable-header-actions\">\n @if (shouldShowAiAssistantEntrypoint()) {\n <button\n mat-icon-button\n color=\"primary\"\n type=\"button\"\n class=\"praxis-table-ai-trigger praxis-table-toolbar-action--ai\"\n [class.praxis-table-ai-trigger--minimized]=\"hasMinimizedAiAssistantSession()\"\n [attr.data-testid]=\"aiAssistantTriggerTestId('header-top')\"\n (click)=\"openAiAssistant()\"\n [attr.aria-label]=\"aiAssistantTriggerLabel()\"\n [matBadge]=\"aiAssistantTriggerBadge()\"\n [matBadgeHidden]=\"!hasMinimizedAiAssistantSession()\"\n matBadgeColor=\"accent\"\n matBadgeSize=\"small\"\n matBadgePosition=\"above after\"\n [matTooltip]=\"aiAssistantTriggerTooltip()\"\n matTooltipPosition=\"below\"\n >\n <mat-icon>{{ aiAssistantTriggerIcon() }}</mat-icon>\n </button>\n }\n <button mat-icon-button color=\"primary\" class=\"praxis-table-toolbar-action--configuration\" data-role=\"table-settings\" data-testid=\"table-settings-trigger\" (click)=\"openTableSettings()\" [attr.aria-label]=\"getTableSettingsLabel()\"\n [matBadge]=\"schemaOutdated ? '!' : ''\"\n [matBadgeHidden]=\"!schemaOutdated\"\n matBadgeColor=\"warn\" matBadgeSize=\"small\" matBadgePosition=\"above after\"\n [matTooltip]=\"getTableSettingsTooltip()\"\n matTooltipPosition=\"below\">\n <mat-icon>settings</mat-icon>\n </button>\n @if (isRemoteMode()) {\n <button mat-icon-button (click)=\"disconnect()\" [attr.aria-label]=\"getDisconnectLabel()\" [matTooltip]=\"getDisconnectTooltip()\">\n <mat-icon>link_off</mat-icon>\n </button>\n }\n </div>\n }\n </div>\n} @else {\n @if (shouldRenderDataSurface() && !schemaError && !dataError) {\n @if (showToolbar && shouldShowToolbarTopPlacement()) {\n <praxis-table-toolbar\n class=\"praxis-toolbar-stack-top\"\n [config]=\"config\"\n [backgroundColor]=\"getToolbarActionsBackgroundColor()\"\n [style.--pfx-filter-h]=\"getToolbarLayoutHeightHostStyle()\"\n [evaluationContext]=\"getToolbarEvaluationContext()\"\n [showActionsGroup]=\"shouldShowToolbarActionsTop()\"\n [showMobileActions]=\"shouldShowToolbarActionsTop()\"\n [exportBusy]=\"exportBusy\"\n (toolbarAction)=\"onToolbarAction($event)\"\n (exportAction)=\"onExportAction($event)\"\n >\n @if (shouldRenderAdvancedFilter()) {\n <praxis-filter\n advancedFilter\n [resourcePath]=\"getAdvancedFilterResourcePath()\"\n [filterId]=\"tableId\"\n [formId]=\"tableId\"\n [persistenceKey]=\"getAdvancedFilterPersistenceKey()\"\n [fieldMetadata]=\"getAdvancedFilterFieldMetadata()\"\n [enableCustomization]=\"enableCustomization\"\n [value]=\"advancedFilterValue\"\n\n [alwaysVisibleFields]=\"getAdvancedFilterAlwaysVisibleFields()\"\n [alwaysVisibleFieldMetadataOverrides]=\"getAdvancedFilterAlwaysVisibleFieldMetadataOverrides()\"\n [selectedFieldIds]=\"config.behavior?.filtering?.advancedFilters?.settings?.selectedFieldIds ?? []\"\n [allowSaveTags]=\"config.behavior?.filtering?.advancedFilters?.settings?.allowSaveTags\"\n [changeDebounceMs]=\"config.behavior?.filtering?.advancedFilters?.settings?.changeDebounceMs ?? 300\"\n [i18n]=\"getFilterI18n()\"\n [mode]=\"'filter'\"\n [showFilterSettings]=\"enableCustomization\"\n (change)=\"onAdvancedFilterChange($event)\"\n (requestSearch)=\"onAdvancedFilterSubmit($event)\"\n (clear)=\"onAdvancedFilterClear()\"\n ></praxis-filter>\n }\n <ng-content select=\"[advancedFilter]\" />\n <ng-content select=\"[toolbar]\" />\n @if (shouldShowAiAssistantEntrypoint()) {\n <button\n end-actions\n mat-icon-button\n color=\"primary\"\n type=\"button\"\n class=\"praxis-table-ai-trigger praxis-table-toolbar-action--ai\"\n [class.praxis-table-ai-trigger--minimized]=\"hasMinimizedAiAssistantSession()\"\n [attr.data-testid]=\"aiAssistantTriggerTestId('toolbar-stacked')\"\n (click)=\"openAiAssistant()\"\n [attr.aria-label]=\"aiAssistantTriggerLabel()\"\n [matBadge]=\"aiAssistantTriggerBadge()\"\n [matBadgeHidden]=\"!hasMinimizedAiAssistantSession()\"\n matBadgeColor=\"accent\"\n matBadgeSize=\"small\"\n matBadgePosition=\"above after\"\n [matTooltip]=\"aiAssistantTriggerTooltip()\"\n matTooltipPosition=\"below\"\n >\n <mat-icon>{{ aiAssistantTriggerIcon() }}</mat-icon>\n </button>\n }\n @if (enableCustomization) {\n <button end-actions mat-icon-button color=\"primary\" class=\"praxis-table-toolbar-action--configuration\" data-role=\"table-settings\" data-testid=\"table-settings-trigger\"\n (click)=\"openTableSettings()\" [attr.aria-label]=\"getTableSettingsLabel()\"\n [matBadge]=\"schemaOutdated ? '!' : ''\"\n [matBadgeHidden]=\"!schemaOutdated\"\n matBadgeColor=\"warn\" matBadgeSize=\"small\" matBadgePosition=\"above after\"\n [matTooltip]=\"getTableSettingsTooltip()\"\n matTooltipPosition=\"below\">\n <mat-icon>settings</mat-icon>\n </button>\n }\n </praxis-table-toolbar>\n }\n @if (!showToolbar && enableCustomization) {\n <div class=\"ptable-header-actions\">\n @if (shouldShowAiAssistantEntrypoint()) {\n <button\n mat-icon-button\n color=\"primary\"\n type=\"button\"\n class=\"praxis-table-ai-trigger praxis-table-toolbar-action--ai\"\n [class.praxis-table-ai-trigger--minimized]=\"hasMinimizedAiAssistantSession()\"\n [attr.data-testid]=\"aiAssistantTriggerTestId('header-stacked')\"\n (click)=\"openAiAssistant()\"\n [attr.aria-label]=\"aiAssistantTriggerLabel()\"\n [matBadge]=\"aiAssistantTriggerBadge()\"\n [matBadgeHidden]=\"!hasMinimizedAiAssistantSession()\"\n matBadgeColor=\"accent\"\n matBadgeSize=\"small\"\n matBadgePosition=\"above after\"\n [matTooltip]=\"aiAssistantTriggerTooltip()\"\n matTooltipPosition=\"below\"\n >\n <mat-icon>{{ aiAssistantTriggerIcon() }}</mat-icon>\n </button>\n }\n <button mat-icon-button color=\"primary\" class=\"praxis-table-toolbar-action--configuration\" data-role=\"table-settings\" data-testid=\"table-settings-trigger\" (click)=\"openTableSettings()\" [attr.aria-label]=\"getTableSettingsLabel()\"\n [matBadge]=\"schemaOutdated ? '!' : ''\"\n [matBadgeHidden]=\"!schemaOutdated\"\n matBadgeColor=\"warn\" matBadgeSize=\"small\" matBadgePosition=\"above after\"\n [matTooltip]=\"getTableSettingsTooltip()\"\n matTooltipPosition=\"below\">\n <mat-icon>settings</mat-icon>\n </button>\n </div>\n }\n }\n}\n<!-- Paginador superior -->\n@if (shouldRenderDataSurface() && !schemaError && !dataError && getPaginationEnabled() && (config.behavior?.pagination?.position === 'top' || config.behavior?.pagination?.position === 'both')) {\n <mat-paginator\n [length]=\"getPaginationLength()\"\n [pageSize]=\"getPaginationPageSize()\"\n [pageSizeOptions]=\"getPaginationPageSizeOptions()\"\n [selectConfig]=\"paginatorSelectConfig\"\n [showFirstLastButtons]=\"getPaginationShowFirstLast()\"\n (page)=\"onPageChange($event)\"\n [class.compact]=\"config.behavior?.pagination?.style === 'compact'\"\n >\n </mat-paginator>\n}\n<div class=\"px-scroll-viewport\"\n cdkScrollable\n [class.scroll-auto]=\"horizontalScroll === 'auto'\"\n [class.scroll-wrap]=\"horizontalScroll === 'wrap'\"\n [class.scroll-none]=\"horizontalScroll === 'none'\">\n\n @if (shouldRenderDataSurface() && !schemaError && !dataError) {\n <div class=\"praxis-visually-hidden-status\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">\n {{ columnReorderStatusMessage }}\n </div>\n @if (exportStatusMessage) {\n <div class=\"praxis-visually-hidden-status\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">\n {{ exportStatusMessage }}\n </div>\n }\n @if (columnReorderVisualStatusMessage) {\n <div class=\"praxis-column-reorder-status\" role=\"note\">\n {{ columnReorderVisualStatusMessage }}\n </div>\n }\n <table\n mat-table\n data-testid=\"table-column-drag-drop-list\"\n [dataSource]=\"dataSource\"\n [multiTemplateDataRows]=\"isRowExpansionRuntimeEnabled()\"\n cdkDropList\n [cdkDropListDisabled]=\"!isColumnDraggingEnabled() || isColumnResizeActive()\"\n [cdkDropListData]=\"visibleDataColumnsForDrag\"\n cdkDropListOrientation=\"horizontal\"\n (cdkDropListDropped)=\"onColumnDrop($event)\"\n matSort\n (matSortChange)=\"onSortChange($event)\"\n [matSortDisabled]=\"!getSortingEnabled() || isColumnResizeActive()\"\n [ngClass]=\"getTableElevationClassName()\"\n [class.table-stack-top]=\"hasTopToolbarStack()\"\n [class.pfx-column-drag-enabled]=\"isColumnDraggingEnabled()\"\n [class.pfx-column-drag-indicator]=\"isColumnDragIndicatorEnabled()\"\n [class.pfx-column-resize-enabled]=\"isColumnResizeEnabled()\"\n [class.pfx-column-resizing]=\"isColumnResizeActive()\"\n [style.width]=\"getColumnResizeTableWidthStyle()\"\n [style.min-width]=\"getColumnResizeTableWidthStyle()\"\n [style.max-width]=\"getColumnResizeTableWidthStyle()\"\n >\n @if (isSelectionColumnEnabled()) {\n <ng-container\n matColumnDef=\"_select\"\n >\n <th mat-header-cell *matHeaderCellDef>\n @if (canSelectAll()) {\n <mat-checkbox\n (change)=\"masterToggle()\"\n [checked]=\"isAllSelected()\"\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\"\n [attr.aria-label]=\"getMasterSelectionAriaLabel()\"\n ></mat-checkbox>\n }\n </th>\n <td mat-cell *matCellDef=\"let row; let i = index\">\n @if (config.behavior?.selection?.type !== 'multiple') {\n <mat-radio-button\n (click)=\"$event.stopPropagation(); toggleRow(row)\"\n [checked]=\"selection.isSelected(row)\"\n [attr.aria-label]=\"getRowSelectionAriaLabel(row, i)\"\n ></mat-radio-button>\n } @else {\n <mat-checkbox\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleRow(row)\"\n [checked]=\"selection.isSelected(row)\"\n [attr.aria-label]=\"getRowSelectionAriaLabel(row, i)\"\n ></mat-checkbox>\n }\n </td>\n </ng-container>\n }\n\n @if (isRowExpansionRuntimeEnabled()) {\n <ng-container matColumnDef=\"_expander\">\n <th mat-header-cell *matHeaderCellDef class=\"pfx-expansion-col-header\">\n <span class=\"praxis-visually-hidden-status\">Expandir detalhes da linha</span>\n </th>\n <td mat-cell *matCellDef=\"let row; let i = index\" class=\"pfx-expansion-col-cell\">\n <button\n mat-icon-button\n class=\"pfx-expansion-toggle\"\n [disabled]=\"!isRowExpandable(row, i) || !isExpansionIconTriggerEnabled()\"\n [attr.aria-expanded]=\"isRowExpanded(row, i) ? 'true' : 'false'\"\n [attr.aria-controls]=\"getRowExpansionDetailId(row, i)\"\n [attr.aria-label]=\"getRowExpansionToggleAriaLabel(row, i)\"\n (click)=\"onExpansionToggleFromIcon(row, i, $event)\"\n (keydown)=\"onExpansionToggleKeydown($event, row, i)\"\n >\n <mat-icon [praxisIcon]=\"isRowExpanded(row, i)\n ? getExpansionExpandedIcon()\n : getExpansionCollapsedIcon()\"></mat-icon>\n </button>\n </td>\n </ng-container>\n }\n @for (column of visibleColumns; track column.field) {\n <ng-container\n [matColumnDef]=\"column.field\"\n [sticky]=\"column.sticky === true || column.sticky === 'start'\"\n [stickyEnd]=\"column.sticky === 'end'\"\n >\n <th\n mat-header-cell\n *matHeaderCellDef\n cdkDrag\n [cdkDragData]=\"column\"\n cdkDragLockAxis=\"x\"\n cdkDragPreviewClass=\"pfx-column-drag-preview\"\n (cdkDragStarted)=\"onColumnDragStarted(column)\"\n (cdkDragEnded)=\"onColumnDragEnded($event, column)\"\n [cdkDragDisabled]=\"!isColumnDraggingEnabled() || !isColumnDraggable(column) || isColumnResizeActive()\"\n [class.praxis-header-draggable]=\"isColumnDraggingEnabled() && isColumnDraggable(column)\"\n [class.praxis-header-resizable]=\"isColumnResizable(column)\"\n [class.praxis-header-resizing]=\"isColumnResizeActive(column)\"\n [class.praxis-header-align-left]=\"column.align === 'left'\"\n [class.praxis-header-align-center]=\"column.align === 'center'\"\n [class.praxis-header-align-right]=\"column.align === 'right'\"\n [style.text-align]=\"getColumnTextAlignStyle(column)\"\n [style.width]=\"getColumnWidthStyle(column)\"\n [attr.style]=\"getColumnHeaderAttrStyle(column)\"\n [ngStyle]=\"getColumnHeaderNgStyle(column)\"\n >\n <span\n class=\"praxis-header-sort-trigger\"\n [mat-sort-header]=\"column.field\"\n [disabled]=\"!getSortingEnabled() || column.sortable === false || isColumnResizeActive()\"\n (keydown)=\"onColumnHeaderReorderKeydown($event, column)\"\n >\n <span class=\"praxis-header-label\" data-testid=\"column-header-label\">\n <span class=\"praxis-header-label-text\">{{ column.header }}</span>\n </span>\n </span>\n <ng-template cdkDragPreview [matchSize]=\"true\">\n <div\n class=\"pfx-column-drag-preview pfx-column-drag-preview-custom\"\n [class.praxis-header-align-left]=\"column.align === 'left'\"\n [class.praxis-header-align-center]=\"column.align === 'center'\"\n [class.praxis-header-align-right]=\"column.align === 'right'\"\n [style.text-align]=\"getColumnTextAlignStyle(column)\"\n >\n <span class=\"praxis-header-label\">\n <span class=\"praxis-header-label-text\">{{ column.header }}</span>\n </span>\n </div>\n </ng-template>\n @if (isColumnResizable(column)) {\n <span\n class=\"praxis-column-resize-handle\"\n role=\"separator\"\n aria-orientation=\"vertical\"\n tabindex=\"0\"\n [attr.aria-label]=\"getColumnResizeHandleAriaLabel(column)\"\n [attr.aria-valuemin]=\"getColumnResizeMinWidthAriaValue(column)\"\n [attr.aria-valuemax]=\"getColumnResizeMaxWidthAriaValue(column)\"\n [attr.aria-valuenow]=\"getColumnResizeCurrentWidthAriaValue(column)\"\n [attr.title]=\"getColumnResizeHandleTooltip(column)\"\n (pointerdown)=\"onColumnResizePointerDown($event, column)\"\n (keydown)=\"onColumnResizeHandleKeydown($event, column)\"\n (click)=\"onColumnResizeHandleClick($event)\"\n ></span>\n }\n </th>\n <td\n mat-cell\n *matCellDef=\"let element\"\n [style.text-align]=\"getColumnTextAlignStyle(column)\"\n [style.width]=\"getColumnWidthStyle(column)\"\n [attr.style]=\"getColumnCellAttrStyle(column)\"\n [ngClass]=\"getCellClasses(element, column)\"\n [ngStyle]=\"getCellNgStyle(element, column)\"\n [matTooltip]=\"getCellTooltip(element, column) || ''\"\n [matTooltipPosition]=\"getCellTooltipPosition(element, column)\"\n [matTooltipDisabled]=\"!getCellTooltip(element, column)\"\n [attr.title]=\"getCellTooltip(element, column) || null\"\n >\n <div\n class=\"pfx-cell-content\"\n [ngClass]=\"getCellContentClasses(element, column)\"\n [ngStyle]=\"getCellContentNgStyle(element, column)\"\n >\n @switch (getEffectiveRendererType(element, column)) {\n <!-- Icon renderer -->\n @case ('icon') {\n <span\n class=\"pfx-icon-renderer\"\n [style.color]=\"getIconColor(element, column) || null\"\n [ngStyle]=\"getIconStyle(element, column)\"\n [attr.aria-label]=\"getIconAriaLabel(element, column) || null\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-icon-renderer__content\"\n [nodes]=\"getIconRichContentNodes(element, column)\"\n ></praxis-rich-content>\n </span>\n }\n <!-- Image renderer -->\n @case ('image') {\n <span class=\"pfx-cell-image\">\n <praxis-rich-content\n rootClassName=\"pfx-cell-image__content\"\n [nodes]=\"getImageRichContentNodes(element, column)\"\n ></praxis-rich-content>\n </span>\n }\n <!-- Badge renderer -->\n @case ('badge') {\n @if (shouldRenderBadge(element, column)) {\n <span class=\"pfx-badge\" [ngClass]=\"getBadgeClasses(element, column)\">\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-badge__content\"\n [nodes]=\"getBadgeRichContentNodes(element, column)\"\n ></praxis-rich-content>\n </span>\n }\n }\n <!-- Link renderer -->\n @case ('link') {\n <a\n class=\"pfx-link\"\n [attr.href]=\"getLinkHref(element, column) || null\"\n [attr.target]=\"getLinkTarget(element, column) || null\"\n [attr.rel]=\"getLinkRel(element, column) || null\"\n (click)=\"$event.stopPropagation()\"\n ><praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-link__content\"\n [nodes]=\"getLinkRichContentNodes(element, column)\"\n ></praxis-rich-content></a\n >\n }\n <!-- Button renderer -->\n @case ('button') {\n @switch (getButtonVariant(element, column)) {\n @case ('outlined') {\n <button\n mat-stroked-button\n [color]=\"getButtonColor(element, column) || null\"\n [disabled]=\"isButtonDisabled(element, column)\"\n [attr.aria-label]=\"getButtonAriaLabel(element, column) || getButtonLabel(element, column)\"\n (click)=\"onButtonClick(element, column, $event)\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-button-renderer__content\"\n [nodes]=\"getButtonRichContentNodes(element, column)\"\n ></praxis-rich-content>\n </button>\n }\n @case ('text') {\n <button\n mat-button\n [color]=\"getButtonColor(element, column) || null\"\n [disabled]=\"isButtonDisabled(element, column)\"\n [attr.aria-label]=\"getButtonAriaLabel(element, column) || getButtonLabel(element, column)\"\n (click)=\"onButtonClick(element, column, $event)\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-button-renderer__content\"\n [nodes]=\"getButtonRichContentNodes(element, column)\"\n ></praxis-rich-content>\n </button>\n }\n @default {\n <button\n mat-flat-button\n [color]=\"getButtonColor(element, column) || null\"\n [disabled]=\"isButtonDisabled(element, column)\"\n [attr.aria-label]=\"getButtonAriaLabel(element, column) || getButtonLabel(element, column)\"\n (click)=\"onButtonClick(element, column, $event)\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-button-renderer__content\"\n [nodes]=\"getButtonRichContentNodes(element, column)\"\n ></praxis-rich-content>\n </button>\n }\n }\n }\n <!-- Chip renderer -->\n @case ('chip') {\n @if (shouldRenderChip(element, column)) {\n <span class=\"pfx-chip\" [ngClass]=\"getChipClasses(element, column)\">\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-chip__content\"\n [nodes]=\"getChipRichContentNodes(element, column)\"\n ></praxis-rich-content>\n </span>\n }\n }\n <!-- Progress renderer -->\n @case ('progress') {\n <div class=\"pfx-progress\">\n <praxis-rich-content\n rootClassName=\"pfx-progress__content\"\n [context]=\"getProgressRichContentContext(element, column)\"\n [nodes]=\"getProgressRichContentNodes(element, column)\"\n ></praxis-rich-content>\n </div>\n }\n <!-- Micro visualization renderer -->\n @case ('microVisualization') {\n <span class=\"pfx-micro-viz-cell\" [innerHTML]=\"getMicroVisualizationHtml(element, column)\"></span>\n }\n <!-- Avatar renderer -->\n @case ('avatar') {\n <span class=\"pfx-avatar-renderer\"\n [ngStyle]=\"getAvatarStyle(element, column)\"\n [class.shape-rounded]=\"getAvatarShape(element, column) === 'rounded'\"\n [class.shape-circle]=\"getAvatarShape(element, column) === 'circle'\">\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-avatar-renderer__content\"\n [nodes]=\"getAvatarRichContentNodes(element, column)\"\n ></praxis-rich-content>\n </span>\n }\n <!-- Toggle renderer -->\n @case ('toggle') {\n <mat-slide-toggle\n [checked]=\"getToggleState(element, column)\"\n [disabled]=\"isToggleDisabled(element, column)\"\n [attr.aria-label]=\"getToggleAriaLabel(element, column) || 'Alternar'\"\n (change)=\"onToggleChange(element, column, $event)\"\n (click)=\"$event.stopPropagation()\"\n ></mat-slide-toggle>\n }\n <!-- Menu renderer -->\n @case ('menu') {\n <button mat-icon-button [matMenuTriggerFor]=\"menuRef\" (click)=\"$event.stopPropagation()\" [attr.aria-label]=\"getMenuAriaLabel(element, column) || 'Menu'\">\n <praxis-rich-content rootClassName=\"pfx-menu-trigger__content\" [nodes]=\"getMenuTriggerRichContentNodes()\"></praxis-rich-content>\n </button>\n <mat-menu #menuRef=\"matMenu\">\n @for (it of getMenuItems(element, column); track it.id) {\n <button mat-menu-item (click)=\"onMenuItemClick(it, element, $event)\" [disabled]=\"!it.__visible\" >\n <praxis-rich-content\n rootClassName=\"pfx-menu-item__content\"\n [nodes]=\"getMenuItemRichContentNodes(it)\"\n ></praxis-rich-content>\n </button>\n }\n </mat-menu>\n }\n <!-- Rating renderer -->\n @case ('rating') {\n <praxis-table-rating\n class=\"pfx-rating-cell\"\n [itemsCount]=\"getRatingMax(element, column)\"\n [value]=\"getRatingValue(element, column)\"\n [size]=\"getRatingSize(element, column)\"\n [ratingColor]=\"getRatingColor(element, column)\"\n [outlineColor]=\"getRatingOutlineColor(element, column)\"\n [ariaLabel]=\"getRatingAriaLabel(element, column) || column.header\">\n </praxis-table-rating>\n }\n <!-- HTML renderer (sanitizado) -->\n @case ('html') {\n <span [innerHTML]=\"getSafeHtml(element, column)\"></span>\n }\n <!-- Compose renderer -->\n @case ('compose') {\n <span class=\"pfx-cell-compose\" [ngClass]=\"getComposeClasses(element, column)\" [ngStyle]=\"getComposeGapStyle(element, column)\">\n @for (it of getComposeItems(element, column); track trackComposeItem($index, it)) {\n @switch (getItemEffectiveType(element, column, it)) {\n <!-- Reuse helpers by projecting item as faux column -->\n @case ('icon') {\n <span class=\"pfx-icon-renderer\" [style.color]=\"getIconColor(element, asItemColumn(column, it)) || null\" [ngStyle]=\"getIconStyle(element, asItemColumn(column, it))\" [attr.aria-label]=\"getIconAriaLabel(element, asItemColumn(column, it)) || null\"><praxis-rich-content [layout]=\"'inline'\" rootClassName=\"pfx-icon-renderer__content\" [nodes]=\"getIconRichContentNodes(element, asItemColumn(column, it))\"></praxis-rich-content></span>\n }\n @case ('image') {\n <span class=\"pfx-cell-image\"><praxis-rich-content rootClassName=\"pfx-cell-image__content\" [nodes]=\"getImageRichContentNodes(element, asItemColumn(column, it))\"></praxis-rich-content></span>\n }\n @case ('badge') {\n @if (shouldRenderBadge(element, asItemColumn(column, it))) {\n <span class=\"pfx-badge\" [ngClass]=\"getBadgeClasses(element, asItemColumn(column, it))\"><praxis-rich-content [layout]=\"'inline'\" rootClassName=\"pfx-badge__content\" [nodes]=\"getBadgeRichContentNodes(element, asItemColumn(column, it))\"></praxis-rich-content></span>\n }\n }\n @case ('link') {\n <a class=\"pfx-link\" [attr.href]=\"getLinkHref(element, asItemColumn(column, it)) || null\" [attr.target]=\"getLinkTarget(element, asItemColumn(column, it)) || null\" [attr.rel]=\"getLinkRel(element, asItemColumn(column, it)) || null\" (click)=\"$event.stopPropagation()\"><praxis-rich-content [layout]=\"'inline'\" rootClassName=\"pfx-link__content\" [nodes]=\"getLinkRichContentNodes(element, asItemColumn(column, it))\"></praxis-rich-content></a>\n }\n @case ('button') {\n @switch (getButtonVariant(element, asItemColumn(column, it))) {\n @case ('outlined') {\n <button mat-stroked-button [color]=\"getButtonColor(element, asItemColumn(column, it)) || null\" [disabled]=\"isButtonDisabled(element, asItemColumn(column, it))\" [attr.aria-label]=\"getButtonAriaLabel(element, asItemColumn(column, it)) || getButtonLabel(element, asItemColumn(column, it))\" (click)=\"onButtonClick(element, asItemColumn(column, it), $event)\"><praxis-rich-content [layout]=\"'inline'\" rootClassName=\"pfx-button-renderer__content\" [nodes]=\"getButtonRichContentNodes(element, asItemColumn(column, it))\"></praxis-rich-content></button>\n }\n @case ('text') {\n <button mat-button [color]=\"getButtonColor(element, asItemColumn(column, it)) || null\" [disabled]=\"isButtonDisabled(element, asItemColumn(column, it))\" [attr.aria-label]=\"getButtonAriaLabel(element, asItemColumn(column, it)) || getButtonLabel(element, asItemColumn(column, it))\" (click)=\"onButtonClick(element, asItemColumn(column, it), $event)\"><praxis-rich-content [layout]=\"'inline'\" rootClassName=\"pfx-button-renderer__content\" [nodes]=\"getButtonRichContentNodes(element, asItemColumn(column, it))\"></praxis-rich-content></button>\n }\n @default {\n <button mat-flat-button [color]=\"getButtonColor(element, asItemColumn(column, it)) || null\" [disabled]=\"isButtonDisabled(element, asItemColumn(column, it))\" [attr.aria-label]=\"getButtonAriaLabel(element, asItemColumn(column, it)) || getButtonLabel(element, asItemColumn(column, it))\" (click)=\"onButtonClick(element, asItemColumn(column, it), $event)\"><praxis-rich-content [layout]=\"'inline'\" rootClassName=\"pfx-button-renderer__content\" [nodes]=\"getButtonRichContentNodes(element, asItemColumn(column, it))\"></praxis-rich-content></button>\n }\n }\n }\n @case ('chip') {\n @if (shouldRenderChip(element, asItemColumn(column, it))) {\n <span class=\"pfx-chip\" [ngClass]=\"getChipClasses(element, asItemColumn(column, it))\"><praxis-rich-content [layout]=\"'inline'\" rootClassName=\"pfx-chip__content\" [nodes]=\"getChipRichContentNodes(element, asItemColumn(column, it))\"></praxis-rich-content></span>\n }\n }\n @case ('progress') {\n <div class=\"pfx-progress\">\n <praxis-rich-content\n rootClassName=\"pfx-progress__content\"\n [context]=\"getProgressRichContentContext(element, asItemColumn(column, it))\"\n [nodes]=\"getProgressRichContentNodes(element, asItemColumn(column, it))\"\n ></praxis-rich-content>\n </div>\n }\n @case ('microVisualization') {\n <span class=\"pfx-micro-viz-cell\" [innerHTML]=\"getMicroVisualizationHtml(element, asItemColumn(column, it))\"></span>\n }\n @case ('avatar') {\n <span class=\"pfx-avatar-renderer\" [ngStyle]=\"getAvatarStyle(element, asItemColumn(column, it))\" [class.shape-rounded]=\"getAvatarShape(element, asItemColumn(column, it)) === 'rounded'\" [class.shape-circle]=\"getAvatarShape(element, asItemColumn(column, it)) === 'circle'\"><praxis-rich-content rootClassName=\"pfx-avatar-renderer__content\" [nodes]=\"getAvatarRichContentNodes(element, asItemColumn(column, it))\"></praxis-rich-content></span>\n }\n @case ('toggle') {\n <mat-slide-toggle [checked]=\"getToggleState(element, asItemColumn(column, it))\" [disabled]=\"isToggleDisabled(element, asItemColumn(column, it))\" [attr.aria-label]=\"getToggleAriaLabel(element, asItemColumn(column, it)) || 'Alternar'\" (change)=\"onToggleChange(element, asItemColumn(column, it), $event)\" (click)=\"$event.stopPropagation()\"></mat-slide-toggle>\n }\n @case ('menu') {\n <button mat-icon-button [matMenuTriggerFor]=\"menuRef\" (click)=\"$event.stopPropagation()\" [attr.aria-label]=\"getMenuAriaLabel(element, asItemColumn(column, it)) || 'Menu'\"><praxis-rich-content rootClassName=\"pfx-menu-trigger__content\" [nodes]=\"getMenuTriggerRichContentNodes()\"></praxis-rich-content></button>\n <mat-menu #menuRef=\"matMenu\">\n @for (mi of getMenuItems(element, asItemColumn(column, it)); track mi.id) {\n <button mat-menu-item (click)=\"onMenuItemClick(mi, element, $event)\" [disabled]=\"!mi.__visible\">\n <praxis-rich-content\n rootClassName=\"pfx-menu-item__content\"\n [nodes]=\"getMenuItemRichContentNodes(mi)\"\n ></praxis-rich-content>\n </button>\n }\n </mat-menu>\n }\n @case ('rating') {\n <praxis-table-rating\n class=\"pfx-rating-cell\"\n [itemsCount]=\"getRatingMax(element, asItemColumn(column, it))\"\n [value]=\"getRatingValue(element, asItemColumn(column, it))\"\n [size]=\"getRatingSize(element, asItemColumn(column, it))\"\n [ratingColor]=\"getRatingColor(element, asItemColumn(column, it))\"\n [outlineColor]=\"getRatingOutlineColor(element, asItemColumn(column, it))\"\n [ariaLabel]=\"getRatingAriaLabel(element, asItemColumn(column, it)) || column.header\">\n </praxis-table-rating>\n }\n @case ('html') {\n <span [innerHTML]=\"getSafeHtml(element, asItemColumn(column, it))\"></span>\n }\n <!-- Value item: render base cell text alongside visuals -->\n @case ('value') {\n <span class=\"pfx-cell-value\">{{ getComposeItemValue(element, column, it) }}</span>\n }\n }\n }\n </span>\n }\n <!-- Default text rendering -->\n @default {\n {{ getCellValue(element, column) }}\n }\n }\n </div>\n </td>\n </ng-container>\n }\n @if (config.actions?.row?.enabled) {\n <ng-container matColumnDef=\"_actions\" [sticky]=\"config.actions?.row?.sticky === true || config.actions?.row?.sticky === 'start'\" [stickyEnd]=\"config.actions?.row?.sticky === 'end'\">\n <th mat-header-cell *matHeaderCellDef #actionsHeaderCell [style.width]=\"getRowActionsWidthStyle()\" class=\"praxis-actions-header\" [class.align-start]=\"getActionsHeaderAlign() === 'start'\" [class.align-center]=\"getActionsHeaderAlign() === 'center'\" [class.align-end]=\"getActionsHeaderAlign() === 'end'\">\n <div class=\"praxis-actions-header__content\" [matTooltip]=\"getActionsHeaderTooltip() || ''\" [matTooltipDisabled]=\"!getActionsHeaderTooltip()\">\n <praxis-rich-content\n rootClassName=\"praxis-actions-header__nodes\"\n [nodes]=\"getActionsHeaderRichContentNodes()\"\n ></praxis-rich-content>\n </div>\n </th>\n <td\n mat-cell\n *matCellDef=\"let row\"\n class=\"praxis-actions-cell\"\n [class.dense]=\"dense\"\n [style.width]=\"getRowActionsWidthStyle()\"\n >\n <div\n class=\"praxis-actions-cell__content\"\n [class.praxis-actions-cell__content--discovering]=\"isRowDiscoveryPending(row)\"\n [attr.aria-busy]=\"isRowDiscoveryPending(row) ? 'true' : null\"\n >\n <!-- A\u00C3\u00A7\u00C3\u00B5es inline -->\n <!-- Inline actions: icons mode -->\n @if (config.actions?.row?.display === 'icons' || !config.actions?.row?.display) {\n @for (a of getInlineRowActions(row); track trackAction($index, a)) {\n <span\n class=\"praxis-row-action-anchor\"\n [class.praxis-row-action-anchor--workflow]=\"isWorkflowRowAction(a)\"\n [class.praxis-row-action-anchor--blocked]=\"isBlockedWorkflowRowAction(a, row)\"\n [matTooltip]=\"getActionTooltip(a, row)\"\n [matTooltipDisabled]=\"!getActionTooltip(a, row)\"\n matTooltipPosition=\"above\"\n matTooltipClass=\"praxis-tooltip\"\n >\n <button\n mat-icon-button\n class=\"praxis-icon-btn\"\n [class.praxis-icon-btn--workflow]=\"isWorkflowRowAction(a)\"\n [class.praxis-icon-btn--blocked]=\"isBlockedWorkflowRowAction(a, row)\"\n [disabled]=\"isActionDisabled(a, row)\"\n (click)=\"onRowAction(getActionId(a), row, $event, getRowActionRuntimeOptions(a, row))\"\n [attr.aria-label]=\"a.label || getActionId(a)\"\n [color]=\"a.color || null\"\n >\n <praxis-rich-content\n layout=\"inline\"\n rootClassName=\"praxis-row-action__content\"\n [nodes]=\"getRowActionIconRichContentNodes(a)\"\n ></praxis-rich-content>\n </button>\n </span>\n }\n }\n\n <!-- Inline actions: buttons mode (show label + icon) -->\n @if (config.actions?.row?.display === 'buttons') {\n @for (a of getInlineRowActions(row); track trackAction($index, a)) {\n <span\n class=\"praxis-row-action-anchor\"\n [class.praxis-row-action-anchor--workflow]=\"isWorkflowRowAction(a)\"\n [class.praxis-row-action-anchor--blocked]=\"isBlockedWorkflowRowAction(a, row)\"\n [matTooltip]=\"getActionTooltip(a, row)\"\n [matTooltipDisabled]=\"!getActionTooltip(a, row)\"\n matTooltipPosition=\"above\"\n matTooltipClass=\"praxis-tooltip\"\n >\n <button\n mat-flat-button\n class=\"praxis-row-btn\"\n [class.praxis-row-btn--workflow]=\"isWorkflowRowAction(a)\"\n [class.praxis-row-btn--blocked]=\"isBlockedWorkflowRowAction(a, row)\"\n [disabled]=\"isActionDisabled(a, row)\"\n (click)=\"onRowAction(getActionId(a), row, $event, getRowActionRuntimeOptions(a, row))\"\n [attr.aria-label]=\"a.label || getActionId(a)\"\n [color]=\"a.color || null\"\n >\n <praxis-rich-content\n layout=\"inline\"\n rootClassName=\"praxis-row-action__content\"\n [nodes]=\"getRowActionRichContentNodes(a)\"\n ></praxis-rich-content>\n </button>\n </span>\n }\n }\n\n <!-- Menu de overflow -->\n @if (hasOverflowRowActions(row)) {\n <button\n mat-icon-button\n class=\"praxis-icon-btn praxis-more-btn\"\n [matMenuTriggerFor]=\"rowMoreMenu\"\n (menuOpened)=\"onRowOverflowMenuOpened(row)\"\n [color]=\"getRowMenuButtonColor() || null\"\n [attr.aria-label]=\"getRowMenuTooltip(row)\"\n [matTooltip]=\"getRowMenuTooltip(row)\"\n matTooltipPosition=\"above\"\n >\n <mat-icon [praxisIcon]=\"getRowMenuIcon()\"></mat-icon>\n </button>\n }\n <mat-menu #rowMoreMenu=\"matMenu\" xPosition=\"before\">\n @if (hasRowOverflowMenuLoadingState(row)) {\n <button mat-menu-item disabled>\n <mat-icon>hourglass_empty</mat-icon>\n <praxis-rich-content\n rootClassName=\"praxis-row-overflow-menu__label\"\n [nodes]=\"getTableChromeTextRichContentNodes(getRowOverflowMenuLoadingLabel(), 'praxis-row-overflow-menu__label-text')\"\n ></praxis-rich-content>\n </button>\n }\n @for (a of getOverflowRowActions(row); track trackAction($index, a)) {\n <button\n mat-menu-item\n (click)=\"onRowAction(getActionId(a), row, $event, getRowActionRuntimeOptions(a, row))\"\n [disabled]=\"isActionDisabled(a, row)\"\n >\n <mat-icon [color]=\"a.color || null\" [praxisIcon]=\"a.icon\"></mat-icon>\n <praxis-rich-content\n rootClassName=\"praxis-row-overflow-menu__label\"\n [nodes]=\"getTableChromeTextRichContentNodes(a.label || getActionId(a), 'praxis-row-overflow-menu__label-text')\"\n ></praxis-rich-content>\n </button>\n }\n @if (hasRowOverflowMenuEmptyState(row)) {\n <button mat-menu-item disabled>\n <mat-icon>info</mat-icon>\n <praxis-rich-content\n rootClassName=\"praxis-row-overflow-menu__label\"\n [nodes]=\"getTableChromeTextRichContentNodes(getRowOverflowMenuEmptyLabel(row), 'praxis-row-overflow-menu__label-text')\"\n ></praxis-rich-content>\n </button>\n }\n </mat-menu>\n </div>\n </td>\n </ng-container>\n }\n\n <tr\n mat-header-row\n *matHeaderRowDef=\"displayedColumns\"\n ></tr>\n @if (!isVirtualized()) {\n <tr\n mat-row\n *matRowDef=\"let row; let i = index; columns: displayedColumns\"\n [class.pfx-row-selected]=\"selection.isSelected(row)\"\n [class.pfx-row-click-selectable]=\"isRowClickSelectable()\"\n [class.pfx-row-expanded]=\"isRowExpansionRuntimeEnabled() && isRowExpanded(row, i)\"\n [attr.aria-selected]=\"config.behavior?.selection?.enabled ? (selection.isSelected(row) ? 'true' : 'false') : null\"\n [attr.aria-expanded]=\"isRowExpansionRuntimeEnabled() ? (isRowExpanded(row, i) ? 'true' : 'false') : null\"\n [ngClass]=\"getRowClasses(row)\"\n [ngStyle]=\"getRowNgStyle(row)\"\n [matTooltip]=\"getRowTooltip(row) || null\"\n [matTooltipDisabled]=\"!getRowTooltip(row)\"\n [matTooltipPosition]=\"getRowTooltipPosition(row)\"\n [matTooltipShowDelay]=\"getRowTooltipShowDelay(row)\"\n (click)=\"onRowClicked(row, i, $event)\"\n (dblclick)=\"onRowDoubleClicked(row, i)\"\n ></tr>\n @if (isRowExpansionRuntimeEnabled()) {\n <ng-container matColumnDef=\"_detail\">\n <td\n mat-cell\n *matCellDef=\"let row; let i = index\"\n class=\"pfx-expansion-detail-cell\"\n [attr.colspan]=\"displayedColumns.length\"\n >\n <section\n class=\"pfx-expansion-detail-panel\"\n [ngClass]=\"getExpansionMotionPresetClass()\"\n [ngStyle]=\"getExpansionMotionStyle()\"\n [attr.id]=\"getRowExpansionDetailId(row, i)\"\n role=\"region\"\n [attr.aria-label]=\"getRowExpansionRegionAriaLabel(row, i)\"\n [attr.aria-busy]=\"getExpansionDetailViewState(row, i).status === 'loading' ? 'true' : 'false'\"\n >\n @let detailState = getExpansionDetailViewState(row, i);\n @if (detailState.status === 'loading') {\n <div class=\"pfx-expansion-detail-message\" role=\"status\" aria-live=\"polite\">\n <praxis-rich-content\n rootClassName=\"pfx-expansion-detail-message__content\"\n [nodes]=\"getExpansionDetailTextRichContentNodes('Carregando detail schema...', 'pfx-expansion-detail-message__text')\"\n [context]=\"getExpansionDetailRichContentContext(row, i)\"\n ></praxis-rich-content>\n </div>\n } @else if (detailState.status !== 'ready') {\n <div\n class=\"pfx-expansion-detail-message pfx-expansion-detail-message--error\"\n role=\"alert\"\n aria-live=\"assertive\"\n aria-atomic=\"true\"\n >\n <praxis-rich-content\n rootClassName=\"pfx-expansion-detail-message__content\"\n [nodes]=\"getExpansionDetailTextRichContentNodes(detailState.message || 'Detail indispon\u00EDvel para esta linha.', 'pfx-expansion-detail-message__text')\"\n [context]=\"getExpansionDetailRichContentContext(row, i)\"\n ></praxis-rich-content>\n </div>\n } @else {\n @if (getExpansionDetailLayout(detailState.schema) === 'tabs') {\n @let detailTabs = getExpansionDetailTabs(detailState.schema);\n @if (detailTabs.length) {\n <div class=\"pfx-expansion-detail-tabs\" role=\"tablist\" aria-label=\"Se\u00C3\u00A7\u00C3\u00B5es do detail\">\n @for (tab of detailTabs; track $index; let tabIndex = $index) {\n <button\n type=\"button\"\n class=\"pfx-expansion-detail-tab-btn\"\n role=\"tab\"\n [attr.id]=\"getExpansionDetailTabId(row, i, tab, tabIndex)\"\n [attr.aria-controls]=\"getExpansionDetailPanelId(row, i, tab, tabIndex)\"\n [attr.aria-selected]=\"isExpansionDetailTabActive(row, i, tab, tabIndex, detailTabs) ? 'true' : 'false'\"\n [attr.tabindex]=\"isExpansionDetailTabActive(row, i, tab, tabIndex, detailTabs) ? '0' : '-1'\"\n [class.is-active]=\"isExpansionDetailTabActive(row, i, tab, tabIndex, detailTabs)\"\n (click)=\"onExpansionDetailTabSelect(row, i, tab, tabIndex, $event)\"\n (keydown)=\"onExpansionDetailTabKeydown($event, row, i, tabIndex, detailTabs)\"\n >\n <praxis-rich-content\n rootClassName=\"pfx-expansion-detail-tab-btn__content\"\n [nodes]=\"getExpansionDetailTabButtonRichContentNodes(tab)\"\n [context]=\"getExpansionDetailRichContentContext(row, i)\"\n ></praxis-rich-content>\n </button>\n }\n </div>\n @for (tab of detailTabs; track $index; let tabIndex = $index) {\n @if (isExpansionDetailTabActive(row, i, tab, tabIndex, detailTabs)) {\n <div\n class=\"pfx-expansion-detail-tab-panel\"\n role=\"tabpanel\"\n [attr.id]=\"getExpansionDetailPanelId(row, i, tab, tabIndex)\"\n [attr.aria-labelledby]=\"getExpansionDetailTabId(row, i, tab, tabIndex)\"\n >\n @if (getExpansionDetailTabRichContentNodes(tab, row, i); as richNodes) {\n <praxis-rich-content\n class=\"pfx-expansion-node-host pfx-expansion-node-host--tab\"\n [nodes]=\"richNodes\"\n [context]=\"getExpansionDetailRichContentContext(row, i)\"\n ></praxis-rich-content>\n } @else {\n @for (childNode of getExpansionDetailNodeChildren(tab); track $index) {\n <ng-container\n *ngTemplateOutlet=\"\n expansionDetailNodeTemplate;\n context: { $implicit: childNode, row: row, index: i }\n \"\n ></ng-container>\n }\n }\n </div>\n }\n }\n } @else {\n <div class=\"pfx-expansion-detail-message\">\n <praxis-rich-content\n rootClassName=\"pfx-expansion-detail-message__content\"\n [nodes]=\"getExpansionDetailTextRichContentNodes('Schema em layout tabs sem abas v\u00E1lidas.', 'pfx-expansion-detail-message__text')\"\n [context]=\"getExpansionDetailRichContentContext(row, i)\"\n ></praxis-rich-content>\n </div>\n }\n } @else {\n <div class=\"pfx-expansion-detail-stack\">\n @for (node of getExpansionDetailItems(detailState.schema); track $index) {\n <ng-container\n *ngTemplateOutlet=\"\n expansionDetailNodeTemplate;\n context: { $implicit: node, row: row, index: i }\n \"\n ></ng-container>\n }\n </div>\n }\n }\n\n <ng-template #expansionDetailNodeTemplate let-node let-row=\"row\" let-index=\"index\">\n @if (getExpansionDetailRichContentNodes(node, row, index); as richNodes) {\n <praxis-rich-content\n class=\"pfx-expansion-node-host\"\n [nodes]=\"richNodes\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n } @else {\n @switch (getExpansionDetailNodeType(node)) {\n @case ('list') {\n <section class=\"pfx-expansion-node pfx-expansion-node-list\">\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-list__title\"\n [nodes]=\"getExpansionDetailTextRichContentNodes(getExpansionDetailNodeTitle(node, 'Lista'), 'pfx-expansion-node-list__title-text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n @let listItems = getExpansionDetailListItems(row, node);\n @let listEntries = getExpansionDetailListEntries(row, node);\n @if (listItems.length) {\n <ul>\n @for (entry of listEntries; track $index) {\n <li>\n @if (getExpansionDetailListItemRichContentNodes(entry); as richNodes) {\n <praxis-rich-content\n class=\"pfx-expansion-node-list__item-host\"\n [nodes]=\"richNodes\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n } @else {\n {{ formatExpansionDetailListEntry(entry) }}\n }\n </li>\n }\n </ul>\n } @else {\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-placeholder\"\n [nodes]=\"getExpansionDetailTextRichContentNodes('Sem itens.', 'pfx-expansion-node-placeholder__text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n }\n </section>\n }\n @case ('detailList') {\n <section class=\"pfx-expansion-node pfx-expansion-node-rich-list\">\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-rich-list__title\"\n [nodes]=\"getExpansionDetailTextRichContentNodes(getExpansionDetailNodeTitle(node, 'Cole\u00E7\u00E3o rica'), 'pfx-expansion-node-rich-list__title-text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n @let richListEntries = getExpansionDetailRichListEntries(row, node);\n @if (richListEntries.length) {\n <div class=\"pfx-expansion-node-rich-list__items\">\n @for (entry of richListEntries; track $index) {\n <article [class]=\"getExpansionDetailRichListItemClassName(node)\">\n <praxis-rich-content\n class=\"pfx-expansion-node-rich-list__item-host\"\n [nodes]=\"getExpansionDetailRichListItemNodes(node)\"\n [context]=\"getExpansionDetailRichListItemContext(row, index, node, entry, $index)\"\n ></praxis-rich-content>\n @let itemActions = getExpansionDetailRichListItemActions(node, row, index, entry, $index);\n @if (itemActions.length) {\n <div class=\"pfx-expansion-node-rich-list__item-actions\">\n @for (action of itemActions; track action.actionId) {\n <button\n type=\"button\"\n mat-stroked-button\n class=\"pfx-expansion-node-rich-list__item-action-btn\"\n [disabled]=\"isExpansionDetailRichListItemActionDisabled(action, row, index, node, entry, $index)\"\n (click)=\"onExpansionDetailRichListItemAction(action, row, index, node, entry, $index, $event)\"\n >\n <praxis-rich-content\n class=\"pfx-expansion-node-rich-list__item-action-host\"\n [nodes]=\"getExpansionDetailRichListItemActionNodes(action)\"\n [context]=\"getExpansionDetailRichListItemContext(row, index, node, entry, $index)\"\n ></praxis-rich-content>\n </button>\n }\n </div>\n }\n </article>\n }\n </div>\n } @else {\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-placeholder\"\n [nodes]=\"getExpansionDetailTextRichContentNodes(getExpansionDetailRichListEmptyText(node), 'pfx-expansion-node-placeholder__text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n }\n </section>\n }\n @case ('card') {\n <section class=\"pfx-expansion-node pfx-expansion-node-card\">\n <header class=\"pfx-expansion-node-card__header\">\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-card__title\"\n [nodes]=\"getExpansionDetailTextRichContentNodes(getExpansionDetailNodeTitle(node, 'Card'), 'pfx-expansion-node-card__title-text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n @if (node?.subtitle) {\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-card__subtitle\"\n [nodes]=\"getExpansionDetailTextRichContentNodes(node.subtitle, 'pfx-expansion-node-card__subtitle-text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n }\n </header>\n @if (getExpansionDetailNodeChildren(node).length) {\n <div class=\"pfx-expansion-node-card__content\">\n @for (childNode of getExpansionDetailNodeChildren(node); track $index) {\n <ng-container\n *ngTemplateOutlet=\"\n expansionDetailNodeTemplate;\n context: { $implicit: childNode, row: row, index: index }\n \"\n ></ng-container>\n }\n </div>\n }\n </section>\n }\n @case ('cardGrid') {\n <section class=\"pfx-expansion-node pfx-expansion-node-card-grid\">\n @if (getExpansionDetailCardGridHeaderNodes(node); as cardGridHeaderNodes) {\n @if (cardGridHeaderNodes.length) {\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-card-grid__header\"\n [nodes]=\"cardGridHeaderNodes\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n }\n }\n @let gridCards = getExpansionDetailCardGridCards(node);\n @if (gridCards.length) {\n <div\n class=\"pfx-expansion-node-card-grid__cards\"\n [ngStyle]=\"getExpansionDetailCardGridStyles(node)\"\n >\n @for (card of gridCards; track $index) {\n <praxis-rich-content\n class=\"pfx-expansion-node-card-grid__card-host\"\n [nodes]=\"getExpansionDetailCardGridCardNodes(card)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n }\n </div>\n } @else {\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-placeholder\"\n [nodes]=\"getExpansionDetailTextRichContentNodes('Sem itens.', 'pfx-expansion-node-placeholder__text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n }\n </section>\n }\n @case ('richText') {\n <div\n class=\"pfx-expansion-node pfx-expansion-node-richtext\"\n [innerHTML]=\"getExpansionDetailRichText(node)\"\n ></div>\n }\n @case ('formRef') {\n <section class=\"pfx-expansion-node pfx-expansion-node-embed\">\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-embed__header\"\n [nodes]=\"getExpansionDetailEmbedHeaderNodes(node)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-embed__meta\"\n [nodes]=\"getExpansionDetailEmbedMetaNodes(node)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-embed__empty\"\n [nodes]=\"getExpansionDetailTextRichContentNodes(getExpansionDetailEmbedEmptyText(node), 'pfx-expansion-node-embed__empty-text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n @if (getExpansionDetailEmbedAction(node, row, index); as embedAction) {\n <button\n type=\"button\"\n mat-stroked-button\n class=\"pfx-expansion-node-embed__action-btn\"\n [disabled]=\"isExpansionDetailEmbedActionDisabled(embedAction, row, index)\"\n (click)=\"onExpansionDetailEmbedAction(embedAction, row, index, $event)\"\n >\n <praxis-rich-content\n class=\"pfx-expansion-node-embed__action-host\"\n [nodes]=\"getExpansionDetailEmbedActionNodes(embedAction)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n </button>\n }\n </section>\n }\n @case ('tableRef') {\n <section class=\"pfx-expansion-node pfx-expansion-node-embed\">\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-embed__header\"\n [nodes]=\"getExpansionDetailEmbedHeaderNodes(node)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-embed__meta\"\n [nodes]=\"getExpansionDetailEmbedMetaNodes(node)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-embed__empty\"\n [nodes]=\"getExpansionDetailTextRichContentNodes(getExpansionDetailEmbedEmptyText(node), 'pfx-expansion-node-embed__empty-text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n @if (getExpansionDetailEmbedAction(node, row, index); as embedAction) {\n <button\n type=\"button\"\n mat-stroked-button\n class=\"pfx-expansion-node-embed__action-btn\"\n [disabled]=\"isExpansionDetailEmbedActionDisabled(embedAction, row, index)\"\n (click)=\"onExpansionDetailEmbedAction(embedAction, row, index, $event)\"\n >\n <praxis-rich-content\n class=\"pfx-expansion-node-embed__action-host\"\n [nodes]=\"getExpansionDetailEmbedActionNodes(embedAction)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n </button>\n }\n </section>\n }\n @case ('chartRef') {\n @if (getExpansionDetailInlineRendererView(node, row, index); as inlineRenderer) {\n <section class=\"pfx-expansion-node pfx-expansion-node-embed pfx-expansion-node-embed--inline pfx-expansion-node-embed--chart\">\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-embed__header\"\n [nodes]=\"getExpansionDetailEmbedHeaderNodes(node)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n <ng-container\n *ngComponentOutlet=\"inlineRenderer.component; inputs: inlineRenderer.inputs\"\n ></ng-container>\n @if (getExpansionDetailEmbedAction(node, row, index); as embedAction) {\n <button\n type=\"button\"\n mat-stroked-button\n class=\"pfx-expansion-node-embed__action-btn\"\n [disabled]=\"isExpansionDetailEmbedActionDisabled(embedAction, row, index)\"\n (click)=\"onExpansionDetailEmbedAction(embedAction, row, index, $event)\"\n >\n <praxis-rich-content\n class=\"pfx-expansion-node-embed__action-host\"\n [nodes]=\"getExpansionDetailEmbedActionNodes(embedAction)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n </button>\n }\n </section>\n } @else {\n <section class=\"pfx-expansion-node pfx-expansion-node-embed\">\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-embed__header\"\n [nodes]=\"getExpansionDetailEmbedHeaderNodes(node)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-embed__meta\"\n [nodes]=\"getExpansionDetailEmbedMetaNodes(node)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-embed__empty\"\n [nodes]=\"getExpansionDetailTextRichContentNodes(getExpansionDetailEmbedEmptyText(node), 'pfx-expansion-node-embed__empty-text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n @if (getExpansionDetailEmbedAction(node, row, index); as embedAction) {\n <button\n type=\"button\"\n mat-stroked-button\n class=\"pfx-expansion-node-embed__action-btn\"\n [disabled]=\"isExpansionDetailEmbedActionDisabled(embedAction, row, index)\"\n (click)=\"onExpansionDetailEmbedAction(embedAction, row, index, $event)\"\n >\n <praxis-rich-content\n class=\"pfx-expansion-node-embed__action-host\"\n [nodes]=\"getExpansionDetailEmbedActionNodes(embedAction)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n </button>\n }\n </section>\n }\n }\n @case ('templateRef') {\n <section class=\"pfx-expansion-node pfx-expansion-node-embed\">\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-embed__header\"\n [nodes]=\"getExpansionDetailEmbedHeaderNodes(node)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-embed__meta\"\n [nodes]=\"getExpansionDetailEmbedMetaNodes(node)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-embed__empty\"\n [nodes]=\"getExpansionDetailTextRichContentNodes(getExpansionDetailEmbedEmptyText(node), 'pfx-expansion-node-embed__empty-text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n @if (getExpansionDetailEmbedAction(node, row, index); as embedAction) {\n <button\n type=\"button\"\n mat-stroked-button\n class=\"pfx-expansion-node-embed__action-btn\"\n [disabled]=\"isExpansionDetailEmbedActionDisabled(embedAction, row, index)\"\n (click)=\"onExpansionDetailEmbedAction(embedAction, row, index, $event)\"\n >\n <praxis-rich-content\n class=\"pfx-expansion-node-embed__action-host\"\n [nodes]=\"getExpansionDetailEmbedActionNodes(embedAction)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n </button>\n }\n </section>\n }\n @case ('diagramEmbed') {\n <section class=\"pfx-expansion-node pfx-expansion-node-embed\">\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-embed__header\"\n [nodes]=\"getExpansionDetailEmbedHeaderNodes(node)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-embed__meta\"\n [nodes]=\"getExpansionDetailEmbedMetaNodes(node)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n @if (getExpansionDetailDiagramSource(row, node); as diagramSource) {\n <div class=\"pfx-expansion-node-embed__diagram\">\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-embed__diagram-label\"\n [nodes]=\"getExpansionDetailTextRichContentNodes(getExpansionDetailDiagramSourceLabel(), 'pfx-expansion-node-embed__diagram-label-text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n <pre class=\"pfx-expansion-node-embed__diagram-source\">{{ diagramSource }}</pre>\n </div>\n } @else {\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-embed__empty\"\n [nodes]=\"getExpansionDetailTextRichContentNodes(getExpansionDetailEmbedEmptyText(node), 'pfx-expansion-node-embed__empty-text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n }\n @if (getExpansionDetailEmbedAction(node, row, index); as embedAction) {\n <button\n type=\"button\"\n mat-stroked-button\n class=\"pfx-expansion-node-embed__action-btn\"\n [disabled]=\"isExpansionDetailEmbedActionDisabled(embedAction, row, index)\"\n (click)=\"onExpansionDetailEmbedAction(embedAction, row, index, $event)\"\n >\n <praxis-rich-content\n class=\"pfx-expansion-node-embed__action-host\"\n [nodes]=\"getExpansionDetailEmbedActionNodes(embedAction)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n </button>\n }\n </section>\n }\n @case ('action') {\n <div class=\"pfx-expansion-node pfx-expansion-node-action\">\n <button\n type=\"button\"\n mat-stroked-button\n [disabled]=\"isExpansionDetailActionDisabled(node)\"\n (click)=\"onExpansionDetailAction(node, row, $event)\"\n >\n <praxis-rich-content\n class=\"pfx-expansion-node-action__content\"\n [nodes]=\"getExpansionDetailActionRichContentNodes(node)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n </button>\n @if (getExpansionDetailActionStatusText(node); as actionStatusText) {\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-action__status\"\n [nodes]=\"getExpansionDetailTextRichContentNodes(actionStatusText, 'pfx-expansion-node-action__status-text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n }\n </div>\n }\n @case ('actionBar') {\n <section class=\"pfx-expansion-node pfx-expansion-node-action-bar\">\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-action-bar__title\"\n [nodes]=\"getExpansionDetailTextRichContentNodes(getExpansionDetailActionBarTitle(node), 'pfx-expansion-node-action-bar__title-text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n @let actionBarActions = getExpansionDetailActionBarActions(node, row, index);\n @if (actionBarActions.length) {\n <div class=\"pfx-expansion-node-action-bar__actions\">\n @for (action of actionBarActions; track action.actionId) {\n <button\n type=\"button\"\n mat-stroked-button\n class=\"pfx-expansion-node-action-bar__action-btn\"\n [disabled]=\"isExpansionDetailActionBarActionDisabled(action, row, index)\"\n (click)=\"onExpansionDetailActionBarAction(action, row, index, $event)\"\n >\n <praxis-rich-content\n class=\"pfx-expansion-node-action-bar__action-host\"\n [nodes]=\"getExpansionDetailActionBarActionNodes(action)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n </button>\n }\n </div>\n } @else {\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-placeholder\"\n [nodes]=\"getExpansionDetailTextRichContentNodes(getExpansionDetailActionBarEmptyText(node), 'pfx-expansion-node-placeholder__text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n }\n </section>\n }\n @case ('tab') {\n <div class=\"pfx-expansion-node pfx-expansion-node-placeholder\">\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-placeholder__content\"\n [nodes]=\"getExpansionDetailTextRichContentNodes('Node', 'pfx-expansion-node-placeholder__text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n <code>tab</code>\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-placeholder__content\"\n [nodes]=\"getExpansionDetailTextRichContentNodes('fora de contexto de tabs.', 'pfx-expansion-node-placeholder__text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n </div>\n }\n @default {\n <div class=\"pfx-expansion-node pfx-expansion-node-placeholder\">\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-placeholder__content\"\n [nodes]=\"getExpansionDetailTextRichContentNodes('Node n\u00E3o suportado:', 'pfx-expansion-node-placeholder__text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n <code>{{ getExpansionDetailNodeType(node) }}</code>\n </div>\n }\n }\n }\n </ng-template>\n </section>\n </td>\n </ng-container>\n <tr\n mat-row\n *matRowDef=\"let row; columns: expansionDetailRowColumns; when: isExpansionDetailRow\"\n class=\"pfx-expansion-detail-row\"\n ></tr>\n }\n }\n </table>\n }\n\n <!-- Virtual rows path (header preserved above) -->\n @if (shouldRenderDataSurface() && !schemaError && !dataError && isVirtualized()) {\n <cdk-virtual-scroll-viewport\n class=\"ptable-viewport\"\n [itemSize]=\"getVirtItemHeight()\"\n [minBufferPx]=\"getVirtBufferSize() * getVirtItemHeight()\"\n [maxBufferPx]=\"getVirtBufferSize() * getVirtItemHeight() * 2\"\n [style.minHeight]=\"getVirtMinHeightHostStyle()\"\n >\n <table\n class=\"mat-mdc-table\"\n [ngClass]=\"getTableElevationClassName()\"\n [class.table-stack-top]=\"hasTopToolbarStack()\"\n [style.width]=\"getVirtualTableWidthStyle()\"\n >\n <tbody>\n <tr class=\"mat-mdc-row\"\n *cdkVirtualFor=\"let row of dataSource.data; let i = index; trackBy: trackByRow\"\n [class.pfx-row-selected]=\"selection.isSelected(row)\"\n [class.pfx-row-click-selectable]=\"isRowClickSelectable()\"\n [attr.aria-selected]=\"config.behavior?.selection?.enabled ? (selection.isSelected(row) ? 'true' : 'false') : null\"\n [ngClass]=\"getRowClasses(row)\"\n [ngStyle]=\"getRowNgStyle(row)\"\n [matTooltip]=\"getRowTooltip(row) || null\"\n [matTooltipDisabled]=\"!getRowTooltip(row)\"\n [matTooltipPosition]=\"getRowTooltipPosition(row)\"\n [matTooltipShowDelay]=\"getRowTooltipShowDelay(row)\"\n (click)=\"onRowClicked(row, i, $event)\"\n (dblclick)=\"onRowDoubleClicked(row, i)\">\n <!-- Selection column -->\n @if (isSelectionColumnEnabled()) { <td class=\"mat-mdc-cell\">\n <mat-checkbox\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleRow(row)\"\n [checked]=\"selection.isSelected(row)\">\n </mat-checkbox>\n </td> }\n <!-- Data columns -->\n @for (column of visibleColumns; track column.field) {\n <td class=\"mat-mdc-cell\"\n [style.text-align]=\"getColumnTextAlignStyle(column)\"\n [style.width]=\"getColumnWidthStyle(column)\"\n [attr.style]=\"getColumnCellAttrStyle(column)\"\n [ngClass]=\"getCellClasses(row, column)\"\n [ngStyle]=\"getCellNgStyle(row, column)\"\n [matTooltip]=\"getCellTooltip(row, column) || ''\"\n [matTooltipPosition]=\"getCellTooltipPosition(row, column)\"\n [matTooltipDisabled]=\"!getCellTooltip(row, column)\"\n [attr.title]=\"getCellTooltip(row, column) || null\">\n <div\n class=\"pfx-cell-content\"\n [ngClass]=\"getCellContentClasses(row, column)\"\n [ngStyle]=\"getCellContentNgStyle(row, column)\"\n >\n @switch (getEffectiveRendererType(row, column)) {\n @case ('icon') {\n <span class=\"pfx-icon-renderer\"\n [style.color]=\"getIconColor(row, column) || null\"\n [ngStyle]=\"getIconStyle(row, column)\"\n [attr.aria-label]=\"getIconAriaLabel(row, column) || null\">\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-icon-renderer__content\"\n [nodes]=\"getIconRichContentNodes(row, column)\"\n ></praxis-rich-content>\n </span>\n }\n @case ('image') {\n <span class=\"pfx-cell-image\">\n <praxis-rich-content\n rootClassName=\"pfx-cell-image__content\"\n [nodes]=\"getImageRichContentNodes(row, column)\"\n ></praxis-rich-content>\n </span>\n }\n @case ('badge') {\n @if (shouldRenderBadge(row, column)) {\n <span class=\"pfx-badge\" [ngClass]=\"getBadgeClasses(row, column)\">\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-badge__content\"\n [nodes]=\"getBadgeRichContentNodes(row, column)\"\n ></praxis-rich-content>\n </span>\n }\n }\n @case ('chip') {\n @if (shouldRenderChip(row, column)) {\n <span class=\"pfx-chip\" [ngClass]=\"getChipClasses(row, column)\">\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-chip__content\"\n [nodes]=\"getChipRichContentNodes(row, column)\"\n ></praxis-rich-content>\n </span>\n }\n }\n @case ('progress') {\n <div class=\"pfx-progress\">\n <praxis-rich-content\n rootClassName=\"pfx-progress__content\"\n [context]=\"getProgressRichContentContext(row, column)\"\n [nodes]=\"getProgressRichContentNodes(row, column)\"\n ></praxis-rich-content>\n </div>\n }\n @case ('microVisualization') {\n <span class=\"pfx-micro-viz-cell\" [innerHTML]=\"getMicroVisualizationHtml(row, column)\"></span>\n }\n @case ('avatar') {\n <span\n class=\"pfx-avatar-renderer\"\n [ngStyle]=\"getAvatarStyle(row, column)\"\n [class.shape-rounded]=\"getAvatarShape(row, column) === 'rounded'\"\n [class.shape-circle]=\"getAvatarShape(row, column) === 'circle'\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-avatar-renderer__content\"\n [nodes]=\"getAvatarRichContentNodes(row, column)\"\n ></praxis-rich-content>\n </span>\n }\n @case ('link') {\n <a\n class=\"pfx-link\"\n [attr.href]=\"getLinkHref(row, column) || null\"\n [attr.target]=\"getLinkTarget(row, column) || null\"\n [attr.rel]=\"getLinkRel(row, column) || null\"\n (click)=\"$event.stopPropagation()\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-link__content\"\n [nodes]=\"getLinkRichContentNodes(row, column)\"\n ></praxis-rich-content>\n </a>\n }\n @case ('button') {\n @switch (getButtonVariant(row, column)) {\n @case ('outlined') {\n <button\n mat-stroked-button\n [color]=\"getButtonColor(row, column) || null\"\n [disabled]=\"isButtonDisabled(row, column)\"\n [attr.aria-label]=\"getButtonAriaLabel(row, column) || getButtonLabel(row, column)\"\n (click)=\"onButtonClick(row, column, $event)\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-button-renderer__content\"\n [nodes]=\"getButtonRichContentNodes(row, column)\"\n ></praxis-rich-content>\n </button>\n }\n @case ('text') {\n <button\n mat-button\n [color]=\"getButtonColor(row, column) || null\"\n [disabled]=\"isButtonDisabled(row, column)\"\n [attr.aria-label]=\"getButtonAriaLabel(row, column) || getButtonLabel(row, column)\"\n (click)=\"onButtonClick(row, column, $event)\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-button-renderer__content\"\n [nodes]=\"getButtonRichContentNodes(row, column)\"\n ></praxis-rich-content>\n </button>\n }\n @default {\n <button\n mat-flat-button\n [color]=\"getButtonColor(row, column) || null\"\n [disabled]=\"isButtonDisabled(row, column)\"\n [attr.aria-label]=\"getButtonAriaLabel(row, column) || getButtonLabel(row, column)\"\n (click)=\"onButtonClick(row, column, $event)\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-button-renderer__content\"\n [nodes]=\"getButtonRichContentNodes(row, column)\"\n ></praxis-rich-content>\n </button>\n }\n }\n }\n @case ('menu') {\n <button\n mat-icon-button\n [matMenuTriggerFor]=\"menuRef\"\n (click)=\"$event.stopPropagation()\"\n [attr.aria-label]=\"getMenuAriaLabel(row, column) || 'Menu'\"\n >\n <praxis-rich-content\n rootClassName=\"pfx-menu-trigger__content\"\n [nodes]=\"getMenuTriggerRichContentNodes()\"\n ></praxis-rich-content>\n </button>\n <mat-menu #menuRef=\"matMenu\">\n @for (it of getMenuItems(row, column); track it.id) {\n <button\n mat-menu-item\n (click)=\"onMenuItemClick(it, row, $event)\"\n [disabled]=\"!it.__visible\"\n >\n <praxis-rich-content\n rootClassName=\"pfx-menu-item__content\"\n [nodes]=\"getMenuItemRichContentNodes(it)\"\n ></praxis-rich-content>\n </button>\n }\n </mat-menu>\n }\n @default {\n {{ getCellValue(row, column) }}\n }\n }\n </div>\n </td>\n }\n\n <!-- Actions column -->\n @if (config.actions?.row?.enabled) {\n <td class=\"mat-mdc-cell praxis-actions-cell\" [class.dense]=\"dense\" [style.width]=\"getRowActionsWidthStyle()\">\n <div\n class=\"praxis-actions-cell__content\"\n [class.praxis-actions-cell__content--discovering]=\"isRowDiscoveryPending(row)\"\n [attr.aria-busy]=\"isRowDiscoveryPending(row) ? 'true' : null\"\n >\n @if (config.actions?.row?.display === 'icons' || !config.actions?.row?.display) {\n @for (a of getInlineRowActions(row); track trackAction($index, a)) {\n <span\n class=\"praxis-row-action-anchor\"\n [class.praxis-row-action-anchor--workflow]=\"isWorkflowRowAction(a)\"\n [class.praxis-row-action-anchor--blocked]=\"isBlockedWorkflowRowAction(a, row)\"\n [matTooltip]=\"getActionTooltip(a, row)\"\n [matTooltipDisabled]=\"!getActionTooltip(a, row)\"\n matTooltipPosition=\"above\"\n matTooltipClass=\"praxis-tooltip\"\n >\n <button mat-icon-button class=\"praxis-icon-btn\"\n [class.praxis-icon-btn--workflow]=\"isWorkflowRowAction(a)\"\n [class.praxis-icon-btn--blocked]=\"isBlockedWorkflowRowAction(a, row)\"\n [disabled]=\"isActionDisabled(a, row)\"\n (click)=\"onRowAction(getActionId(a), row, $event, getRowActionRuntimeOptions(a, row))\"\n [attr.aria-label]=\"a.label || getActionId(a)\"\n [color]=\"a.color || null\">\n <praxis-rich-content\n layout=\"inline\"\n rootClassName=\"praxis-row-action__content\"\n [nodes]=\"getRowActionIconRichContentNodes(a)\"\n ></praxis-rich-content>\n </button>\n </span>\n }\n }\n @if (config.actions?.row?.display === 'buttons') {\n @for (a of getInlineRowActions(row); track trackAction($index, a)) {\n <span\n class=\"praxis-row-action-anchor\"\n [class.praxis-row-action-anchor--workflow]=\"isWorkflowRowAction(a)\"\n [class.praxis-row-action-anchor--blocked]=\"isBlockedWorkflowRowAction(a, row)\"\n [matTooltip]=\"getActionTooltip(a, row)\"\n [matTooltipDisabled]=\"!getActionTooltip(a, row)\"\n matTooltipPosition=\"above\"\n matTooltipClass=\"praxis-tooltip\"\n >\n <button mat-flat-button class=\"praxis-row-btn\"\n [class.praxis-row-btn--workflow]=\"isWorkflowRowAction(a)\"\n [class.praxis-row-btn--blocked]=\"isBlockedWorkflowRowAction(a, row)\"\n [disabled]=\"isActionDisabled(a, row)\"\n (click)=\"onRowAction(getActionId(a), row, $event, getRowActionRuntimeOptions(a, row))\"\n [attr.aria-label]=\"a.label || getActionId(a)\"\n [color]=\"a.color || null\">\n <praxis-rich-content\n layout=\"inline\"\n rootClassName=\"praxis-row-action__content\"\n [nodes]=\"getRowActionRichContentNodes(a)\"\n ></praxis-rich-content>\n </button>\n </span>\n }\n }\n @if (hasOverflowRowActions(row)) {\n <button mat-icon-button class=\"praxis-icon-btn praxis-more-btn\"\n [matMenuTriggerFor]=\"rowMoreMenuV\"\n (menuOpened)=\"onRowOverflowMenuOpened(row)\"\n [color]=\"getRowMenuButtonColor() || null\"\n [attr.aria-label]=\"getRowMenuTooltip(row)\"\n [matTooltip]=\"getRowMenuTooltip(row)\"\n matTooltipPosition=\"above\">\n <mat-icon [praxisIcon]=\"getRowMenuIcon()\"></mat-icon>\n </button>\n }\n <mat-menu #rowMoreMenuV=\"matMenu\" xPosition=\"before\">\n @if (hasRowOverflowMenuLoadingState(row)) {\n <button mat-menu-item disabled>\n <mat-icon>hourglass_empty</mat-icon>\n <praxis-rich-content\n rootClassName=\"praxis-row-overflow-menu__label\"\n [nodes]=\"getTableChromeTextRichContentNodes(getRowOverflowMenuLoadingLabel(), 'praxis-row-overflow-menu__label-text')\"\n ></praxis-rich-content>\n </button>\n }\n @for (a of getOverflowRowActions(row); track trackAction($index, a)) {\n <button mat-menu-item (click)=\"onRowAction(getActionId(a), row, $event, getRowActionRuntimeOptions(a, row))\" [disabled]=\"isActionDisabled(a, row)\">\n <mat-icon [color]=\"a.color || null\" [praxisIcon]=\"a.icon\"></mat-icon>\n <praxis-rich-content\n rootClassName=\"praxis-row-overflow-menu__label\"\n [nodes]=\"getTableChromeTextRichContentNodes(a.label || getActionId(a), 'praxis-row-overflow-menu__label-text')\"\n ></praxis-rich-content>\n </button>\n }\n @if (hasRowOverflowMenuEmptyState(row)) {\n <button mat-menu-item disabled>\n <mat-icon>info</mat-icon>\n <praxis-rich-content\n rootClassName=\"praxis-row-overflow-menu__label\"\n [nodes]=\"getTableChromeTextRichContentNodes(getRowOverflowMenuEmptyLabel(row), 'praxis-row-overflow-menu__label-text')\"\n ></praxis-rich-content>\n </button>\n }\n </mat-menu>\n </div>\n </td>\n }\n </tr>\n </tbody>\n </table>\n </cdk-virtual-scroll-viewport>\n }\n\n</div>\n@if (shouldShowLoadingSurface()) {\n <div class=\"ptable-loading-state\" role=\"status\" aria-live=\"polite\">\n <div class=\"ptable-loading-state__hero\" aria-hidden=\"true\">\n <span class=\"ptable-loading-state__line ptable-loading-state__line--wide\"></span>\n <span class=\"ptable-loading-state__line ptable-loading-state__line--short\"></span>\n <div class=\"ptable-loading-state__rows\">\n @for (placeholder of [1, 2, 3]; track placeholder) {\n <div class=\"ptable-loading-state__row\">\n <span class=\"ptable-loading-state__cell ptable-loading-state__cell--short\"></span>\n <span class=\"ptable-loading-state__cell\"></span>\n <span class=\"ptable-loading-state__cell ptable-loading-state__cell--wide\"></span>\n </div>\n }\n </div>\n </div>\n <div class=\"ptable-loading-state__message\">\n {{ getLoadingSurfaceMessage() }}\n </div>\n </div>\n}\n@if (shouldShowNoDataState()) {\n <div class=\"ptable-no-data-state\" role=\"status\" aria-live=\"polite\">\n <praxis-empty-state-card\n [icon]=\"getNoDataStateIcon()\"\n [title]=\"getNoDataStateTitle()\"\n [description]=\"getNoDataStateDescription()\"\n [primaryAction]=\"getNoDataStatePrimaryAction()\"\n [secondaryActions]=\"getNoDataStateSecondaryActions()\"\n [inline]=\"true\"\n ></praxis-empty-state-card>\n </div>\n}\n@if (\n shouldRenderDataSurface()\n && !schemaError\n && !dataError\n && shouldRenderFloatingBulkActions()\n && getFloatingBulkActions().length\n && !shouldHideFloatingBulkActions()\n ) {\n <div [class]=\"'praxis-floating-bulk-actions ' + getFloatingBulkPositionClass()\">\n @for (action of getFloatingBulkActions(); track getActionId(action)) {\n <button\n mat-mini-fab\n [color]=\"action.color || 'primary'\"\n [disabled]=\"isFloatingBulkActionDisabled(action)\"\n (click)=\"onToolbarAction({ action: getActionId(action), actionConfig: action })\"\n [attr.aria-label]=\"action.label || getActionId(action)\"\n [matTooltip]=\"action.label || getActionId(action)\"\n matTooltipPosition=\"left\"\n >\n <praxis-rich-content\n rootClassName=\"praxis-floating-bulk-actions__content\"\n [nodes]=\"getFloatingBulkActionRichContentNodes(action)\"\n ></praxis-rich-content>\n </button>\n }\n </div>\n}\n<!-- Barra de a\u00C3\u00A7\u00C3\u00B5es no rodap\u00C3\u00A9 (opcional) -->\n@if (shouldRenderDataSurface() && !schemaError && !dataError && showToolbar && shouldRenderFooterToolbar()) {\n <praxis-table-toolbar\n [config]=\"config\"\n [backgroundColor]=\"getToolbarActionsBackgroundColor()\"\n [style.--pfx-filter-h]=\"getToolbarLayoutHeightHostStyle()\"\n [class.footer-flat]=\"hasBottomPaginator()\"\n class=\"praxis-toolbar-footer\"\n placement=\"footer\"\n [showMain]=\"shouldShowFooterToolbarMain()\"\n [showEndActions]=\"shouldShowFooterToolbarEndActions()\"\n [showActionsGroup]=\"shouldShowToolbarActionsBottom()\"\n [showMobileActions]=\"shouldShowToolbarActionsBottom()\"\n [evaluationContext]=\"getToolbarEvaluationContext()\"\n [columnVisibilityController]=\"toolbarColumnVisibilityController\"\n [exportBusy]=\"exportBusy\"\n (toolbarAction)=\"onToolbarAction($event)\"\n (exportAction)=\"onExportAction($event)\"\n >\n @if (shouldShowFooterToolbarMain() && shouldRenderAdvancedFilter()) {\n <praxis-filter\n advancedFilter\n [resourcePath]=\"getAdvancedFilterResourcePath()\"\n [filterId]=\"tableId\"\n [formId]=\"tableId\"\n [persistenceKey]=\"getAdvancedFilterPersistenceKey()\"\n [fieldMetadata]=\"getAdvancedFilterFieldMetadata()\"\n [enableCustomization]=\"enableCustomization\"\n [value]=\"advancedFilterValue\"\n [alwaysVisibleFields]=\"getAdvancedFilterAlwaysVisibleFields()\"\n [alwaysVisibleFieldMetadataOverrides]=\"getAdvancedFilterAlwaysVisibleFieldMetadataOverrides()\"\n [selectedFieldIds]=\"config.behavior?.filtering?.advancedFilters?.settings?.selectedFieldIds ?? []\"\n [allowSaveTags]=\"config.behavior?.filtering?.advancedFilters?.settings?.allowSaveTags\"\n [changeDebounceMs]=\"config.behavior?.filtering?.advancedFilters?.settings?.changeDebounceMs ?? 300\"\n [i18n]=\"getFilterI18n()\"\n [mode]=\"'filter'\"\n [showFilterSettings]=\"enableCustomization\"\n (change)=\"onAdvancedFilterChange($event)\"\n (requestSearch)=\"onAdvancedFilterSubmit($event)\"\n (clear)=\"onAdvancedFilterClear()\"\n ></praxis-filter>\n }\n @if (shouldShowFooterToolbarMain() && shouldRenderAdvancedFilter()) {\n <ng-content select=\"[advancedFilter]\"></ng-content>\n }\n @if (shouldShowFooterToolbarMain() && shouldRenderAdvancedFilter()) {\n <ng-content select=\"[toolbar]\"></ng-content>\n }\n @if (shouldShowFooterToolbarMain() && shouldRenderAdvancedFilter()) {\n @if (shouldShowAiAssistantEntrypoint()) {\n <button\n end-actions\n mat-icon-button\n color=\"primary\"\n type=\"button\"\n class=\"praxis-table-ai-trigger praxis-table-toolbar-action--ai\"\n [class.praxis-table-ai-trigger--minimized]=\"hasMinimizedAiAssistantSession()\"\n [attr.data-testid]=\"aiAssistantTriggerTestId('footer')\"\n (click)=\"openAiAssistant()\"\n [attr.aria-label]=\"aiAssistantTriggerLabel()\"\n [matBadge]=\"aiAssistantTriggerBadge()\"\n [matBadgeHidden]=\"!hasMinimizedAiAssistantSession()\"\n matBadgeColor=\"accent\"\n matBadgeSize=\"small\"\n matBadgePosition=\"above after\"\n [matTooltip]=\"aiAssistantTriggerTooltip()\"\n matTooltipPosition=\"below\"\n >\n <mat-icon>{{ aiAssistantTriggerIcon() }}</mat-icon>\n </button>\n }\n }\n @if (shouldShowFooterToolbarMain() && shouldRenderAdvancedFilter() && enableCustomization) {\n <button\n end-actions\n mat-icon-button\n color=\"primary\"\n data-role=\"table-settings\"\n class=\"praxis-table-toolbar-action--configuration\"\n data-testid=\"table-settings-trigger\"\n (click)=\"openTableSettings()\"\n [attr.aria-label]=\"getTableSettingsLabel()\"\n [matBadge]=\"schemaOutdated ? '!' : ''\"\n [matBadgeHidden]=\"!schemaOutdated\"\n matBadgeColor=\"warn\"\n matBadgeSize=\"small\"\n matBadgePosition=\"above after\"\n [matTooltip]=\"getTableSettingsTooltip()\"\n matTooltipPosition=\"below\"\n >\n <mat-icon>settings</mat-icon>\n </button>\n }\n </praxis-table-toolbar>\n}\n@if (shouldRenderDataSurface() && !schemaError && !dataError && getPaginationEnabled() && (config.behavior?.pagination?.position === 'bottom' || config.behavior?.pagination?.position === 'both' || !config.behavior?.pagination?.position)) {\n <mat-paginator\n [length]=\"getPaginationLength()\"\n [pageSize]=\"getPaginationPageSize()\"\n [pageSizeOptions]=\"getPaginationPageSizeOptions()\"\n [selectConfig]=\"paginatorSelectConfig\"\n [showFirstLastButtons]=\"getPaginationShowFirstLast()\"\n (page)=\"onPageChange($event)\"\n [class.compact]=\"config.behavior?.pagination?.style === 'compact'\"\n [class.footer-stack]=\"shouldShowToolbarActionsBottom()\"\n >\n </mat-paginator>\n}\n", styles: ["@charset \"UTF-8\";table{width:100%}.praxis-visually-hidden-status{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}.praxis-column-reorder-status{margin:8px 0;padding:10px 12px;border-radius:8px;border:1px solid var(--p-table-border-color);background:var(--p-table-row-hover-bg);color:var(--p-table-header-fg);font-size:12px;line-height:1.4;box-shadow:0 4px 12px #00000014;animation:pfx-column-reorder-status-in var(--p-table-drag-status-enter-duration, .18s) var(--p-table-motion-easing, cubic-bezier(0, 0, .2, 1))}@keyframes pfx-column-reorder-status-in{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}.praxis-actions-cell{height:100%;padding-inline:12px;white-space:nowrap}.pfx-expansion-col-header,.pfx-expansion-col-cell{width:52px;min-width:52px;text-align:center}.pfx-expansion-toggle:focus-visible{outline:2px solid var(--md-sys-color-primary);outline-offset:2px}.pfx-expansion-detail-row{background:var(--md-sys-color-surface-container-low)}.pfx-expansion-detail-cell{padding:0!important;border-bottom:1px solid var(--p-table-border-color)}.pfx-expansion-detail-panel{padding:12px 16px;border-left:3px solid var(--md-sys-color-primary)}.pfx-expansion-detail-panel.pfx-expansion-motion-none{animation:none;transition:none}.pfx-expansion-detail-panel.pfx-expansion-motion-subtle-slide{animation:pfx-expansion-subtle-slide-in var(--pfx-expansion-motion-duration, .16s) var(--pfx-expansion-motion-easing, cubic-bezier(.2, 0, 0, 1))}.pfx-expansion-detail-panel.pfx-expansion-motion-accordion{animation:pfx-expansion-accordion-in var(--pfx-expansion-motion-duration, .18s) var(--pfx-expansion-motion-easing, cubic-bezier(.2, 0, 0, 1));transform-origin:top center}.pfx-expansion-detail-panel.pfx-expansion-motion-fade-scale{animation:pfx-expansion-fade-scale-in var(--pfx-expansion-motion-duration, .16s) var(--pfx-expansion-motion-easing, cubic-bezier(.2, 0, 0, 1));transform-origin:top center}@keyframes pfx-expansion-subtle-slide-in{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}@keyframes pfx-expansion-accordion-in{0%{opacity:0;transform:scaleY(.96)}to{opacity:1;transform:scaleY(1)}}@keyframes pfx-expansion-fade-scale-in{0%{opacity:0;transform:translateY(-2px) scale(.985)}to{opacity:1;transform:translateY(0) scale(1)}}.pfx-expansion-detail-schema{margin:0;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:12px;line-height:1.4;white-space:pre-wrap;word-break:break-word;color:var(--md-sys-color-on-surface-variant)}.pfx-expansion-detail-message{font-size:13px;color:var(--md-sys-color-on-surface-variant)}.pfx-expansion-detail-message--error{color:var(--md-sys-color-error)}.pfx-expansion-detail-stack{display:grid;gap:10px}.pfx-expansion-detail-tabs{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:10px}.pfx-expansion-detail-tab-btn{border:1px solid var(--p-table-border-color);background:var(--md-sys-color-surface);color:var(--md-sys-color-on-surface);border-radius:999px;padding:6px 12px;font-size:12px;line-height:1.2;cursor:pointer}.pfx-expansion-detail-tab-btn__content{display:inline-flex;align-items:center;gap:6px;min-width:0}.pfx-expansion-detail-tab-btn__icon .prx-rich-icon{font-size:16px;line-height:1}.pfx-expansion-detail-tab-btn__title{white-space:nowrap}.pfx-expansion-detail-tab-btn__badge .prx-rich-badge{padding:0 8px;min-height:18px;background:color-mix(in srgb,currentColor 12%,transparent);color:inherit}.pfx-expansion-detail-tab-btn.is-active{border-color:var(--md-sys-color-primary);color:var(--md-sys-color-primary);font-weight:600}.pfx-expansion-detail-tab-btn:focus-visible{outline:2px solid var(--md-sys-color-primary);outline-offset:2px}.pfx-expansion-detail-tab-panel{display:grid;gap:10px}.pfx-expansion-node{border:1px solid var(--p-table-border-color);border-radius:8px;padding:10px 12px;background:var(--md-sys-color-surface)}.pfx-expansion-node-card__header{margin-bottom:8px}.pfx-expansion-node-card__title{margin:0;font-size:14px;line-height:1.3}.pfx-expansion-node-card__subtitle{margin:4px 0 0;font-size:12px;color:var(--md-sys-color-on-surface-variant)}.pfx-expansion-node-card__content{display:grid;gap:10px}.pfx-expansion-node-value{display:flex;align-items:baseline;gap:8px}.pfx-expansion-node-value__label{color:var(--md-sys-color-on-surface-variant);font-size:12px}.pfx-expansion-node-value__content{font-size:14px}.pfx-expansion-node-list__title{margin:0 0 6px;font-size:13px}.pfx-expansion-node-list ul{margin:0;padding-left:18px}.pfx-expansion-node-rich-list__title{margin:0 0 8px;font-size:13px}.pfx-expansion-node-rich-list__items{display:grid;gap:12px}.pfx-expansion-node-rich-list__item{display:grid;gap:10px;padding:12px;border:1px solid var(--md-sys-color-outline-variant, #d7dbe5);border-radius:14px;background:var(--md-sys-color-surface-container-lowest, #fff)}.pfx-expansion-node-rich-list__item--row{grid-template-columns:minmax(0,1fr) auto;align-items:center}.pfx-expansion-node-rich-list__item--stack{grid-template-columns:minmax(0,1fr)}.pfx-expansion-node-rich-list__item--card-list{grid-template-columns:minmax(0,1fr);box-shadow:0 4px 14px #0f172a0a}.pfx-expansion-node-rich-list__item-host{min-width:0}.pfx-expansion-node-rich-list__item-actions{display:flex;flex-wrap:wrap;gap:8px;align-items:center}.pfx-expansion-node-rich-list__item-action-btn{min-width:0}.pfx-expansion-node-rich-list__item-action-host{display:inline-flex;align-items:center}.pfx-expansion-node-action-bar__title{margin:0 0 12px}.pfx-expansion-node-action-bar__actions{display:flex;flex-wrap:wrap;gap:8px;align-items:center}.pfx-expansion-node-action-bar__action-btn{min-width:0}.pfx-expansion-node-action-bar__action-host{display:inline-flex;align-items:center}.pfx-expansion-node-card-grid__header{margin:0 0 12px}.pfx-expansion-node-card-grid__cards{display:grid;gap:12px;grid-template-columns:var(--pfx-expansion-card-grid-columns, repeat(auto-fit, minmax(var(--pfx-expansion-card-grid-min-width, 220px), 1fr)))}.pfx-expansion-node-card-grid__card-host{min-width:0}.pfx-expansion-node-card-grid__card-host [data-rich-node-type=card]{height:100%}.pfx-expansion-node-richtext :where(p,ul,ol,h1,h2,h3,h4,h5,h6){margin-top:0;margin-bottom:8px}.pfx-expansion-node-placeholder{font-size:12px;color:var(--md-sys-color-on-surface-variant)}:host.density-compact{--p-table-header-height-default: 32px;--p-table-row-height-default: 30px;--p-header-padding-default: 4px 8px;--p-cell-padding-default: 3px 8px;--p-header-font-size-default: 11.5px;--p-cell-font-size-default: 12px;--p-actions-btn-size-default: 28px;--p-actions-icon-size-default: 15px;--p-actions-more-btn-size-default: 28px;--p-actions-more-icon-size-default: 15px;--p-table-paginator-container-min-height-default: 32px;--p-table-paginator-container-padding-default: 2px 8px;--p-table-paginator-container-gap-default: 6px;--p-table-paginator-select-width-default: 64px;--p-table-paginator-select-height-default: 28px;--p-table-paginator-select-padding-inline-default: 8px 6px;--p-table-paginator-action-size-default: 28px}:host.density-comfortable{--p-table-header-height-default: 40px;--p-table-row-height-default: 44px;--p-header-padding-default: 10px 14px;--p-cell-padding-default: 10px 14px;--p-header-font-size-default: inherit;--p-cell-font-size-default: inherit;--p-actions-btn-size-default: 36px;--p-actions-icon-size-default: 18px;--p-actions-more-btn-size-default: 36px;--p-actions-more-icon-size-default: 18px;--p-table-paginator-container-min-height-default: 44px;--p-table-paginator-container-padding-default: 6px 10px;--p-table-paginator-container-gap-default: 10px;--p-table-paginator-select-width-default: 78px;--p-table-paginator-select-height-default: 36px;--p-table-paginator-select-padding-inline-default: 12px 10px;--p-table-paginator-action-size-default: 36px}:host.density-spacious{--p-table-header-height-default: 52px;--p-table-row-height-default: 56px;--p-header-padding-default: 16px 20px;--p-cell-padding-default: 16px 20px;--p-header-font-size-default: inherit;--p-cell-font-size-default: inherit;--p-actions-btn-size-default: 44px;--p-actions-icon-size-default: 24px;--p-actions-more-btn-size-default: 44px;--p-actions-more-icon-size-default: 24px;--p-table-paginator-container-min-height-default: 52px;--p-table-paginator-container-padding-default: 8px 14px;--p-table-paginator-container-gap-default: 12px;--p-table-paginator-select-width-default: 86px;--p-table-paginator-select-height-default: 40px;--p-table-paginator-select-padding-inline-default: 14px 12px;--p-table-paginator-action-size-default: 40px}@media(pointer:coarse){:host.density-compact{--p-table-row-height-default: 44px;--p-table-header-height-default: 44px;--p-table-paginator-container-min-height-default: 44px;--p-table-paginator-action-size-default: 40px}}:host.density-compact .praxis-actions-cell{padding-inline:8px}:host.density-spacious .praxis-actions-cell{padding-inline:16px}.praxis-actions-cell__content{display:flex;align-items:center;justify-content:flex-end;gap:6px;width:100%;transition:opacity .12s ease}.praxis-actions-cell.dense .praxis-actions-cell__content{gap:6px}.praxis-actions-cell__content--discovering{opacity:.78}.praxis-row-action-anchor{display:inline-flex;align-items:center}.praxis-row-action-anchor--workflow{position:relative}.praxis-row-action-anchor--workflow:after{content:\"\";position:absolute;right:4px;top:4px;width:6px;height:6px;border-radius:999px;background:var(--md-sys-color-secondary);opacity:.9;pointer-events:none}.praxis-row-action-anchor--blocked:after{background:var(--md-sys-color-error)}.praxis-icon-btn{width:var(--p-actions-btn-size, var(--p-actions-btn-size-default, 40px));height:var(--p-actions-btn-size, var(--p-actions-btn-size-default, 40px));border:0;background:transparent;padding:0;display:inline-flex;align-items:center;justify-content:center;border-radius:9999px;cursor:pointer;--mat-icon-button-state-layer-size: var(--p-actions-btn-size, var(--p-actions-btn-size-default, 40px))}.praxis-icon-btn:hover{background:var(--md-sys-color-surface-variant)}.praxis-icon-btn:focus-visible{outline:2px solid var(--md-sys-color-primary);outline-offset:2px}.praxis-icon-btn mat-icon,.praxis-icon-btn .mat-icon{font-size:var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px));width:var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px));height:var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px));line-height:var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px))}.praxis-icon-btn praxis-rich-content{display:inline-flex;align-items:center;justify-content:center;width:var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px));height:var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px));line-height:var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px))}:host ::ng-deep .praxis-icon-btn .praxis-row-action__content,:host ::ng-deep .praxis-icon-btn .praxis-row-action__icon{display:inline-flex;align-items:center;justify-content:center;width:var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px));height:var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px));line-height:var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px))}:host ::ng-deep .praxis-icon-btn .praxis-row-action__icon .prx-rich-icon{font-size:var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px));width:var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px));height:var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px));line-height:var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px))}.praxis-icon-btn--workflow{background:color-mix(in srgb,var(--md-sys-color-secondary-container) 36%,transparent)}.praxis-icon-btn--blocked{background:color-mix(in srgb,var(--md-sys-color-error-container) 42%,transparent)}.praxis-more-btn{width:var(--p-actions-more-btn-size, var(--p-actions-more-btn-size-default, var(--p-actions-btn-size, var(--p-actions-btn-size-default, 40px))));height:var(--p-actions-more-btn-size, var(--p-actions-more-btn-size-default, var(--p-actions-btn-size, var(--p-actions-btn-size-default, 40px))));--mat-icon-button-state-layer-size: var(--p-actions-more-btn-size, var(--p-actions-more-btn-size-default, var(--p-actions-btn-size, var(--p-actions-btn-size-default, 40px))));background-image:var(--p-actions-more-btn-gradient, none);background-size:100% 100%;background-repeat:no-repeat}.praxis-more-btn mat-icon,.praxis-more-btn .mat-icon{font-size:var(--p-actions-more-icon-size, var(--p-actions-more-icon-size-default, var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px))));width:var(--p-actions-more-icon-size, var(--p-actions-more-icon-size-default, var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px))));height:var(--p-actions-more-icon-size, var(--p-actions-more-icon-size-default, var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px))));line-height:var(--p-actions-more-icon-size, var(--p-actions-more-icon-size-default, var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px))));color:var(--p-actions-more-icon-color);background-image:var(--p-actions-more-icon-gradient, none);-webkit-background-clip:text;background-clip:text}.praxis-row-btn--workflow{box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--md-sys-color-secondary) 28%,transparent)}.praxis-row-btn--blocked{box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--md-sys-color-error) 28%,transparent)}.praxis-icon-btn.destructive mat-icon{color:var(--md-sys-color-error)}.mat-mdc-tooltip.praxis-tooltip{margin-top:-8px;margin-bottom:8px}.spacer{flex:1 1 auto}.praxis-table-header{display:flex;flex-wrap:wrap;align-items:flex-start;gap:6px;margin:10px 0 8px;width:100%;clear:both;position:relative}.praxis-table-header.stacked{margin:0}.praxis-table-header>praxis-table-toolbar{flex:1 0 100%}.praxis-floating-bulk-actions{position:fixed;z-index:var(--praxis-layer-floating-local, 200);display:inline-flex;align-items:center;gap:8px;padding:8px;border-radius:999px;background:var(--md-sys-color-surface-container-highest);box-shadow:0 8px 20px #00000029}.praxis-floating-bulk-actions.pos-bottom-right{right:20px;bottom:20px}.praxis-floating-bulk-actions.pos-bottom-left{left:20px;bottom:20px}.praxis-floating-bulk-actions.pos-top-right{right:20px;top:20px}.praxis-floating-bulk-actions.pos-top-left{left:20px;top:20px}@media(max-width:768px){.praxis-floating-bulk-actions{gap:6px;padding:6px}.praxis-floating-bulk-actions.pos-bottom-right{right:12px;left:auto;bottom:12px}.praxis-floating-bulk-actions.pos-bottom-left{left:12px;right:auto;bottom:12px}.praxis-floating-bulk-actions.pos-top-right{right:12px;left:auto;top:12px}.praxis-floating-bulk-actions.pos-top-left{left:12px;right:auto;top:12px}}:host{display:block;width:100%;min-width:0;max-width:100%;--pfx-toolbar-pad-y: 6px;--pfx-toolbar-pad-x: 12px;--p-table-bg: var(--md-sys-color-surface-container-highest);--p-table-text-color: var(--md-sys-color-on-surface);--p-table-header-bg: var(--md-sys-color-surface-container-highest);--p-table-header-fg: var(--md-sys-color-on-surface);--p-table-border-color: var(--md-sys-color-outline-variant);--p-table-row-even-bg: var(--md-sys-color-surface-container);--p-table-row-hover-bg: var(--md-sys-color-surface-container-high);--p-table-row-selected-bg: var(--md-sys-color-primary-container);--p-table-row-selected-fg: var(--md-sys-color-on-primary-container);--p-table-row-selected-font-weight: 600;--p-table-row-selected-indicator: linear-gradient( 180deg, var(--md-sys-color-primary), var(--md-sys-color-secondary) );--p-table-badge-soft-primary-bg: var(--md-sys-color-primary-container);--p-table-badge-soft-primary-fg: var(--md-sys-color-on-primary-container);--p-table-badge-soft-accent-bg: var(--md-sys-color-secondary-container);--p-table-badge-soft-accent-fg: var(--md-sys-color-on-secondary-container);--p-table-badge-soft-warn-bg: var(--md-sys-color-error-container);--p-table-badge-soft-warn-fg: var(--md-sys-color-on-error-container);--p-table-state-success-bg: var(--md-sys-color-tertiary-container);--p-table-state-success-fg: var(--md-sys-color-on-tertiary-container);--p-table-state-warning-bg: var(--md-sys-color-secondary-container);--p-table-state-warning-fg: var(--md-sys-color-on-secondary-container);--p-table-state-danger-bg: var(--md-sys-color-error-container);--p-table-state-danger-fg: var(--md-sys-color-on-error-container);--p-table-state-highlight-bg: var(--md-sys-color-primary-container);--p-table-state-highlight-fg: var(--md-sys-color-on-primary-container);--p-table-reorder-transition-duration: .16s;--p-table-drag-preview-scale: 1.01;--p-table-drag-status-enter-duration: .18s;--p-table-drag-preview-shadow: 0 14px 32px rgba(0, 0, 0, .28), 0 0 0 1px var(--p-table-border-color);--p-table-column-resize-hit-area: 10px;--p-table-column-resize-line-width: 1px;--p-table-column-resize-separator-color: color-mix( in srgb, var(--p-table-border-color) 78%, transparent );--p-table-column-resize-separator-hover-color: var(--md-sys-color-primary);--p-table-column-resize-active-color: var(--md-sys-color-primary)}:host ::ng-deep .mat-mdc-table{background:var(--p-table-bg);color:var(--p-table-text-color);border-radius:12px 12px 0 0;width:100%;box-shadow:var(--p-table-surface-shadow);transition:box-shadow var(--p-table-selection-transition-duration, .18s) var(--p-table-motion-easing, cubic-bezier(0, 0, .2, 1))}:host ::ng-deep .mat-mdc-table:hover{box-shadow:var(--p-table-surface-shadow-hover, var(--p-table-surface-shadow))}:host ::ng-deep .mat-mdc-table.pfx-column-resize-enabled{table-layout:fixed}:host ::ng-deep .mat-mdc-table.table-stack-top{border-top-left-radius:0;border-top-right-radius:0}:host ::ng-deep .praxis-toolbar-footer{border:0 solid var(--p-table-border-color);border-top:0;border-radius:0;background:var(--p-table-bg)}:host ::ng-deep .mat-mdc-paginator.footer-stack{border-top-left-radius:0;border-top-right-radius:0;border-top:0}:host ::ng-deep .mat-mdc-paginator.footer-stack .mat-mdc-paginator-container{padding:var(--p-table-paginator-footer-stack-padding, 6px 10px)}:host ::ng-deep .mat-mdc-paginator{--p-table-paginator-bg-default: color-mix( in srgb, var(--p-table-bg) 94%, var(--md-sys-color-surface, white) 6% );--p-table-paginator-border-color-default: color-mix(in srgb, var(--p-table-border-color) 82%, transparent);--p-table-paginator-select-bg-default: color-mix(in srgb, var(--p-table-bg) 88%, var(--p-table-text-color) 12%);--p-table-paginator-select-border-color-default: color-mix( in srgb, var(--p-table-border-color) 74%, transparent );--p-table-paginator-select-border-color-hover-default: color-mix( in srgb, var(--md-sys-color-primary) 36%, var(--p-table-border-color) );--p-table-paginator-select-border-color-focus-default: color-mix( in srgb, var(--md-sys-color-primary) 72%, var(--p-table-border-color) );--p-table-paginator-select-focus-ring-default: color-mix(in srgb, var(--md-sys-color-primary) 18%, transparent);--p-table-paginator-select-radius-default: 999px;--p-table-paginator-select-shadow-default: inset 0 1px 0 color-mix(in srgb, var(--md-sys-color-on-surface) 8%, transparent);--p-table-paginator-select-text-color-default: var(--p-table-text-color);--p-table-paginator-select-icon-color-default: color-mix(in srgb, var(--p-table-text-color) 72%, transparent);--p-table-paginator-range-text-color-default: color-mix(in srgb, var(--p-table-text-color) 78%, transparent);border-top:1px solid var(--p-table-paginator-border-color, var(--p-table-paginator-border-color-default));background:var(--p-table-paginator-bg, var(--p-table-paginator-bg-default))}:host ::ng-deep .mat-mdc-paginator .mat-mdc-paginator-container{min-height:var(--p-table-paginator-container-min-height, var(--p-table-paginator-container-min-height-default, 44px));padding:var(--p-table-paginator-container-padding, var(--p-table-paginator-container-padding-default, 6px 10px));gap:var(--p-table-paginator-container-gap, var(--p-table-paginator-container-gap-default, 10px))}:host ::ng-deep .mat-mdc-paginator.compact{--p-table-paginator-container-min-height-default: 30px;--p-table-paginator-container-padding-default: 2px 8px;--p-table-paginator-container-gap-default: 6px;--p-table-paginator-select-width-default: 62px;--p-table-paginator-select-height-default: 28px;--p-table-paginator-select-padding-inline-default: 8px 6px;--p-table-paginator-action-size-default: 28px}:host ::ng-deep .mat-mdc-paginator .mat-mdc-icon-button{width:var(--p-table-paginator-action-size, var(--p-table-paginator-action-size-default, 36px));height:var(--p-table-paginator-action-size, var(--p-table-paginator-action-size-default, 36px));display:inline-grid;place-items:center;padding:0;line-height:0;--mdc-icon-button-state-layer-size: var(--p-table-paginator-action-size, var(--p-table-paginator-action-size-default, 36px));--mat-icon-button-state-layer-size: var(--p-table-paginator-action-size, var(--p-table-paginator-action-size-default, 36px))}:host ::ng-deep .mat-mdc-paginator .mat-mdc-paginator-icon{display:block;flex:0 0 auto;margin:0}.praxis-table-ai-trigger{transition:background-color .16s ease,box-shadow .16s ease,color .16s ease}.praxis-table-ai-trigger--minimized{background:color-mix(in srgb,var(--md-sys-color-primary-container, rgba(59, 130, 246, .22)) 72%,transparent);color:var(--md-sys-color-on-primary-container, var(--md-sys-color-primary, #2563eb));box-shadow:0 0 0 1px color-mix(in srgb,var(--md-sys-color-primary, #2563eb) 34%,transparent),0 8px 20px color-mix(in srgb,var(--md-sys-color-primary, #2563eb) 16%,transparent)}.praxis-table-ai-trigger--minimized:hover,.praxis-table-ai-trigger--minimized:focus-visible{background:color-mix(in srgb,var(--md-sys-color-primary-container, rgba(59, 130, 246, .22)) 86%,transparent)}:host ::ng-deep .mat-mdc-paginator .mat-mdc-paginator-page-size-select{margin-left:4px;width:var(--p-table-paginator-select-width, var(--p-table-paginator-select-width-default, 78px))}:host ::ng-deep .mat-mdc-paginator .mat-mdc-paginator-page-size-select .mat-mdc-text-field-wrapper{--mdc-outlined-text-field-container-color: var( --p-table-paginator-select-bg, var(--p-table-paginator-select-bg-default) );--mdc-outlined-text-field-input-text-color: var( --p-table-paginator-select-text-color, var(--p-table-paginator-select-text-color-default) );min-height:var(--p-table-paginator-select-height, var(--p-table-paginator-select-height-default, 36px));height:var(--p-table-paginator-select-height, var(--p-table-paginator-select-height-default, 36px));padding-inline:var(--p-table-paginator-select-padding-inline, var(--p-table-paginator-select-padding-inline-default, 12px 10px));border:1px solid var(--p-table-paginator-select-border-color, var(--p-table-paginator-select-border-color-default));border-radius:var(--p-table-paginator-select-radius, var(--p-table-paginator-select-radius-default));background:var(--p-table-paginator-select-bg, var(--p-table-paginator-select-bg-default))!important;background-color:var(--p-table-paginator-select-bg, var(--p-table-paginator-select-bg-default))!important;color:var(--p-table-paginator-select-text-color, var(--p-table-paginator-select-text-color-default))!important;box-shadow:var(--p-table-paginator-select-shadow, var(--p-table-paginator-select-shadow-default))}:host ::ng-deep .mat-mdc-paginator .mat-mdc-paginator-page-size-select .mat-mdc-text-field-wrapper:hover{border-color:var(--p-table-paginator-select-border-color-hover, var(--p-table-paginator-select-border-color-hover-default))}:host ::ng-deep .mat-mdc-paginator .mat-mdc-paginator-page-size-select.mat-focused .mat-mdc-text-field-wrapper{border-color:var(--p-table-paginator-select-border-color-focus, var(--p-table-paginator-select-border-color-focus-default));box-shadow:0 0 0 3px var(--p-table-paginator-select-focus-ring, var(--p-table-paginator-select-focus-ring-default)),var(--p-table-paginator-select-shadow, var(--p-table-paginator-select-shadow-default))}:host ::ng-deep .mat-mdc-paginator .mat-mdc-paginator-page-size-select .mat-mdc-form-field-flex{min-height:var(--p-table-paginator-select-height, var(--p-table-paginator-select-height-default, 36px));align-items:center}:host ::ng-deep .mat-mdc-paginator .mat-mdc-paginator-page-size-select .mat-mdc-form-field-infix{display:flex;align-items:center;min-height:var(--p-table-paginator-select-height, var(--p-table-paginator-select-height-default, 36px));padding-block:0;width:auto}:host ::ng-deep .mat-mdc-paginator .mat-mdc-paginator-page-size-select .mat-mdc-select-trigger{min-height:var(--p-table-paginator-select-height, var(--p-table-paginator-select-height-default, 36px));padding-right:2px;color:var(--p-table-paginator-select-text-color, var(--p-table-paginator-select-text-color-default))}:host ::ng-deep .mat-mdc-paginator .mat-mdc-paginator-page-size-select .mat-mdc-select-arrow{color:var(--p-table-paginator-select-icon-color, var(--p-table-paginator-select-icon-color-default))}:host ::ng-deep .mat-mdc-paginator .mat-mdc-paginator-page-size-select .mdc-notched-outline__leading,:host ::ng-deep .mat-mdc-paginator .mat-mdc-paginator-page-size-select .mdc-notched-outline__notch,:host ::ng-deep .mat-mdc-paginator .mat-mdc-paginator-page-size-select .mdc-notched-outline__trailing{border-color:transparent!important;border-width:0!important}:host ::ng-deep .mat-mdc-paginator .mat-mdc-paginator-page-size-select .mat-mdc-form-field-subscript-wrapper{display:none}:host ::ng-deep .mat-mdc-paginator .mat-mdc-paginator-range-label{font-size:12px;font-weight:600;color:var(--p-table-paginator-range-text-color, var(--p-table-paginator-range-text-color-default))}:host ::ng-deep .mat-mdc-paginator .mat-mdc-select-value-text{font-size:12px;font-weight:700;color:var(--p-table-paginator-select-text-color, var(--p-table-paginator-select-text-color-default))}::ng-deep .praxis-table-paginator-select-panel.mat-mdc-select-panel{--mat-select-panel-background-color: var(--md-sys-color-surface-container, #fff);background:var(--md-sys-color-surface-container, #fff)!important;background-color:var(--md-sys-color-surface-container, #fff)!important;border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant, #d7dbe5) 70%,transparent);box-shadow:0 12px 28px color-mix(in srgb,var(--md-sys-color-shadow, #000) 28%,transparent)}::ng-deep .praxis-table-paginator-select-panel .mat-mdc-option{--mat-option-label-text-color: var(--md-sys-color-on-surface, #111827);color:var(--md-sys-color-on-surface, #111827)!important}::ng-deep .praxis-table-paginator-select-panel .mat-mdc-option:hover:not(.mdc-list-item--disabled),::ng-deep .praxis-table-paginator-select-panel .mat-mdc-option.mat-mdc-option-active{--mat-option-hover-state-layer-color: color-mix( in srgb, var(--md-sys-color-primary, #2f7cff) 14%, transparent );background:color-mix(in srgb,var(--md-sys-color-primary, #2f7cff) 14%,transparent)!important;color:var(--md-sys-color-on-surface, #111827)!important}:host [data-role=table-settings].mat-mdc-icon-button{--mdc-icon-button-icon-color: var(--md-sys-color-primary);color:var(--md-sys-color-primary)}.pfx-link{color:var(--md-sys-color-primary);text-decoration:underline;cursor:pointer}.pfx-chip{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;border-radius:10px;font-size:12px;line-height:1;border:1px solid transparent;white-space:nowrap;--prx-rich-content-inline-gap: 6px}.pfx-chip-icon{font-size:14px;width:14px;height:14px}.pfx-chip--plain{background:transparent;border-color:transparent;color:var(--md-sys-color-on-surface)}.pfx-chip--outlined{background:transparent;border-color:var(--md-sys-color-outline-variant);color:var(--md-sys-color-on-surface)}.pfx-chip--filled-primary{background:var(--md-sys-color-primary);color:var(--md-sys-color-on-primary)}.pfx-chip--filled-accent{background:var(--md-sys-color-secondary);color:var(--md-sys-color-on-secondary)}.pfx-chip--filled-warn,.pfx-chip--filled-danger{background:var(--md-sys-color-error);color:var(--md-sys-color-on-error)}.pfx-chip--filled-success{background:var(--p-table-state-success-bg);color:var(--p-table-state-success-fg)}.pfx-chip--filled-info{background:var(--md-sys-color-tertiary);color:var(--md-sys-color-on-tertiary)}.pfx-chip--filled-basic{background:var(--md-sys-color-surface-container-highest);color:var(--md-sys-color-on-surface);border-color:var(--md-sys-color-outline-variant)}.pfx-chip--soft-primary{background:var(--p-table-badge-soft-primary-bg);color:var(--p-table-badge-soft-primary-fg)}.pfx-chip--soft-accent{background:var(--p-table-badge-soft-accent-bg);color:var(--p-table-badge-soft-accent-fg)}.pfx-chip--soft-warn{background:var(--p-table-badge-soft-warn-bg);color:var(--p-table-badge-soft-warn-fg)}.pfx-chip--soft-danger{background:color-mix(in srgb,var(--p-table-state-danger-bg) 72%,transparent);color:var(--p-table-state-danger-fg);border-color:color-mix(in srgb,var(--p-table-state-danger-fg) 18%,transparent)}.pfx-chip--soft-success{background:color-mix(in srgb,var(--p-table-state-success-bg) 72%,transparent);color:var(--p-table-state-success-fg);border-color:color-mix(in srgb,var(--p-table-state-success-fg) 18%,transparent)}.pfx-chip--soft-info{background:color-mix(in srgb,var(--md-sys-color-tertiary-container) 72%,transparent);color:var(--md-sys-color-on-tertiary-container);border-color:color-mix(in srgb,var(--md-sys-color-tertiary) 18%,transparent)}.pfx-chip--soft-basic{background:color-mix(in srgb,var(--md-sys-color-surface-container-highest) 82%,transparent);color:color-mix(in srgb,var(--md-sys-color-on-surface) 76%,transparent);border-color:color-mix(in srgb,var(--md-sys-color-outline-variant) 65%,transparent)}.pfx-progress{position:relative;width:100%;min-width:0;max-width:140px;display:inline-block;vertical-align:middle}.pfx-progress .pfx-progress__content{width:100%;min-width:0}.pfx-progress .prx-rich-progress{width:100%}.pfx-progress-bar{height:100%;background:var(--md-sys-color-primary);transition:width .2s ease}.pfx-progress-label{margin-left:8px;font-size:12px;opacity:.8;display:inline-block;vertical-align:middle}.pfx-micro-viz-cell{display:inline-block;width:min(100%,180px);min-width:112px;max-width:220px;vertical-align:middle}.pfx-micro-viz-cell .pfx-micro-viz{display:grid;gap:4px;width:100%;min-width:0;color:var(--md-sys-color-on-surface);font-size:12px;line-height:1.2}.pfx-micro-viz-cell .pfx-micro-viz__row{display:grid;grid-template-columns:minmax(42px,.8fr) minmax(52px,1fr) auto;align-items:center;gap:6px;min-width:0}.pfx-micro-viz-cell .pfx-micro-viz__label,.pfx-micro-viz-cell .pfx-micro-viz__value{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pfx-micro-viz-cell .pfx-micro-viz__track{position:relative;display:block;height:8px;min-width:0;border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-outline-variant) 62%,transparent);overflow:hidden}.pfx-micro-viz-cell .pfx-micro-viz__bar,.pfx-micro-viz-cell .pfx-micro-viz__segment{display:block;height:100%;border-radius:inherit;background:var(--md-sys-color-primary)}.pfx-micro-viz-cell .pfx-micro-viz__row[data-tone=success] .pfx-micro-viz__bar,.pfx-micro-viz-cell .pfx-micro-viz__segment[data-tone=success],.pfx-micro-viz-cell .pfx-micro-viz[data-tone=success] .pfx-micro-viz__bar{background:var(--p-table-state-success-fg, #168a4a)}.pfx-micro-viz-cell .pfx-micro-viz__row[data-tone=warning] .pfx-micro-viz__bar,.pfx-micro-viz-cell .pfx-micro-viz__segment[data-tone=warning],.pfx-micro-viz-cell .pfx-micro-viz[data-tone=warning] .pfx-micro-viz__bar{background:var(--p-table-state-warning-fg, #b45f06)}.pfx-micro-viz-cell .pfx-micro-viz__row[data-tone=danger] .pfx-micro-viz__bar,.pfx-micro-viz-cell .pfx-micro-viz__segment[data-tone=danger],.pfx-micro-viz-cell .pfx-micro-viz[data-tone=danger] .pfx-micro-viz__bar{background:var(--p-table-state-danger-fg, #b3261e)}.pfx-micro-viz-cell .pfx-micro-viz__segments{display:flex;width:100%;height:8px;overflow:hidden;border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-outline-variant) 62%,transparent)}.pfx-micro-viz-cell .pfx-micro-viz__meta{display:flex;justify-content:space-between;gap:8px;min-width:0;color:color-mix(in srgb,var(--md-sys-color-on-surface) 72%,transparent)}.pfx-micro-viz-cell .pfx-micro-viz__bullet .pfx-micro-viz__target{position:absolute;top:-2px;bottom:-2px;width:2px;border-radius:999px;background:var(--md-sys-color-on-surface)}.pfx-micro-viz-cell .pfx-micro-viz__delta[data-tone=success]{color:var(--p-table-state-success-fg, #168a4a)}.pfx-micro-viz-cell .pfx-micro-viz__delta[data-tone=warning]{color:var(--p-table-state-warning-fg, #b45f06)}.pfx-micro-viz-cell .pfx-micro-viz__delta[data-tone=danger]{color:var(--p-table-state-danger-fg, #b3261e)}.pfx-micro-viz-cell .pfx-micro-viz__fallback{display:inline-block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pfx-micro-viz-cell .pfx-micro-viz.pfx-micro-viz__radial,.pfx-micro-viz-cell .pfx-micro-viz.pfx-micro-viz__harvey,.pfx-micro-viz-cell .pfx-micro-viz.pfx-micro-viz__process{display:inline-flex}.pfx-micro-viz__radial{align-items:center;justify-content:center;position:relative}.pfx-micro-radial-svg{width:24px;height:24px;overflow:visible;flex-shrink:0;display:block}.pfx-micro-radial-svg__track{fill:none;stroke:var(--pfx-micro-track-color, var(--md-sys-color-surface-container-high, #e5e7eb));stroke-width:3}.pfx-micro-radial-svg__bar{fill:none;stroke:currentColor;stroke-width:3;stroke-linecap:round;transform:rotate(-90deg);transform-origin:50% 50%;transition:stroke-dasharray .35s ease}.pfx-micro-radial-svg__text{font-size:8px;font-weight:700;text-anchor:middle;fill:currentColor;font-family:var(--md-sys-typescale-body-medium-font-family, sans-serif)}.pfx-micro-viz__harvey{align-items:center;gap:0}.pfx-micro-harvey-svg{width:18px;height:18px;overflow:visible;flex-shrink:0}.pfx-micro-harvey-svg__track{fill:none;stroke:var(--pfx-micro-track-color, var(--md-sys-color-surface-container-high, #e5e7eb));stroke-width:2}.pfx-micro-harvey-svg__bar{fill:none;stroke:currentColor;stroke-width:16;transform:rotate(-90deg);transform-origin:50% 50%;transition:stroke-dasharray .35s ease}.pfx-micro-harvey-fraction{display:inline-flex;align-items:center;font-size:11px;font-variant-numeric:tabular-nums;margin-left:6px;font-family:var(--md-sys-typescale-body-medium-font-family, sans-serif)}.pfx-micro-harvey-fraction strong{color:currentColor;font-weight:700}.pfx-separator{opacity:.6;color:var(--md-sys-color-on-surface-variant, #4b5563);margin-inline:2px}.pfx-total{color:var(--md-sys-color-on-surface-variant, #4b5563)}.pfx-micro-viz__bullet{display:flex;flex-direction:column;gap:4px;width:100%}.pfx-micro-bullet__top{display:flex;justify-content:space-between;align-items:baseline;font-size:11px}.pfx-micro-bullet__label{color:var(--md-sys-color-on-surface-variant, #4b5563);font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pfx-micro-bullet__value{font-weight:700;color:currentColor;font-variant-numeric:tabular-nums;flex-shrink:0}.pfx-micro-bullet__target-val{font-weight:400;font-size:10px;color:var(--md-sys-color-on-surface-variant, #4b5563);margin-left:4px}.pfx-micro-bullet__track{position:relative;display:block;overflow:hidden;border-radius:var(--pfx-micro-track-radius, 999px);background:var(--pfx-micro-track-color, var(--md-sys-color-surface-container-high, #e5e7eb));block-size:10px;width:100%}.pfx-micro-bullet__range{position:absolute;inset-block:0;display:block;block-size:100%;opacity:.32}.pfx-micro-bullet__range[data-tone=success]{background:var(--p-table-state-success-fg, #168a4a)}.pfx-micro-bullet__range[data-tone=warning]{background:var(--p-table-state-warning-fg, #b45f06)}.pfx-micro-bullet__range[data-tone=danger],.pfx-micro-bullet__range[data-tone=critical]{background:var(--p-table-state-danger-fg, #b3261e)}.pfx-micro-bullet__range[data-tone=info]{background:var(--md-sys-color-primary, #2563eb)}.pfx-micro-bullet__actual{position:absolute;inset-block-start:3px;inset-inline-start:0;block-size:4px;border-radius:inherit}.pfx-micro-bullet__actual[data-tone=success]{background:var(--p-table-state-success-fg, #168a4a)}.pfx-micro-bullet__actual[data-tone=warning]{background:var(--p-table-state-warning-fg, #b45f06)}.pfx-micro-bullet__actual[data-tone=danger],.pfx-micro-bullet__actual[data-tone=critical]{background:var(--p-table-state-danger-fg, #b3261e)}.pfx-micro-bullet__actual[data-tone=info]{background:var(--md-sys-color-primary, #2563eb)}.pfx-micro-bullet__target{position:absolute;inset-block:0;inline-size:2px;background:var(--md-sys-color-on-surface, #111827)}.pfx-micro-bullet__bottom{display:flex;justify-content:space-between;font-size:9px;color:var(--md-sys-color-on-surface-variant, #4b5563)}.pfx-micro-viz-container{display:flex;align-items:center;gap:8px;width:100%}.pfx-micro-trend__label-col{display:flex;flex-direction:column;justify-content:center;font-size:11px;line-height:1.2;flex-shrink:0;min-width:24px;font-family:var(--md-sys-typescale-body-medium-font-family, sans-serif)}.pfx-micro-trend__label-col--start{align-items:flex-end;text-align:right}.pfx-micro-trend__label-col--end{align-items:flex-start;text-align:left}.pfx-micro-trend__value{font-weight:700;color:var(--md-sys-color-on-surface, #1f2937)}.pfx-micro-trend__label{color:var(--md-sys-color-on-surface-variant, #4b5563);font-size:9px}.pfx-micro-viz__line,.pfx-micro-viz__area,.pfx-micro-viz__column{display:block;width:100%;height:30px;overflow:visible;flex:1 1 auto}.pfx-micro-line__svg,.pfx-micro-area__svg,.pfx-micro-column__svg{width:100%;height:100%;display:block;overflow:visible}.pfx-micro-line__path,.pfx-micro-area__path{stroke:currentColor}.pfx-micro-area__fill{fill:currentColor}.pfx-micro-trend__marker{fill:currentColor;stroke:var(--md-sys-color-surface, #ffffff);stroke-width:1.5px}.pfx-micro-trend__marker[data-tone=success]{fill:var(--p-table-state-success-fg, #168a4a)}.pfx-micro-trend__marker[data-tone=warning]{fill:var(--p-table-state-warning-fg, #b45f06)}.pfx-micro-trend__marker[data-tone=danger],.pfx-micro-trend__marker[data-tone=critical]{fill:var(--p-table-state-danger-fg, #b3261e)}.pfx-micro-trend__marker[data-tone=info]{fill:var(--md-sys-color-primary, #2563eb)}.pfx-micro-viz__process{align-items:center;width:100%;min-width:120px;padding-block:4px;overflow-x:auto;-webkit-overflow-scrolling:touch}.pfx-micro-step{display:flex;align-items:center;flex:1 1 0%;min-width:0}.pfx-micro-step[data-state=future]{opacity:.38}.pfx-micro-step[data-state=disabled]{opacity:.28;pointer-events:none}.pfx-micro-step__node-wrapper{display:flex;flex-direction:column;align-items:center;position:relative;flex-shrink:0}.pfx-micro-step__node{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;border-radius:50%;font-size:11px;font-weight:700;background:var(--md-sys-color-surface-container-high, #e5e7eb);color:var(--md-sys-color-on-surface, #1f2937);border:2px solid transparent;transition:all .2s ease}.pfx-micro-step__node[data-tone=success]{background:var(--p-table-state-success-fg, #168a4a);color:#fff}.pfx-micro-step__node[data-tone=warning]{background:var(--p-table-state-warning-fg, #b45f06);color:#fff}.pfx-micro-step__node[data-tone=danger],.pfx-micro-step__node[data-tone=critical]{background:var(--p-table-state-danger-fg, #b3261e);color:#fff}.pfx-micro-step__node[data-tone=info]{background:var(--md-sys-color-primary, #2563eb);color:#fff}.pfx-micro-step__icon{font-size:12px}.pfx-micro-step__label{font-size:9px;margin-top:4px;text-align:center;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:72px;color:var(--md-sys-color-on-surface-variant, #4b5563)}.pfx-micro-step__connector{flex:1 1 auto;height:2px;background:var(--md-sys-color-surface-container-high, #e5e7eb);margin-inline:8px;min-width:16px}.pfx-micro-step__connector[data-tone=success]{background:var(--p-table-state-success-fg, #168a4a)}.pfx-micro-step__connector[data-tone=warning]{background:var(--p-table-state-warning-fg, #b45f06)}.pfx-micro-step__connector[data-tone=danger],.pfx-micro-step__connector[data-tone=critical]{background:var(--p-table-state-danger-fg, #b3261e)}.pfx-micro-step__connector[data-tone=info]{background:var(--md-sys-color-primary, #2563eb)}.pfx-micro-viz[data-tone=success]{color:var(--p-table-state-success-fg, #168a4a)}.pfx-micro-viz[data-tone=warning]{color:var(--p-table-state-warning-fg, #b45f06)}.pfx-micro-viz[data-tone=danger],.pfx-micro-viz[data-tone=critical]{color:var(--p-table-state-danger-fg, #b3261e)}.pfx-micro-viz[data-tone=info]{color:var(--md-sys-color-primary, #2563eb)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz[data-tone=success]{color:var(--p-table-state-success-fg, #168a4a)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz[data-tone=warning]{color:var(--p-table-state-warning-fg, #b45f06)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz[data-tone=danger],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz[data-tone=critical]{color:var(--p-table-state-danger-fg, #b3261e)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz[data-tone=info]{color:var(--md-sys-color-primary, #2563eb)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz.pfx-micro-viz__delta{display:inline-flex;align-items:center;justify-content:flex-end;gap:5px;width:auto;min-width:0;font-weight:700;font-variant-numeric:tabular-nums;white-space:nowrap}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__delta-symbol{display:inline-grid;width:12px;min-width:12px;height:12px;min-height:12px;place-items:center;border-radius:0;background:transparent;font-size:11px;line-height:1;transform:translateY(-.5px)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz.pfx-micro-viz__radial,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz.pfx-micro-viz__harvey{display:inline-flex;align-items:center;justify-content:center;width:auto;min-width:0;height:auto;gap:8px}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz.pfx-micro-viz__radial{justify-content:flex-start;gap:7px}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-radial-svg{display:block;width:24px;height:24px;overflow:visible;flex:0 0 auto}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-radial-svg__track{fill:none;stroke:var(--pfx-micro-track-color, var(--md-sys-color-surface-container-high, #e5e7eb));stroke-width:3.4}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-radial-svg__bar{fill:none;stroke:currentColor;stroke-width:3.4;stroke-linecap:round;transform:rotate(-90deg);transform-origin:50% 50%}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-radial-svg__text{font-family:var(--md-sys-typescale-body-medium-font-family, sans-serif);font-size:8.5px;font-weight:700;text-anchor:middle;fill:currentColor}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-radial-value{color:currentColor;font-family:var(--md-sys-typescale-body-medium-font-family, sans-serif);font-size:12px;font-weight:700;font-variant-numeric:tabular-nums;line-height:1;white-space:nowrap}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-harvey-svg{display:block;width:26px;height:26px;overflow:visible;flex:0 0 auto}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-harvey-svg__track{fill:none;stroke:var(--pfx-micro-track-color, var(--md-sys-color-surface-container-high, #e5e7eb));stroke-width:2.4}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-harvey-svg__bar{fill:none;stroke:currentColor;stroke-width:16;transform:rotate(-90deg);transform-origin:50% 50%}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-harvey-fraction{display:inline-flex;align-items:center;font-family:var(--md-sys-typescale-body-medium-font-family, sans-serif);font-size:12px;font-variant-numeric:tabular-nums;white-space:nowrap}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-harvey-fraction strong{color:currentColor;font-weight:700}:host ::ng-deep .pfx-micro-viz-cell .pfx-separator{margin-inline:2px;color:var(--md-sys-color-on-surface-variant, #4b5563);opacity:.6}:host ::ng-deep .pfx-micro-viz-cell .pfx-total{color:var(--md-sys-color-on-surface-variant, #4b5563)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz.pfx-micro-viz__process{display:inline-flex;align-items:center;justify-content:center;width:100%;min-width:112px;overflow:hidden}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz-container{display:flex;align-items:center;gap:8px;width:100%;min-width:0}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz.pfx-micro-viz__line,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz.pfx-micro-viz__area,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz.pfx-micro-viz__column{display:block;flex:1 1 auto;width:100%;min-width:0;height:30px;overflow:visible}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-line__svg,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-area__svg,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-column__svg{display:block;width:100%;height:100%;overflow:visible}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-line__path,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-area__path{stroke:currentColor}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-area__fill{fill:currentColor}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-column__bar,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-trend__marker{fill:currentColor}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-column__bar[data-tone=success],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-trend__marker[data-tone=success]{fill:var(--p-table-state-success-fg, #168a4a)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-column__bar[data-tone=warning],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-trend__marker[data-tone=warning]{fill:var(--p-table-state-warning-fg, #b45f06)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-column__bar[data-tone=danger],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-column__bar[data-tone=critical],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-trend__marker[data-tone=danger],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-trend__marker[data-tone=critical]{fill:var(--p-table-state-danger-fg, #b3261e)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-column__bar[data-tone=info],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-trend__marker[data-tone=info]{fill:var(--md-sys-color-primary, #2563eb)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step{display:flex;align-items:center;flex:0 1 auto;min-width:0}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__node-wrapper{display:inline-flex;align-items:center;min-width:0}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__node{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;border-radius:50%;background:var(--md-sys-color-surface-container-high, #e5e7eb);color:var(--md-sys-color-on-surface, #1f2937);font-size:12px;font-weight:700;line-height:1;flex:0 0 auto}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__icon{font-size:15px;line-height:1}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__label{display:none}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__connector{flex:0 1 24px;min-width:12px;max-width:28px;height:2px;margin-inline:6px;background:var(--md-sys-color-surface-container-high, #e5e7eb)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__node[data-tone=success],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__connector[data-tone=success]{background:var(--p-table-state-success-fg, #168a4a)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__node[data-tone=warning],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__connector[data-tone=warning]{background:var(--p-table-state-warning-fg, #b45f06)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__node[data-tone=danger],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__node[data-tone=critical],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__connector[data-tone=danger],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__connector[data-tone=critical]{background:var(--p-table-state-danger-fg, #b3261e)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__node[data-tone=info],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__connector[data-tone=info]{background:var(--md-sys-color-primary, #2563eb)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__node[data-tone=success],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__node[data-tone=warning],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__node[data-tone=danger],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__node[data-tone=critical],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__node[data-tone=info]{color:var(--md-sys-color-on-primary, #ffffff)}.pfx-avatar{display:inline-flex;align-items:center;justify-content:center;background:var(--md-sys-color-surface-container);color:var(--md-sys-color-on-surface);border-radius:4px;overflow:hidden;font-weight:600}.pfx-avatar.shape-rounded{border-radius:8px}.pfx-avatar.shape-circle{border-radius:999px}.pfx-avatar--initials{text-transform:uppercase;font-size:12px}.pfx-cell-compose{display:inline-flex;align-items:center;gap:6px}.pfx-cell-compose.dir-col{flex-direction:column;align-items:stretch}.pfx-cell-compose.align-start{justify-content:flex-start}.pfx-cell-compose.align-center{justify-content:center}.pfx-cell-compose.align-end{justify-content:flex-end}.pfx-cell-compose.wrap{flex-wrap:wrap}.pfx-cell-compose.ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.px-scroll-viewport{width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;overscroll-behavior-x:contain;background:var(--p-table-bg);border-radius:12px 12px 0 0}.px-scroll-viewport:has(.mat-mdc-table.table-stack-top){border-top-left-radius:0;border-top-right-radius:0}.px-scroll-viewport.scroll-none{overflow-x:visible}.px-scroll-viewport.scroll-auto ::ng-deep .mat-mdc-table{width:max-content;min-width:100%}.px-scroll-viewport.scroll-wrap ::ng-deep .mat-mdc-header-cell,.px-scroll-viewport.scroll-wrap ::ng-deep .mat-mdc-cell{white-space:normal;text-overflow:initial}.px-scroll-viewport.scroll-wrap ::ng-deep .mat-mdc-table{width:100%}:host ::ng-deep .mat-mdc-header-row{position:sticky;top:0;z-index:var(--praxis-layer-sticky-local, 100);height:var(--p-table-header-height, var(--p-table-header-height-default, var(--mat-table-header-container-height, 40px)));min-height:var(--p-table-header-height, var(--p-table-header-height-default, var(--mat-table-header-container-height, 40px)));background:var(--p-table-header-bg);color:var(--p-table-header-fg);box-shadow:var(--p-table-header-shadow, 0 1px 0 var(--p-table-border-color));border-bottom:1px solid var(--p-table-border-color)}:host ::ng-deep .mat-mdc-header-cell{color:var(--p-table-header-fg);font-weight:600}:host ::ng-deep .mat-sort-header-content,:host ::ng-deep .mat-mdc-header-row .mat-icon{color:inherit;font-weight:600}:host ::ng-deep .mat-mdc-header-cell.mat-sort-header-sorted .mat-sort-header-arrow,:host ::ng-deep .mat-mdc-header-cell:hover .mat-sort-header-arrow{color:var(--p-table-header-fg)!important}:host ::ng-deep .mat-mdc-header-cell.mat-sort-header-sorted .mat-sort-header-arrow .mat-sort-header-indicator,:host ::ng-deep .mat-mdc-header-cell.mat-sort-header-sorted .mat-sort-header-arrow .mat-sort-header-stem,:host ::ng-deep .mat-mdc-header-cell.mat-sort-header-sorted .mat-sort-header-arrow .mat-sort-header-pointer,:host ::ng-deep .mat-mdc-header-cell.mat-sort-header-sorted .mat-sort-header-arrow .mat-sort-header-pointer-left,:host ::ng-deep .mat-mdc-header-cell.mat-sort-header-sorted .mat-sort-header-arrow .mat-sort-header-pointer-right{border-color:var(--p-table-header-fg)!important;background:var(--p-table-header-fg)!important}:host ::ng-deep .mat-mdc-header-cell{height:var(--p-table-header-height, var(--p-table-header-height-default, var(--mat-table-header-container-height, 40px)));padding:var(--p-header-padding, var(--p-header-padding-default, 12px 16px))!important;font-size:var(--p-header-font-size, var(--p-header-font-size-default, inherit));font-weight:var(--p-header-font-weight, 600);letter-spacing:var(--p-header-letter-spacing, normal);text-transform:var(--p-header-text-transform, none);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;position:relative}:host ::ng-deep .mat-mdc-header-cell.praxis-header-align-left .mat-sort-header-container{justify-content:flex-start}:host ::ng-deep .mat-mdc-header-cell.praxis-header-align-center .mat-sort-header-container{justify-content:center}:host ::ng-deep .mat-mdc-header-cell.praxis-header-align-right .mat-sort-header-container{justify-content:flex-end}:host ::ng-deep .mat-mdc-header-cell.praxis-header-align-left .praxis-header-label-text{text-align:left}:host ::ng-deep .mat-mdc-header-cell.praxis-header-align-center .praxis-header-label-text{text-align:center}:host ::ng-deep .mat-mdc-header-cell.praxis-header-align-right .praxis-header-label-text{text-align:right}:host ::ng-deep .pfx-column-drag-enabled .mat-mdc-header-cell.praxis-header-draggable .mat-sort-header-container{display:flex;align-items:center;width:100%;gap:4px}:host ::ng-deep .pfx-column-drag-enabled .mat-mdc-header-cell.praxis-header-draggable{-webkit-user-select:none;user-select:none}:host ::ng-deep .mat-mdc-header-cell .praxis-header-sort-trigger{display:block;width:100%;min-width:0}:host ::ng-deep .mat-mdc-header-cell.praxis-header-resizable{overflow:visible}:host ::ng-deep .mat-mdc-header-cell .praxis-column-resize-handle{position:absolute;z-index:2;inset-block:0;inset-inline-end:0;width:var(--p-table-column-resize-hit-area);cursor:col-resize;touch-action:none;-webkit-user-select:none;user-select:none}:host ::ng-deep .mat-mdc-header-cell .praxis-column-resize-handle:after{content:\"\";position:absolute;inset-block:6px;inset-inline-start:calc((var(--p-table-column-resize-hit-area) - var(--p-table-column-resize-line-width)) / 2);width:var(--p-table-column-resize-line-width);background:var(--p-table-column-resize-separator-color);opacity:.76;transition:background-color .12s ease,opacity .12s ease,transform .12s ease,inset-block .12s ease}:host ::ng-deep .mat-mdc-header-cell .praxis-column-resize-handle:focus-visible{outline:2px solid var(--p-table-column-resize-separator-hover-color);outline-offset:-2px}:host ::ng-deep .mat-mdc-header-cell.praxis-header-resizable:hover .praxis-column-resize-handle:after,:host ::ng-deep .mat-mdc-header-cell.praxis-header-resizable:focus-within .praxis-column-resize-handle:after,:host ::ng-deep .mat-mdc-header-cell .praxis-column-resize-handle:hover:after,:host ::ng-deep .mat-mdc-header-cell .praxis-column-resize-handle:focus-visible:after{background:var(--p-table-column-resize-separator-hover-color);opacity:1}:host ::ng-deep .mat-mdc-header-cell.praxis-header-resizing .praxis-column-resize-handle:after{background:var(--p-table-column-resize-active-color);inset-block:0;opacity:1;transform:scaleX(2)}:host ::ng-deep .pfx-column-resizing,:host ::ng-deep .pfx-column-resizing .mat-mdc-header-cell{cursor:col-resize}:host ::ng-deep .pfx-column-drag-enabled .mat-mdc-header-cell.praxis-header-draggable.cdk-drag-dragging{cursor:grabbing}:host ::ng-deep .pfx-column-drag-enabled .mat-mdc-header-cell.praxis-header-draggable .mat-sort-header-content{display:inline-flex;align-items:center;gap:4px;flex:1 1 auto;min-width:0;max-width:100%;overflow:hidden}:host ::ng-deep .pfx-column-drag-enabled .mat-mdc-header-cell .praxis-header-label{display:inline-flex;align-items:center;gap:4px;flex:1 1 auto;min-width:0}:host ::ng-deep .pfx-column-drag-enabled .mat-mdc-header-cell .praxis-header-label-text{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}:host ::ng-deep .pfx-column-drag-indicator .cdk-drop-list-dragging .mat-mdc-header-cell:not(.cdk-drag-placeholder){transition:transform var(--p-table-reorder-transition-duration, .18s) var(--p-table-motion-easing, cubic-bezier(0, 0, .2, 1))}:host ::ng-deep .pfx-column-drag-indicator .mat-mdc-header-cell.cdk-drag-animating{transition:transform var(--p-table-reorder-transition-duration, .16s) var(--p-table-motion-easing, cubic-bezier(0, 0, .2, 1))}.pfx-column-drag-preview{box-sizing:border-box;display:flex;align-items:center;border-radius:10px;border:1px solid var(--p-table-border-color);background:linear-gradient(135deg,var(--p-table-header-bg) 0%,var(--p-table-row-hover-bg) 100%);color:var(--p-table-header-fg);box-shadow:var(--p-table-drag-preview-shadow);transform:scale(var(--p-table-drag-preview-scale, 1.01));pointer-events:none;z-index:var(--praxis-layer-authoring-hover, 300)}.pfx-column-drag-preview-custom{height:100%;padding:var(--p-header-padding, var(--p-header-padding-default, 12px 16px))}.pfx-column-drag-preview .mat-sort-header-arrow,.pfx-column-drag-preview .mat-sort-header-indicator,.pfx-column-drag-preview .mat-sort-header-stem,.pfx-column-drag-preview .mat-sort-header-pointer,.pfx-column-drag-preview .mat-sort-header-pointer-left,.pfx-column-drag-preview .mat-sort-header-pointer-right{display:none!important}.pfx-column-drag-preview .mat-sort-header-container{display:flex;align-items:center;width:100%;min-height:100%;padding-right:0!important}.pfx-column-drag-preview .praxis-header-sort-trigger{display:block;width:100%;min-width:0}.pfx-column-drag-preview .mat-sort-header-content,.pfx-column-drag-preview .praxis-header-label{display:inline-flex;align-items:center;flex:1 1 auto;min-width:0;width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pfx-column-drag-preview.praxis-header-align-left .mat-sort-header-container,.pfx-column-drag-preview.praxis-header-align-left,.pfx-column-drag-preview.praxis-header-align-left .mat-sort-header-content,.pfx-column-drag-preview.praxis-header-align-left .praxis-header-label{justify-content:flex-start}.pfx-column-drag-preview.praxis-header-align-center .mat-sort-header-container,.pfx-column-drag-preview.praxis-header-align-center,.pfx-column-drag-preview.praxis-header-align-center .mat-sort-header-content,.pfx-column-drag-preview.praxis-header-align-center .praxis-header-label{justify-content:center}.pfx-column-drag-preview.praxis-header-align-right .mat-sort-header-container,.pfx-column-drag-preview.praxis-header-align-right,.pfx-column-drag-preview.praxis-header-align-right .mat-sort-header-content,.pfx-column-drag-preview.praxis-header-align-right .praxis-header-label{justify-content:flex-end}.pfx-column-drag-preview.praxis-header-align-right .mat-sort-header-content{flex:0 1 auto;width:auto;margin-inline-start:auto}.pfx-column-drag-preview.praxis-header-align-right .praxis-header-label{width:auto}.pfx-column-drag-preview.praxis-header-align-left .praxis-header-label-text{text-align:left}.pfx-column-drag-preview.praxis-header-align-center .praxis-header-label-text{text-align:center}.pfx-column-drag-preview.praxis-header-align-right .praxis-header-label-text{text-align:right}:host ::ng-deep .pfx-column-drag-indicator .cdk-drag-placeholder{opacity:1;border:1px dashed var(--p-table-border-color);background:var(--p-table-row-hover-bg)}:host ::ng-deep .pfx-column-drag-indicator .cdk-drag-placeholder *{opacity:0}:host ::ng-deep .pfx-column-drag-indicator .mat-mdc-header-cell.cdk-drag-dragging{opacity:.58}@media(prefers-reduced-motion:reduce){:host ::ng-deep .pfx-column-drag-indicator .cdk-drop-list-dragging .mat-mdc-header-cell:not(.cdk-drag-placeholder){transition:none}.pfx-column-drag-preview{transition:none;transform:none}.praxis-column-reorder-status{animation:none}.pfx-expansion-detail-panel{animation:none!important;transition:none!important;transform:none!important}:host ::ng-deep .mat-mdc-row{transition:none}:host ::ng-deep .mat-mdc-table{transition:none}}.praxis-actions-header{text-align:right}.praxis-actions-header.align-start{text-align:left}.praxis-actions-header.align-center{text-align:center}.praxis-actions-header.align-end{text-align:right}.praxis-actions-header .praxis-actions-header__content{display:inline-flex;align-items:center;gap:var(--p-actions-header-gap, 6px);justify-content:center;max-width:100%;min-width:0;white-space:nowrap;color:var(--p-actions-header-color, inherit)}.praxis-actions-header .praxis-actions-header__content .mat-icon{font-size:18px;width:18px;height:18px;line-height:18px}.praxis-actions-header .praxis-actions-header__label{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@media(max-width:640px){.praxis-actions-header .praxis-actions-header__label{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap}}:host ::ng-deep .mat-mdc-header-cell .mat-sort-header-container{box-sizing:border-box;padding-inline-end:0;position:static}:host ::ng-deep .pfx-column-drag-enabled .mat-mdc-header-cell.praxis-header-draggable .mat-sort-header-container{padding-inline-end:0}:host ::ng-deep .mat-mdc-header-cell.praxis-header-resizable:not(.praxis-header-align-right) .mat-sort-header-container{padding-inline-end:calc(var(--p-table-column-resize-hit-area) + 8px)}:host ::ng-deep .mat-mdc-header-cell.praxis-header-resizable.praxis-header-align-center .mat-sort-header-container{padding-inline-start:calc(var(--p-table-column-resize-hit-area) + 8px)}:host ::ng-deep .mat-mdc-header-cell.praxis-header-resizable.praxis-header-align-right .mat-sort-header-container{padding-inline-end:0}:host ::ng-deep .mat-mdc-header-cell.praxis-header-resizable:not(.praxis-header-align-right) .mat-sort-header-content{box-sizing:border-box;padding-inline-end:18px}:host ::ng-deep .mat-mdc-header-cell.praxis-header-resizable.praxis-header-align-center .mat-sort-header-content{padding-inline-start:0;padding-inline-end:0}:host ::ng-deep .mat-mdc-header-cell.praxis-header-resizable.praxis-header-align-right .mat-sort-header-content{box-sizing:border-box;flex:0 1 auto;width:auto;padding-inline-start:0;padding-inline-end:0}:host ::ng-deep .mat-mdc-header-cell.praxis-header-resizable.praxis-header-align-right .praxis-header-label{width:auto}:host ::ng-deep .mat-mdc-header-cell .mat-sort-header-arrow{position:absolute;inset-inline-end:var(--p-table-sort-arrow-overlay-inset, 2px);top:50%;margin:0;transform:translateY(-50%)}:host ::ng-deep .mat-mdc-header-cell.praxis-header-resizable:not(.praxis-header-align-right) .mat-sort-header-arrow{inset-inline-end:calc(var(--p-table-column-resize-hit-area) + 2px)}:host ::ng-deep .mat-mdc-header-cell.praxis-header-align-right .mat-sort-header-arrow{position:static;order:-1;flex:0 0 auto;margin-inline:0 4px;transform:none}:host ::ng-deep .mat-mdc-cell{color:var(--p-table-text-color);height:var(--p-table-row-height, var(--p-table-row-height-default, 44px));padding:var(--p-cell-padding, var(--p-cell-padding-default, 10px 14px));font-size:var(--p-cell-font-size, var(--p-cell-font-size-default, inherit));line-height:1.25;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}:host ::ng-deep .mat-mdc-cell .pfx-cell-content,:host ::ng-deep .mat-cell .pfx-cell-content{display:inline-flex;align-items:center;gap:6px;width:100%;min-width:0;overflow:hidden}:host ::ng-deep .pfx-cell-content.pfx-cell-anim{animation-duration:var(--pfx-cell-anim-duration, .8s);animation-delay:var(--pfx-cell-anim-delay, 0ms);animation-fill-mode:both;animation-timing-function:ease-in-out}:host ::ng-deep .pfx-cell-content.pfx-cell-anim.pfx-cell-anim--once{animation-iteration-count:1}:host ::ng-deep .pfx-cell-content.pfx-cell-anim.pfx-cell-anim--loop{animation-iteration-count:infinite}:host ::ng-deep .pfx-cell-content.pfx-cell-anim.pfx-cell-anim--count{animation-iteration-count:var(--pfx-cell-anim-iteration-count, 1)}:host ::ng-deep .pfx-cell-content.pfx-cell-anim.pfx-cell-anim--on-hover{animation-play-state:paused}:host ::ng-deep .mat-mdc-cell:hover .pfx-cell-content.pfx-cell-anim.pfx-cell-anim--on-hover,:host ::ng-deep .mat-cell:hover .pfx-cell-content.pfx-cell-anim.pfx-cell-anim--on-hover{animation-play-state:running}:host ::ng-deep .pfx-cell-content.pfx-cell-anim.pfx-cell-anim--pulse{animation-name:pfx-cell-pulse}:host ::ng-deep .pfx-cell-content.pfx-cell-anim.pfx-cell-anim--blink{animation-name:pfx-cell-blink}:host ::ng-deep .pfx-cell-content.pfx-cell-anim.pfx-cell-anim--grow{animation-name:pfx-cell-grow}:host ::ng-deep .pfx-cell-content.pfx-cell-anim.pfx-cell-anim--fade{animation-name:pfx-cell-fade}:host ::ng-deep .pfx-cell-content.pfx-cell-anim.pfx-cell-anim--slide-in{animation-name:pfx-cell-slide-in}:host ::ng-deep .pfx-cell-content.pfx-cell-anim.pfx-cell-anim--border-pulse{animation-name:pfx-cell-border-pulse}@keyframes pfx-cell-pulse{0%{transform:scale(1)}50%{transform:scale(var(--pfx-cell-anim-scale-peak, 1.015))}to{transform:scale(1)}}@keyframes pfx-cell-blink{0%,49%{opacity:1}50%,to{opacity:var(--pfx-cell-anim-min-opacity, .35)}}@keyframes pfx-cell-grow{0%{transform:scale(.985)}to{transform:scale(1)}}@keyframes pfx-cell-fade{0%{opacity:0}to{opacity:1}}@keyframes pfx-cell-slide-in{0%{opacity:0;transform:translateY(var(--pfx-cell-anim-slide-distance, 4px))}to{opacity:1;transform:translateY(0)}}@keyframes pfx-cell-border-pulse{0%,to{box-shadow:inset 0 0 rgba(var(--pfx-cell-anim-border-rgb, 25, 118, 210),0)}50%{box-shadow:inset 0 0 0 2px rgba(var(--pfx-cell-anim-border-rgb, 25, 118, 210),var(--pfx-cell-anim-border-strength, .3))}}:host ::ng-deep .mat-mdc-row.pfx-row-anim{animation-duration:var(--pfx-row-anim-duration, .8s);animation-delay:var(--pfx-row-anim-delay, 0ms);animation-fill-mode:both;animation-timing-function:ease-in-out}:host ::ng-deep .mat-mdc-row.pfx-row-anim.pfx-row-anim--once{animation-iteration-count:1}:host ::ng-deep .mat-mdc-row.pfx-row-anim.pfx-row-anim--loop{animation-iteration-count:infinite}:host ::ng-deep .mat-mdc-row.pfx-row-anim.pfx-row-anim--count{animation-iteration-count:var(--pfx-row-anim-iteration-count, 1)}:host ::ng-deep .mat-mdc-row.pfx-row-anim.pfx-row-anim--on-hover{animation-play-state:paused}:host ::ng-deep .mat-mdc-row.pfx-row-anim.pfx-row-anim--on-hover:hover{animation-play-state:running}:host ::ng-deep .mat-mdc-row.pfx-row-anim.pfx-row-anim--pulse{animation-name:pfx-row-pulse}:host ::ng-deep .mat-mdc-row.pfx-row-anim.pfx-row-anim--blink{animation-name:pfx-row-blink}:host ::ng-deep .mat-mdc-row.pfx-row-anim.pfx-row-anim--grow{animation-name:pfx-row-grow}:host ::ng-deep .mat-mdc-row.pfx-row-anim.pfx-row-anim--fade{animation-name:pfx-row-fade}:host ::ng-deep .mat-mdc-row.pfx-row-anim.pfx-row-anim--slide-in{animation-name:pfx-row-slide-in}:host ::ng-deep .mat-mdc-row.pfx-row-anim.pfx-row-anim--border-pulse{animation-name:pfx-row-border-pulse}@keyframes pfx-row-pulse{0%{transform:scale(1)}50%{transform:scale(var(--pfx-row-anim-scale-peak, 1.015))}to{transform:scale(1)}}@keyframes pfx-row-blink{0%,49%{opacity:1}50%,to{opacity:var(--pfx-row-anim-min-opacity, .35)}}@keyframes pfx-row-grow{0%{transform:scale(.985)}to{transform:scale(1)}}@keyframes pfx-row-fade{0%{opacity:0}to{opacity:1}}@keyframes pfx-row-slide-in{0%{opacity:0;transform:translateY(var(--pfx-row-anim-slide-distance, 4px))}to{opacity:1;transform:translateY(0)}}@keyframes pfx-row-border-pulse{0%,to{box-shadow:inset 0 0 rgba(var(--pfx-row-anim-border-rgb, 25, 118, 210),0)}50%{box-shadow:inset 0 0 0 2px rgba(var(--pfx-row-anim-border-rgb, 25, 118, 210),var(--pfx-row-anim-border-strength, .3))}}@media(prefers-reduced-motion:reduce){:host ::ng-deep .pfx-cell-content.pfx-cell-anim,:host ::ng-deep .mat-mdc-row.pfx-row-anim{animation:none!important}}:host ::ng-deep .mat-mdc-row:hover{background:var(--p-table-row-hover-bg)}:host ::ng-deep .mat-mdc-row{height:var(--p-table-row-height, var(--p-table-row-height-default, 44px));min-height:var(--p-table-row-height, var(--p-table-row-height-default, 44px));transition:background-color var(--p-table-hover-transition-duration, .18s) var(--p-table-motion-easing, cubic-bezier(0, 0, .2, 1)),box-shadow var(--p-table-selection-transition-duration, .18s) var(--p-table-motion-easing, cubic-bezier(0, 0, .2, 1))}:host ::ng-deep .mat-mdc-row.pfx-row-click-selectable{cursor:pointer}:host ::ng-deep .mat-mdc-row:nth-child(2n){background:var(--p-table-row-even-bg)}:host ::ng-deep .mat-mdc-row:nth-child(2n):hover{background:var(--p-table-row-hover-bg)}:host ::ng-deep .mat-mdc-row.pfx-row-selected,:host ::ng-deep .mat-mdc-row.pfx-row-selected:hover{background:var(--p-table-row-selected-bg)}:host ::ng-deep .mat-mdc-row.pfx-row-selected .mat-mdc-cell{background:var(--p-table-row-selected-bg);color:var(--p-table-row-selected-fg);font-weight:var(--p-table-row-selected-font-weight)}:host ::ng-deep .mat-mdc-row.pfx-row-selected .mat-mdc-cell:first-child{position:relative}:host ::ng-deep .mat-mdc-row.pfx-row-selected .mat-mdc-cell:first-child:before{content:\"\";position:absolute;inset:0 auto 0 0;width:4px;border-radius:0 4px 4px 0;background:var(--p-table-row-selected-indicator);pointer-events:none}:host.row-borders ::ng-deep .mat-mdc-row .mat-mdc-cell{border-bottom:1px solid var(--p-table-border-color)}:host.row-borders ::ng-deep .mat-mdc-header-row .mat-mdc-header-cell{border-bottom:none}:host.col-borders ::ng-deep .mat-mdc-header-row .mat-mdc-header-cell,:host.col-borders ::ng-deep .mat-mdc-row .mat-mdc-cell{border-right:1px solid var(--p-table-border-color)}:host.col-borders ::ng-deep .mat-mdc-header-row .mat-mdc-header-cell:last-child,:host.col-borders ::ng-deep .mat-mdc-row .mat-mdc-cell:last-child{border-right:none}.ptable-error{display:flex;align-items:center;gap:12px;padding:12px;margin:8px 0;border:1px solid var(--md-sys-color-error);border-radius:8px}.ptable-error__content{flex:1}.ptable-error__title{font-weight:600}.ptable-info-banner{display:flex;gap:12px;align-items:center;padding:8px 12px;margin:8px 0;border-radius:8px;border:1px solid var(--md-sys-color-primary);background:var(--md-sys-color-primary-container);color:var(--md-sys-color-on-primary-container)}.ptable-info-banner .text{flex:1;font-weight:600}.ptable-info-banner .actions{display:flex;gap:8px}.pfx-cell-image{display:inline-block;vertical-align:middle;background:var(--md-sys-color-surface-variant);border:1px solid var(--md-sys-color-outline-variant)}.pfx-cell-image.shape-rounded{border-radius:8px}.pfx-cell-image.shape-circle{border-radius:9999px}.pfx-badge{display:inline-flex;align-items:center;gap:6px;line-height:1;padding:4px 8px;border-radius:9999px;font-size:12px;font-weight:600;border:1px solid transparent;white-space:nowrap;--prx-rich-content-inline-gap: 6px}.pfx-badge .pfx-badge-icon{font-size:16px;width:16px;height:16px}.pfx-badge--plain{background:transparent;border-color:transparent;color:inherit}.pfx-badge--filled-primary{background:var(--md-sys-color-primary);color:var(--md-sys-color-on-primary)}.pfx-badge--filled-accent{background:var(--md-sys-color-secondary);color:var(--md-sys-color-on-secondary)}.pfx-badge--filled-warn,.pfx-badge--filled-danger{background:var(--md-sys-color-error);color:var(--md-sys-color-on-error)}.pfx-badge--filled-success{background:var(--p-table-state-success-bg);color:var(--p-table-state-success-fg)}.pfx-badge--filled-info{background:var(--md-sys-color-tertiary);color:var(--md-sys-color-on-tertiary)}.pfx-badge--filled-basic{background:var(--md-sys-color-surface-container-highest);color:var(--md-sys-color-on-surface);border-color:var(--md-sys-color-outline-variant)}.pfx-badge--outlined{background:transparent;border-color:var(--md-sys-color-outline-variant);color:inherit}.pfx-badge--soft-primary{background:var(--p-table-badge-soft-primary-bg);color:var(--p-table-badge-soft-primary-fg)}.pfx-badge--soft-accent{background:var(--p-table-badge-soft-accent-bg);color:var(--p-table-badge-soft-accent-fg)}.pfx-badge--soft-warn{background:var(--p-table-badge-soft-warn-bg);color:var(--p-table-badge-soft-warn-fg)}.pfx-badge--soft-danger{background:color-mix(in srgb,var(--p-table-state-danger-bg) 72%,transparent);color:var(--p-table-state-danger-fg);border-color:color-mix(in srgb,var(--p-table-state-danger-fg) 18%,transparent)}.pfx-badge--soft-success{background:color-mix(in srgb,var(--p-table-state-success-bg) 72%,transparent);color:var(--p-table-state-success-fg);border-color:color-mix(in srgb,var(--p-table-state-success-fg) 18%,transparent)}.pfx-badge--soft-info{background:color-mix(in srgb,var(--md-sys-color-tertiary-container) 72%,transparent);color:var(--md-sys-color-on-tertiary-container);border-color:color-mix(in srgb,var(--md-sys-color-tertiary) 18%,transparent)}.pfx-badge--soft-basic{background:color-mix(in srgb,var(--md-sys-color-surface-container-highest) 82%,transparent);color:color-mix(in srgb,var(--md-sys-color-on-surface) 76%,transparent);border-color:color-mix(in srgb,var(--md-sys-color-outline-variant) 65%,transparent)}.pfx-icon-renderer,:host ::ng-deep .pfx-icon-renderer__content{--prx-rich-content-inline-gap: var(--p-table-icon-value-gap, .04rem)}.pfx-icon-renderer__prefix,.pfx-icon-renderer__suffix,:host ::ng-deep .pfx-icon-renderer__prefix,:host ::ng-deep .pfx-icon-renderer__suffix{color:var(--p-table-icon-value-affix-color, currentColor);font-size:var(--p-table-icon-value-affix-font-size, .95em);font-weight:var(--p-table-icon-value-affix-font-weight, 500);line-height:1;opacity:var(--p-table-icon-value-affix-opacity, .72)}.pfx-icon-renderer__label,:host ::ng-deep .pfx-icon-renderer__label{color:var(--p-table-icon-value-color, currentColor);font-weight:var(--p-table-icon-value-font-weight, inherit);font-variant-numeric:tabular-nums;line-height:1}.row--success,.row--success td,td.row--success{background-color:var(--p-table-state-success-bg)!important;color:var(--p-table-state-success-fg)!important}.row--warning,.row--warning td,td.row--warning{background-color:var(--p-table-state-warning-bg)!important;color:var(--p-table-state-warning-fg)!important}.row--danger,.row--danger td,td.row--danger{background-color:var(--p-table-state-danger-bg)!important;color:var(--p-table-state-danger-fg)!important}.row--highlight,.row--highlight td,td.row--highlight{background-color:var(--p-table-state-highlight-bg)!important;color:var(--p-table-state-highlight-fg)!important;font-weight:600}.row--muted,.row--muted td,td.row--muted{opacity:.7;filter:saturate(.6)}.pfx-expansion-node-embed{display:flex;flex-direction:column;gap:12px;padding:16px;border:1px solid var(--md-sys-color-outline-variant);border-radius:16px;background:var(--md-sys-color-surface-container-low, var(--md-sys-color-surface))}.ptable-loading-state{padding:8px 12px 4px;display:grid;gap:10px}.ptable-loading-state__hero{display:grid;gap:10px;padding:14px;border-radius:8px;border:1px solid rgba(18,99,180,.08);background:linear-gradient(180deg,#ffffffa6,#ffffff47),linear-gradient(0deg,#1263b408,#1263b400)}.ptable-loading-state__rows{display:grid;gap:8px}.ptable-loading-state__row{display:grid;grid-template-columns:96px minmax(0,1fr) minmax(140px,1.2fr);gap:8px}.ptable-loading-state__line,.ptable-loading-state__cell{display:block;height:12px;border-radius:999px;background:linear-gradient(90deg,#1263b414,#1263b42e,#1263b414);background-size:200% 100%;animation:ptable-loading-wave 1.2s ease-in-out infinite}.ptable-loading-state__line--wide{width:180px}.ptable-loading-state__line--short{width:96px}.ptable-loading-state__cell--short{width:100%;max-width:84px}.ptable-loading-state__cell--wide{width:100%}.ptable-loading-state__message{font-size:.85rem;color:var(--md-sys-color-on-surface-variant, #5a5d67);padding-inline:4px}.pfx-expansion-node-embed__header,.pfx-expansion-node-embed__meta,.pfx-expansion-node-embed__empty,.pfx-expansion-node-embed__diagram-label{display:block}.pfx-expansion-node-embed--inline{min-width:0}.pfx-expansion-node-embed--chart praxis-chart{display:block;min-height:280px}.ptable-no-data-state{padding:8px 12px 4px}.ptable-no-data-state ::ng-deep .empty-card{margin:0;border-radius:8px}@keyframes ptable-loading-wave{0%{background-position:100% 0}to{background-position:-100% 0}}.pfx-expansion-node-embed__diagram{display:flex;flex-direction:column;gap:8px}.pfx-expansion-node-embed__diagram-source{margin:0;padding:12px;overflow:auto;border-radius:12px;border:1px solid var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface-container-highest, var(--md-sys-color-surface));color:var(--md-sys-color-on-surface);font-family:Consolas,Courier New,monospace;font-size:12px;line-height:1.4;white-space:pre-wrap}.pfx-expansion-node-embed__action-btn{align-self:flex-start}.pfx-expansion-node-embed__action-host{display:inline-flex}.praxis-table-columns-menu{max-height:320px;overflow-y:auto;padding:8px 0}.praxis-table-column-menu-item{display:flex!important;align-items:center;width:100%;box-sizing:border-box;padding:6px 16px;min-height:40px}.praxis-table-column-menu-item mat-checkbox{width:100%}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i10$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i10$1.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }, { kind: "directive", type: i10$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i10$1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: ScrollingModule }, { kind: "directive", type: i11$1.CdkScrollable, selector: "[cdk-scrollable], [cdkScrollable]" }, { kind: "directive", type: i12.ɵɵCdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i12.ɵɵCdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i12.ɵɵCdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i13.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer", "cdkDropListHasAnchor"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i13.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i13.CdkDragPreview, selector: "ng-template[cdkDragPreview]", inputs: ["data", "matchSize"] }, { kind: "ngmodule", type: MatBadgeModule }, { kind: "directive", type: i15$1.MatBadge, selector: "[matBadge]", inputs: ["matBadgeColor", "matBadgeOverlap", "matBadgeDisabled", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i3.MatMiniFabButton, selector: "button[mat-mini-fab], a[mat-mini-fab], button[matMiniFab], a[matMiniFab]", exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i8.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "aria-expanded", "aria-controls", "aria-owns", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatRadioModule }, { kind: "component", type: i17$1.MatRadioButton, selector: "mat-radio-button", inputs: ["id", "name", "aria-label", "aria-labelledby", "aria-describedby", "disableRipple", "tabIndex", "checked", "value", "labelPosition", "disabled", "required", "color", "disabledInteractive"], outputs: ["change"], exportAs: ["matRadioButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i5.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i5.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i5.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatPaginatorModule }, { kind: "component", type: i20.MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }, { kind: "ngmodule", type: MatSlideToggleModule }, { kind: "component", type: i5$1.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "ngmodule", type: MatSnackBarModule }, { kind: "ngmodule", type: MatSortModule }, { kind: "directive", type: i22.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i22.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "ngmodule", type: MatTableModule }, { kind: "component", type: i8$1.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i8$1.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i8$1.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i8$1.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i8$1.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i8$1.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i8$1.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i8$1.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i8$1.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i8$1.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i10.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: PraxisAiAssistantShellComponent, selector: "praxis-ai-assistant-shell", inputs: ["labels", "mode", "state", "contextItems", "attachments", "messages", "quickReplies", "recommendedIntents", "prompt", "statusText", "errorText", "testIdPrefix", "panelTestId", "submitTestId", "applyTestId", "primaryAction", "secondaryActions", "governanceActions", "busy", "canSubmit", "canApply", "submitOnEnter", "showAttachAction", "enablePastedAttachments", "enableFileAttachments", "attachmentAccept", "attachmentMultiple", "voiceInputMode", "voiceLanguage", "draggable", "resizable", "minWidth", "minHeight", "margin", "layout"], outputs: ["promptChange", "submitPrompt", "apply", "retryTurn", "cancelTurn", "shellAction", "close", "attach", "attachmentsPasted", "attachmentsSelected", "removeAttachment", "messageAction", "editMessage", "resendMessage", "quickReply", "recommendedIntent", "layoutChange"] }, { kind: "component", type: PraxisFilter, selector: "praxis-filter", inputs: ["resourcePath", "apiUrlEntry", "fieldMetadata", "filterId", "formId", "componentInstanceId", "mode", "notifyIfOutdated", "snoozeMs", "autoOpenSettingsOnOutdated", "enableCustomization", "value", "alwaysVisibleFields", "alwaysVisibleFieldMetadataOverrides", "selectedFieldIds", "tags", "allowSaveTags", "persistenceKey", "disablePersistence", "i18n", "changeDebounceMs", "showFilterSettings", "showAdvancedButton", "showAddButton", "showClearButton", "showSearchButton", "confirmTagDelete", "placeBooleansInActions", "showToggleLabels", "useInlineSelectVariant", "useInlineSearchableSelectVariant", "useInlineMultiSelectVariant", "useInlineInputVariant", "useInlineToggleVariant", "useInlineRangeVariant", "useInlineDateVariant", "useInlineDateRangeVariant", "useInlineTimeVariant", "useInlineTimeRangeVariant", "useInlineTreeSelectVariant", "alwaysMinWidth", "alwaysColsMd", "alwaysColsLg", "tagColor", "tagVariant", "tagButtonColor", "actionsButtonColor", "actionsVariant", "overlayVariant", "overlayBackdrop", "advancedOpenMode", "advancedClearButtonsEnabled"], outputs: ["submit", "change", "clear", "modeChange", "requestSearch", "tagsChange", "selectedFieldIdsChange", "metaChanged", "schemaStatusChange"] }, { kind: "directive", type: PraxisIconDirective, selector: "mat-icon[praxisIcon]", inputs: ["praxisIcon"] }, { kind: "component", type: PraxisTableToolbar, selector: "praxis-table-toolbar", inputs: ["config", "appearance", "backgroundColor", "placement", "showMain", "showActionsGroup", "showEndActions", "showMobileActions", "exportBusy", "evaluationContext", "columnVisibilityController"], outputs: ["toolbarAction", "exportAction", "columnVisibilityToggle"] }, { kind: "component", type: PraxisRichContent, selector: "praxis-rich-content", inputs: ["document", "nodes", "context", "hostCapabilities", "layout", "rootClassName"] }, { kind: "component", type: EmptyStateCardComponent, selector: "praxis-empty-state-card", inputs: ["icon", "title", "description", "primaryAction", "secondaryActions", "inline", "tone"] }, { kind: "component", type: TableRatingCellComponent, selector: "praxis-table-rating", inputs: ["itemsCount", "value", "size", "ratingColor", "outlineColor", "ariaLabel"] }] });
|
|
55271
55776
|
}
|
|
55272
55777
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisTable, decorators: [{
|
|
55273
55778
|
type: Component,
|
|
@@ -55303,7 +55808,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
55303
55808
|
TableDefaultsProvider,
|
|
55304
55809
|
FilterConfigService,
|
|
55305
55810
|
DataFormattingService
|
|
55306
|
-
], template: "@if (shouldShowEmptyState()) {\n <praxis-empty-state-card\n icon=\"link\"\n [title]=\"'Escolha o recurso da tabela'\"\n [description]=\"'Selecione um recurso da API para carregar colunas, registros e a\u00E7\u00F5es da tabela automaticamente.'\"\n [primaryAction]=\"{ label: 'Selecionar recurso', icon: 'bolt', action: openQuickConnect.bind(this) }\"\n ></praxis-empty-state-card>\n}\n\n<!-- Error State with Quick Connect CTA -->\n@if (isRemoteMode() && (schemaError || dataError)) {\n <div class=\"ptable-error\" role=\"alert\" aria-live=\"assertive\">\n <mat-icon color=\"warn\" aria-hidden=\"true\">error</mat-icon>\n <div class=\"ptable-error__content\">\n <praxis-rich-content\n rootClassName=\"ptable-error__title\"\n [nodes]=\"getTableChromeTextRichContentNodes('Erro', 'ptable-error__title-text')\"\n ></praxis-rich-content>\n <praxis-rich-content\n rootClassName=\"ptable-error__message\"\n [nodes]=\"getTableChromeTextRichContentNodes(errorMessage || 'Ocorreu um erro ao carregar a tabela.', 'ptable-error__message-text')\"\n ></praxis-rich-content>\n </div>\n <button mat-flat-button color=\"primary\" (click)=\"openQuickConnect()\">\n <mat-icon>bolt</mat-icon>\n <praxis-rich-content\n rootClassName=\"ptable-error__action-label\"\n [nodes]=\"getTableChromeTextRichContentNodes('Selecionar recurso', 'ptable-error__action-label-text')\"\n ></praxis-rich-content>\n </button>\n @if (enableCustomization) {\n <button\n mat-icon-button\n color=\"primary\"\n data-role=\"table-settings\"\n data-testid=\"table-settings-trigger\"\n (click)=\"openTableSettings()\"\n [attr.aria-label]=\"getTableSettingsLabel()\"\n [matTooltip]=\"getTableSettingsLabel()\"\n matTooltipPosition=\"below\"\n >\n <mat-icon>settings</mat-icon>\n </button>\n }\n @if (!schemaError) {\n <button mat-stroked-button (click)=\"retryData()\">\n <praxis-rich-content\n rootClassName=\"ptable-error__action-label\"\n [nodes]=\"getTableChromeTextRichContentNodes('Tentar novamente', 'ptable-error__action-label-text')\"\n ></praxis-rich-content>\n </button>\n }\n @if (schemaError) {\n <button mat-stroked-button (click)=\"reloadSchema()\">\n <praxis-rich-content\n rootClassName=\"ptable-error__action-label\"\n [nodes]=\"getTableChromeTextRichContentNodes('Recarregar colunas', 'ptable-error__action-label-text')\"\n ></praxis-rich-content>\n </button>\n }\n </div>\n}\n\n<!-- Inline banner for schema change (only in edit mode) -->\n@if (shouldShowOutdatedInline()) {\n <div class=\"ptable-info-banner\" role=\"status\" aria-live=\"polite\">\n <praxis-rich-content\n rootClassName=\"text\"\n [nodes]=\"getTableChromeTextRichContentNodes('O schema do servidor mudou. Reconciliar agora?', 'ptable-info-banner__text')\"\n ></praxis-rich-content>\n <div class=\"actions\">\n <button mat-stroked-button color=\"primary\" (click)=\"onReconcileRequested()\">\n <mat-icon>sync</mat-icon>\n <praxis-rich-content\n rootClassName=\"ptable-info-banner__action-label\"\n [nodes]=\"getTableChromeTextRichContentNodes('Reconciliar', 'ptable-info-banner__action-label-text')\"\n ></praxis-rich-content>\n </button>\n <button mat-button (click)=\"onSnoozeOutdated()\">\n <praxis-rich-content\n rootClassName=\"ptable-info-banner__action-label\"\n [nodes]=\"getTableChromeTextRichContentNodes('Lembrar depois', 'ptable-info-banner__action-label-text')\"\n ></praxis-rich-content>\n </button>\n <button mat-button (click)=\"onIgnoreOutdated()\">\n <praxis-rich-content\n rootClassName=\"ptable-info-banner__action-label\"\n [nodes]=\"getTableChromeTextRichContentNodes('Ignorar', 'ptable-info-banner__action-label-text')\"\n ></praxis-rich-content>\n </button>\n </div>\n </div>\n}\n\n@if (isAiAssistantEnabled() && aiAssistantOpen && aiAssistantViewState) {\n <praxis-ai-assistant-shell\n [labels]=\"aiAssistantLabels\"\n [mode]=\"aiAssistantViewState.mode\"\n [state]=\"aiAssistantViewState.state\"\n [contextItems]=\"aiAssistantViewState.contextItems\"\n [attachments]=\"aiAssistantViewState.attachments\"\n [messages]=\"aiAssistantViewState.messages\"\n [quickReplies]=\"aiAssistantViewState.quickReplies\"\n [recommendedIntents]=\"getAiAssistantRecommendedIntents()\"\n [prompt]=\"aiAssistantPrompt\"\n [statusText]=\"aiAssistantViewState.statusText\"\n [errorText]=\"aiAssistantViewState.errorText\"\n [busy]=\"aiAssistantViewState.state === 'processing' || aiAssistantViewState.state === 'applying'\"\n [canApply]=\"aiAssistantViewState.canApply\"\n [showAttachAction]=\"false\"\n [enablePastedAttachments]=\"false\"\n [voiceInputMode]=\"aiAssistantVoiceInputMode\"\n [voiceLanguage]=\"aiAssistantVoiceLanguage\"\n [layout]=\"aiAssistantLayout\"\n testIdPrefix=\"table-ai-assistant\"\n panelTestId=\"table-ai-assistant-panel\"\n submitTestId=\"table-ai-assistant-submit\"\n applyTestId=\"table-ai-assistant-apply\"\n (promptChange)=\"onAiAssistantPromptChange($event)\"\n (submitPrompt)=\"onAiAssistantSubmit($event)\"\n (apply)=\"onAiAssistantApply()\"\n (retryTurn)=\"onAiAssistantRetry()\"\n (cancelTurn)=\"onAiAssistantCancel()\"\n (quickReply)=\"onAiAssistantQuickReply($event)\"\n (recommendedIntent)=\"onAiAssistantRecommendedIntent($event)\"\n (editMessage)=\"onAiAssistantEditMessage($event)\"\n (resendMessage)=\"onAiAssistantResendMessage($event)\"\n (layoutChange)=\"onAiAssistantLayoutChange($event)\"\n (close)=\"closeAiAssistant()\"\n ></praxis-ai-assistant-shell>\n}\n\n@if (shouldRenderDataSurface() && !schemaError && !dataError && toolbarV2) {\n <div class=\"praxis-table-header\" [class.edit-mode]=\"enableCustomization\" [class.stacked]=\"hasTopToolbarStack()\">\n @if (showToolbar && shouldShowToolbarTopPlacement()) {\n <praxis-table-toolbar\n class=\"praxis-toolbar-stack-top\"\n [config]=\"config\"\n [backgroundColor]=\"getToolbarActionsBackgroundColor()\"\n [style.--pfx-filter-h]=\"getToolbarLayoutHeightHostStyle()\"\n [evaluationContext]=\"getToolbarEvaluationContext()\"\n [columnVisibilityController]=\"toolbarColumnVisibilityController\"\n [showActionsGroup]=\"shouldShowToolbarActionsTop()\"\n [showMobileActions]=\"shouldShowToolbarActionsTop()\"\n [exportBusy]=\"exportBusy\"\n (toolbarAction)=\"onToolbarAction($event)\"\n (exportAction)=\"onExportAction($event)\"\n >\n @if (shouldRenderAdvancedFilter()) {\n <praxis-filter\n advancedFilter\n [resourcePath]=\"getAdvancedFilterResourcePath()\"\n [filterId]=\"tableId\"\n [formId]=\"tableId\"\n [persistenceKey]=\"getAdvancedFilterPersistenceKey()\"\n [fieldMetadata]=\"getAdvancedFilterFieldMetadata()\"\n [enableCustomization]=\"enableCustomization\"\n [value]=\"advancedFilterValue\"\n\n [alwaysVisibleFields]=\"getAdvancedFilterAlwaysVisibleFields()\"\n [alwaysVisibleFieldMetadataOverrides]=\"getAdvancedFilterAlwaysVisibleFieldMetadataOverrides()\"\n [selectedFieldIds]=\"config.behavior?.filtering?.advancedFilters?.settings?.selectedFieldIds ?? []\"\n [allowSaveTags]=\"config.behavior?.filtering?.advancedFilters?.settings?.allowSaveTags\"\n [changeDebounceMs]=\"config.behavior?.filtering?.advancedFilters?.settings?.changeDebounceMs ?? 300\"\n [i18n]=\"getFilterI18n()\"\n [mode]=\"'filter'\"\n [showFilterSettings]=\"enableCustomization\"\n (change)=\"onAdvancedFilterChange($event)\"\n (requestSearch)=\"onAdvancedFilterSubmit($event)\"\n (clear)=\"onAdvancedFilterClear()\"\n ></praxis-filter>\n }\n <ng-content select=\"[advancedFilter]\" />\n <ng-content select=\"[toolbar]\" />\n\n <!-- AI Assistant in Toolbar -->\n @if (shouldShowAiAssistantEntrypoint()) {\n <button\n end-actions\n mat-icon-button\n color=\"primary\"\n type=\"button\"\n class=\"praxis-table-ai-trigger praxis-table-toolbar-action--ai\"\n [class.praxis-table-ai-trigger--minimized]=\"hasMinimizedAiAssistantSession()\"\n [attr.data-testid]=\"aiAssistantTriggerTestId('toolbar-top')\"\n (click)=\"openAiAssistant()\"\n [attr.aria-label]=\"aiAssistantTriggerLabel()\"\n [matBadge]=\"aiAssistantTriggerBadge()\"\n [matBadgeHidden]=\"!hasMinimizedAiAssistantSession()\"\n matBadgeColor=\"accent\"\n matBadgeSize=\"small\"\n matBadgePosition=\"above after\"\n [matTooltip]=\"aiAssistantTriggerTooltip()\"\n matTooltipPosition=\"below\"\n >\n <mat-icon>{{ aiAssistantTriggerIcon() }}</mat-icon>\n </button>\n }\n\n @if (enableCustomization) {\n <button end-actions mat-icon-button color=\"primary\" class=\"praxis-table-toolbar-action--configuration\" data-role=\"table-settings\" data-testid=\"table-settings-trigger\"\n (click)=\"openTableSettings()\" [attr.aria-label]=\"getTableSettingsLabel()\"\n [matBadge]=\"schemaOutdated ? '!' : ''\"\n [matBadgeHidden]=\"!schemaOutdated\"\n matBadgeColor=\"warn\" matBadgeSize=\"small\" matBadgePosition=\"above after\"\n [matTooltip]=\"getTableSettingsTooltip()\"\n matTooltipPosition=\"below\">\n <mat-icon>settings</mat-icon>\n </button>\n }\n </praxis-table-toolbar>\n }\n @if (!showToolbar && enableCustomization) {\n <div class=\"ptable-header-actions\">\n @if (shouldShowAiAssistantEntrypoint()) {\n <button\n mat-icon-button\n color=\"primary\"\n type=\"button\"\n class=\"praxis-table-ai-trigger praxis-table-toolbar-action--ai\"\n [class.praxis-table-ai-trigger--minimized]=\"hasMinimizedAiAssistantSession()\"\n [attr.data-testid]=\"aiAssistantTriggerTestId('header-top')\"\n (click)=\"openAiAssistant()\"\n [attr.aria-label]=\"aiAssistantTriggerLabel()\"\n [matBadge]=\"aiAssistantTriggerBadge()\"\n [matBadgeHidden]=\"!hasMinimizedAiAssistantSession()\"\n matBadgeColor=\"accent\"\n matBadgeSize=\"small\"\n matBadgePosition=\"above after\"\n [matTooltip]=\"aiAssistantTriggerTooltip()\"\n matTooltipPosition=\"below\"\n >\n <mat-icon>{{ aiAssistantTriggerIcon() }}</mat-icon>\n </button>\n }\n <button mat-icon-button color=\"primary\" class=\"praxis-table-toolbar-action--configuration\" data-role=\"table-settings\" data-testid=\"table-settings-trigger\" (click)=\"openTableSettings()\" [attr.aria-label]=\"getTableSettingsLabel()\"\n [matBadge]=\"schemaOutdated ? '!' : ''\"\n [matBadgeHidden]=\"!schemaOutdated\"\n matBadgeColor=\"warn\" matBadgeSize=\"small\" matBadgePosition=\"above after\"\n [matTooltip]=\"getTableSettingsTooltip()\"\n matTooltipPosition=\"below\">\n <mat-icon>settings</mat-icon>\n </button>\n @if (isRemoteMode()) {\n <button mat-icon-button (click)=\"disconnect()\" [attr.aria-label]=\"getDisconnectLabel()\" [matTooltip]=\"getDisconnectTooltip()\">\n <mat-icon>link_off</mat-icon>\n </button>\n }\n </div>\n }\n </div>\n} @else {\n @if (shouldRenderDataSurface() && !schemaError && !dataError) {\n @if (showToolbar && shouldShowToolbarTopPlacement()) {\n <praxis-table-toolbar\n class=\"praxis-toolbar-stack-top\"\n [config]=\"config\"\n [backgroundColor]=\"getToolbarActionsBackgroundColor()\"\n [style.--pfx-filter-h]=\"getToolbarLayoutHeightHostStyle()\"\n [evaluationContext]=\"getToolbarEvaluationContext()\"\n [showActionsGroup]=\"shouldShowToolbarActionsTop()\"\n [showMobileActions]=\"shouldShowToolbarActionsTop()\"\n [exportBusy]=\"exportBusy\"\n (toolbarAction)=\"onToolbarAction($event)\"\n (exportAction)=\"onExportAction($event)\"\n >\n @if (shouldRenderAdvancedFilter()) {\n <praxis-filter\n advancedFilter\n [resourcePath]=\"getAdvancedFilterResourcePath()\"\n [filterId]=\"tableId\"\n [formId]=\"tableId\"\n [persistenceKey]=\"getAdvancedFilterPersistenceKey()\"\n [fieldMetadata]=\"getAdvancedFilterFieldMetadata()\"\n [enableCustomization]=\"enableCustomization\"\n [value]=\"advancedFilterValue\"\n\n [alwaysVisibleFields]=\"getAdvancedFilterAlwaysVisibleFields()\"\n [alwaysVisibleFieldMetadataOverrides]=\"getAdvancedFilterAlwaysVisibleFieldMetadataOverrides()\"\n [selectedFieldIds]=\"config.behavior?.filtering?.advancedFilters?.settings?.selectedFieldIds ?? []\"\n [allowSaveTags]=\"config.behavior?.filtering?.advancedFilters?.settings?.allowSaveTags\"\n [changeDebounceMs]=\"config.behavior?.filtering?.advancedFilters?.settings?.changeDebounceMs ?? 300\"\n [i18n]=\"getFilterI18n()\"\n [mode]=\"'filter'\"\n [showFilterSettings]=\"enableCustomization\"\n (change)=\"onAdvancedFilterChange($event)\"\n (requestSearch)=\"onAdvancedFilterSubmit($event)\"\n (clear)=\"onAdvancedFilterClear()\"\n ></praxis-filter>\n }\n <ng-content select=\"[advancedFilter]\" />\n <ng-content select=\"[toolbar]\" />\n @if (shouldShowAiAssistantEntrypoint()) {\n <button\n end-actions\n mat-icon-button\n color=\"primary\"\n type=\"button\"\n class=\"praxis-table-ai-trigger praxis-table-toolbar-action--ai\"\n [class.praxis-table-ai-trigger--minimized]=\"hasMinimizedAiAssistantSession()\"\n [attr.data-testid]=\"aiAssistantTriggerTestId('toolbar-stacked')\"\n (click)=\"openAiAssistant()\"\n [attr.aria-label]=\"aiAssistantTriggerLabel()\"\n [matBadge]=\"aiAssistantTriggerBadge()\"\n [matBadgeHidden]=\"!hasMinimizedAiAssistantSession()\"\n matBadgeColor=\"accent\"\n matBadgeSize=\"small\"\n matBadgePosition=\"above after\"\n [matTooltip]=\"aiAssistantTriggerTooltip()\"\n matTooltipPosition=\"below\"\n >\n <mat-icon>{{ aiAssistantTriggerIcon() }}</mat-icon>\n </button>\n }\n @if (enableCustomization) {\n <button end-actions mat-icon-button color=\"primary\" class=\"praxis-table-toolbar-action--configuration\" data-role=\"table-settings\" data-testid=\"table-settings-trigger\"\n (click)=\"openTableSettings()\" [attr.aria-label]=\"getTableSettingsLabel()\"\n [matBadge]=\"schemaOutdated ? '!' : ''\"\n [matBadgeHidden]=\"!schemaOutdated\"\n matBadgeColor=\"warn\" matBadgeSize=\"small\" matBadgePosition=\"above after\"\n [matTooltip]=\"getTableSettingsTooltip()\"\n matTooltipPosition=\"below\">\n <mat-icon>settings</mat-icon>\n </button>\n }\n </praxis-table-toolbar>\n }\n @if (!showToolbar && enableCustomization) {\n <div class=\"ptable-header-actions\">\n @if (shouldShowAiAssistantEntrypoint()) {\n <button\n mat-icon-button\n color=\"primary\"\n type=\"button\"\n class=\"praxis-table-ai-trigger praxis-table-toolbar-action--ai\"\n [class.praxis-table-ai-trigger--minimized]=\"hasMinimizedAiAssistantSession()\"\n [attr.data-testid]=\"aiAssistantTriggerTestId('header-stacked')\"\n (click)=\"openAiAssistant()\"\n [attr.aria-label]=\"aiAssistantTriggerLabel()\"\n [matBadge]=\"aiAssistantTriggerBadge()\"\n [matBadgeHidden]=\"!hasMinimizedAiAssistantSession()\"\n matBadgeColor=\"accent\"\n matBadgeSize=\"small\"\n matBadgePosition=\"above after\"\n [matTooltip]=\"aiAssistantTriggerTooltip()\"\n matTooltipPosition=\"below\"\n >\n <mat-icon>{{ aiAssistantTriggerIcon() }}</mat-icon>\n </button>\n }\n <button mat-icon-button color=\"primary\" class=\"praxis-table-toolbar-action--configuration\" data-role=\"table-settings\" data-testid=\"table-settings-trigger\" (click)=\"openTableSettings()\" [attr.aria-label]=\"getTableSettingsLabel()\"\n [matBadge]=\"schemaOutdated ? '!' : ''\"\n [matBadgeHidden]=\"!schemaOutdated\"\n matBadgeColor=\"warn\" matBadgeSize=\"small\" matBadgePosition=\"above after\"\n [matTooltip]=\"getTableSettingsTooltip()\"\n matTooltipPosition=\"below\">\n <mat-icon>settings</mat-icon>\n </button>\n </div>\n }\n }\n}\n<!-- Paginador superior -->\n@if (shouldRenderDataSurface() && !schemaError && !dataError && getPaginationEnabled() && (config.behavior?.pagination?.position === 'top' || config.behavior?.pagination?.position === 'both')) {\n <mat-paginator\n [length]=\"getPaginationLength()\"\n [pageSize]=\"getPaginationPageSize()\"\n [pageSizeOptions]=\"getPaginationPageSizeOptions()\"\n [selectConfig]=\"paginatorSelectConfig\"\n [showFirstLastButtons]=\"getPaginationShowFirstLast()\"\n (page)=\"onPageChange($event)\"\n [class.compact]=\"config.behavior?.pagination?.style === 'compact'\"\n >\n </mat-paginator>\n}\n<div class=\"px-scroll-viewport\"\n cdkScrollable\n [class.scroll-auto]=\"horizontalScroll === 'auto'\"\n [class.scroll-wrap]=\"horizontalScroll === 'wrap'\"\n [class.scroll-none]=\"horizontalScroll === 'none'\">\n\n @if (shouldRenderDataSurface() && !schemaError && !dataError) {\n <div class=\"praxis-visually-hidden-status\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">\n {{ columnReorderStatusMessage }}\n </div>\n @if (exportStatusMessage) {\n <div class=\"praxis-visually-hidden-status\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">\n {{ exportStatusMessage }}\n </div>\n }\n @if (columnReorderVisualStatusMessage) {\n <div class=\"praxis-column-reorder-status\" role=\"note\">\n {{ columnReorderVisualStatusMessage }}\n </div>\n }\n <table\n mat-table\n data-testid=\"table-column-drag-drop-list\"\n [dataSource]=\"dataSource\"\n [multiTemplateDataRows]=\"isRowExpansionRuntimeEnabled()\"\n cdkDropList\n [cdkDropListDisabled]=\"!isColumnDraggingEnabled() || isColumnResizeActive()\"\n [cdkDropListData]=\"visibleDataColumnsForDrag\"\n cdkDropListOrientation=\"horizontal\"\n (cdkDropListDropped)=\"onColumnDrop($event)\"\n matSort\n (matSortChange)=\"onSortChange($event)\"\n [matSortDisabled]=\"!getSortingEnabled() || isColumnResizeActive()\"\n [ngClass]=\"getTableElevationClassName()\"\n [class.table-stack-top]=\"hasTopToolbarStack()\"\n [class.pfx-column-drag-enabled]=\"isColumnDraggingEnabled()\"\n [class.pfx-column-drag-indicator]=\"isColumnDragIndicatorEnabled()\"\n [class.pfx-column-resize-enabled]=\"isColumnResizeEnabled()\"\n [class.pfx-column-resizing]=\"isColumnResizeActive()\"\n [style.width]=\"getColumnResizeTableWidthStyle()\"\n [style.min-width]=\"getColumnResizeTableWidthStyle()\"\n [style.max-width]=\"getColumnResizeTableWidthStyle()\"\n >\n @if (isSelectionColumnEnabled()) {\n <ng-container\n matColumnDef=\"_select\"\n >\n <th mat-header-cell *matHeaderCellDef>\n @if (canSelectAll()) {\n <mat-checkbox\n (change)=\"masterToggle()\"\n [checked]=\"isAllSelected()\"\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\"\n [attr.aria-label]=\"getMasterSelectionAriaLabel()\"\n ></mat-checkbox>\n }\n </th>\n <td mat-cell *matCellDef=\"let row; let i = index\">\n @if (config.behavior?.selection?.type !== 'multiple') {\n <mat-radio-button\n (click)=\"$event.stopPropagation(); toggleRow(row)\"\n [checked]=\"selection.isSelected(row)\"\n [attr.aria-label]=\"getRowSelectionAriaLabel(row, i)\"\n ></mat-radio-button>\n } @else {\n <mat-checkbox\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleRow(row)\"\n [checked]=\"selection.isSelected(row)\"\n [attr.aria-label]=\"getRowSelectionAriaLabel(row, i)\"\n ></mat-checkbox>\n }\n </td>\n </ng-container>\n }\n\n @if (isRowExpansionRuntimeEnabled()) {\n <ng-container matColumnDef=\"_expander\">\n <th mat-header-cell *matHeaderCellDef class=\"pfx-expansion-col-header\">\n <span class=\"praxis-visually-hidden-status\">Expandir detalhes da linha</span>\n </th>\n <td mat-cell *matCellDef=\"let row; let i = index\" class=\"pfx-expansion-col-cell\">\n <button\n mat-icon-button\n class=\"pfx-expansion-toggle\"\n [disabled]=\"!isRowExpandable(row, i) || !isExpansionIconTriggerEnabled()\"\n [attr.aria-expanded]=\"isRowExpanded(row, i) ? 'true' : 'false'\"\n [attr.aria-controls]=\"getRowExpansionDetailId(row, i)\"\n [attr.aria-label]=\"getRowExpansionToggleAriaLabel(row, i)\"\n (click)=\"onExpansionToggleFromIcon(row, i, $event)\"\n (keydown)=\"onExpansionToggleKeydown($event, row, i)\"\n >\n <mat-icon [praxisIcon]=\"isRowExpanded(row, i)\n ? getExpansionExpandedIcon()\n : getExpansionCollapsedIcon()\"></mat-icon>\n </button>\n </td>\n </ng-container>\n }\n @for (column of visibleColumns; track column.field) {\n <ng-container\n [matColumnDef]=\"column.field\"\n [sticky]=\"column.sticky === true || column.sticky === 'start'\"\n [stickyEnd]=\"column.sticky === 'end'\"\n >\n <th\n mat-header-cell\n *matHeaderCellDef\n cdkDrag\n [cdkDragData]=\"column\"\n cdkDragLockAxis=\"x\"\n cdkDragPreviewClass=\"pfx-column-drag-preview\"\n (cdkDragStarted)=\"onColumnDragStarted(column)\"\n (cdkDragEnded)=\"onColumnDragEnded($event, column)\"\n [cdkDragDisabled]=\"!isColumnDraggingEnabled() || !isColumnDraggable(column) || isColumnResizeActive()\"\n [class.praxis-header-draggable]=\"isColumnDraggingEnabled() && isColumnDraggable(column)\"\n [class.praxis-header-resizable]=\"isColumnResizable(column)\"\n [class.praxis-header-resizing]=\"isColumnResizeActive(column)\"\n [class.praxis-header-align-left]=\"column.align === 'left'\"\n [class.praxis-header-align-center]=\"column.align === 'center'\"\n [class.praxis-header-align-right]=\"column.align === 'right'\"\n [style.text-align]=\"getColumnTextAlignStyle(column)\"\n [style.width]=\"getColumnWidthStyle(column)\"\n [attr.style]=\"getColumnHeaderAttrStyle(column)\"\n [ngStyle]=\"getColumnHeaderNgStyle(column)\"\n >\n <span\n class=\"praxis-header-sort-trigger\"\n [mat-sort-header]=\"column.field\"\n [disabled]=\"!getSortingEnabled() || column.sortable === false || isColumnResizeActive()\"\n (keydown)=\"onColumnHeaderReorderKeydown($event, column)\"\n >\n <span class=\"praxis-header-label\" data-testid=\"column-header-label\">\n <span class=\"praxis-header-label-text\">{{ column.header }}</span>\n </span>\n </span>\n <ng-template cdkDragPreview [matchSize]=\"true\">\n <div\n class=\"pfx-column-drag-preview pfx-column-drag-preview-custom\"\n [class.praxis-header-align-left]=\"column.align === 'left'\"\n [class.praxis-header-align-center]=\"column.align === 'center'\"\n [class.praxis-header-align-right]=\"column.align === 'right'\"\n [style.text-align]=\"getColumnTextAlignStyle(column)\"\n >\n <span class=\"praxis-header-label\">\n <span class=\"praxis-header-label-text\">{{ column.header }}</span>\n </span>\n </div>\n </ng-template>\n @if (isColumnResizable(column)) {\n <span\n class=\"praxis-column-resize-handle\"\n role=\"separator\"\n aria-orientation=\"vertical\"\n tabindex=\"0\"\n [attr.aria-label]=\"getColumnResizeHandleAriaLabel(column)\"\n [attr.aria-valuemin]=\"getColumnResizeMinWidthAriaValue(column)\"\n [attr.aria-valuemax]=\"getColumnResizeMaxWidthAriaValue(column)\"\n [attr.aria-valuenow]=\"getColumnResizeCurrentWidthAriaValue(column)\"\n [attr.title]=\"getColumnResizeHandleTooltip(column)\"\n (pointerdown)=\"onColumnResizePointerDown($event, column)\"\n (keydown)=\"onColumnResizeHandleKeydown($event, column)\"\n (click)=\"onColumnResizeHandleClick($event)\"\n ></span>\n }\n </th>\n <td\n mat-cell\n *matCellDef=\"let element\"\n [style.text-align]=\"getColumnTextAlignStyle(column)\"\n [style.width]=\"getColumnWidthStyle(column)\"\n [attr.style]=\"getColumnCellAttrStyle(column)\"\n [ngClass]=\"getCellClasses(element, column)\"\n [ngStyle]=\"getCellNgStyle(element, column)\"\n [matTooltip]=\"getCellTooltip(element, column) || ''\"\n [matTooltipPosition]=\"getCellTooltipPosition(element, column)\"\n [matTooltipDisabled]=\"!getCellTooltip(element, column)\"\n [attr.title]=\"getCellTooltip(element, column) || null\"\n >\n <div\n class=\"pfx-cell-content\"\n [ngClass]=\"getCellContentClasses(element, column)\"\n [ngStyle]=\"getCellContentNgStyle(element, column)\"\n >\n @switch (getEffectiveRendererType(element, column)) {\n <!-- Icon renderer -->\n @case ('icon') {\n <span\n class=\"pfx-icon-renderer\"\n [style.color]=\"getIconColor(element, column) || null\"\n [ngStyle]=\"getIconStyle(element, column)\"\n [attr.aria-label]=\"getIconAriaLabel(element, column) || null\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-icon-renderer__content\"\n [nodes]=\"getIconRichContentNodes(element, column)\"\n ></praxis-rich-content>\n </span>\n }\n <!-- Image renderer -->\n @case ('image') {\n <span class=\"pfx-cell-image\">\n <praxis-rich-content\n rootClassName=\"pfx-cell-image__content\"\n [nodes]=\"getImageRichContentNodes(element, column)\"\n ></praxis-rich-content>\n </span>\n }\n <!-- Badge renderer -->\n @case ('badge') {\n @if (shouldRenderBadge(element, column)) {\n <span class=\"pfx-badge\" [ngClass]=\"getBadgeClasses(element, column)\">\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-badge__content\"\n [nodes]=\"getBadgeRichContentNodes(element, column)\"\n ></praxis-rich-content>\n </span>\n }\n }\n <!-- Link renderer -->\n @case ('link') {\n <a\n class=\"pfx-link\"\n [attr.href]=\"getLinkHref(element, column) || null\"\n [attr.target]=\"getLinkTarget(element, column) || null\"\n [attr.rel]=\"getLinkRel(element, column) || null\"\n (click)=\"$event.stopPropagation()\"\n ><praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-link__content\"\n [nodes]=\"getLinkRichContentNodes(element, column)\"\n ></praxis-rich-content></a\n >\n }\n <!-- Button renderer -->\n @case ('button') {\n @switch (getButtonVariant(element, column)) {\n @case ('outlined') {\n <button\n mat-stroked-button\n [color]=\"getButtonColor(element, column) || null\"\n [disabled]=\"isButtonDisabled(element, column)\"\n [attr.aria-label]=\"getButtonAriaLabel(element, column) || getButtonLabel(element, column)\"\n (click)=\"onButtonClick(element, column, $event)\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-button-renderer__content\"\n [nodes]=\"getButtonRichContentNodes(element, column)\"\n ></praxis-rich-content>\n </button>\n }\n @case ('text') {\n <button\n mat-button\n [color]=\"getButtonColor(element, column) || null\"\n [disabled]=\"isButtonDisabled(element, column)\"\n [attr.aria-label]=\"getButtonAriaLabel(element, column) || getButtonLabel(element, column)\"\n (click)=\"onButtonClick(element, column, $event)\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-button-renderer__content\"\n [nodes]=\"getButtonRichContentNodes(element, column)\"\n ></praxis-rich-content>\n </button>\n }\n @default {\n <button\n mat-flat-button\n [color]=\"getButtonColor(element, column) || null\"\n [disabled]=\"isButtonDisabled(element, column)\"\n [attr.aria-label]=\"getButtonAriaLabel(element, column) || getButtonLabel(element, column)\"\n (click)=\"onButtonClick(element, column, $event)\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-button-renderer__content\"\n [nodes]=\"getButtonRichContentNodes(element, column)\"\n ></praxis-rich-content>\n </button>\n }\n }\n }\n <!-- Chip renderer -->\n @case ('chip') {\n @if (shouldRenderChip(element, column)) {\n <span class=\"pfx-chip\" [ngClass]=\"getChipClasses(element, column)\">\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-chip__content\"\n [nodes]=\"getChipRichContentNodes(element, column)\"\n ></praxis-rich-content>\n </span>\n }\n }\n <!-- Progress renderer -->\n @case ('progress') {\n <div class=\"pfx-progress\">\n <praxis-rich-content\n rootClassName=\"pfx-progress__content\"\n [context]=\"getProgressRichContentContext(element, column)\"\n [nodes]=\"getProgressRichContentNodes(element, column)\"\n ></praxis-rich-content>\n </div>\n }\n <!-- Micro visualization renderer -->\n @case ('microVisualization') {\n <span class=\"pfx-micro-viz-cell\" [innerHTML]=\"getMicroVisualizationHtml(element, column)\"></span>\n }\n <!-- Avatar renderer -->\n @case ('avatar') {\n <span class=\"pfx-avatar-renderer\"\n [ngStyle]=\"getAvatarStyle(element, column)\"\n [class.shape-rounded]=\"getAvatarShape(element, column) === 'rounded'\"\n [class.shape-circle]=\"getAvatarShape(element, column) === 'circle'\">\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-avatar-renderer__content\"\n [nodes]=\"getAvatarRichContentNodes(element, column)\"\n ></praxis-rich-content>\n </span>\n }\n <!-- Toggle renderer -->\n @case ('toggle') {\n <mat-slide-toggle\n [checked]=\"getToggleState(element, column)\"\n [disabled]=\"isToggleDisabled(element, column)\"\n [attr.aria-label]=\"getToggleAriaLabel(element, column) || 'Alternar'\"\n (change)=\"onToggleChange(element, column, $event)\"\n (click)=\"$event.stopPropagation()\"\n ></mat-slide-toggle>\n }\n <!-- Menu renderer -->\n @case ('menu') {\n <button mat-icon-button [matMenuTriggerFor]=\"menuRef\" (click)=\"$event.stopPropagation()\" [attr.aria-label]=\"getMenuAriaLabel(element, column) || 'Menu'\">\n <praxis-rich-content rootClassName=\"pfx-menu-trigger__content\" [nodes]=\"getMenuTriggerRichContentNodes()\"></praxis-rich-content>\n </button>\n <mat-menu #menuRef=\"matMenu\">\n @for (it of getMenuItems(element, column); track it.id) {\n <button mat-menu-item (click)=\"onMenuItemClick(it, element, $event)\" [disabled]=\"!it.__visible\" >\n <praxis-rich-content\n rootClassName=\"pfx-menu-item__content\"\n [nodes]=\"getMenuItemRichContentNodes(it)\"\n ></praxis-rich-content>\n </button>\n }\n </mat-menu>\n }\n <!-- Rating renderer -->\n @case ('rating') {\n <praxis-table-rating\n class=\"pfx-rating-cell\"\n [itemsCount]=\"getRatingMax(element, column)\"\n [value]=\"getRatingValue(element, column)\"\n [size]=\"getRatingSize(element, column)\"\n [ratingColor]=\"getRatingColor(element, column)\"\n [outlineColor]=\"getRatingOutlineColor(element, column)\"\n [ariaLabel]=\"getRatingAriaLabel(element, column) || column.header\">\n </praxis-table-rating>\n }\n <!-- HTML renderer (sanitizado) -->\n @case ('html') {\n <span [innerHTML]=\"getSafeHtml(element, column)\"></span>\n }\n <!-- Compose renderer -->\n @case ('compose') {\n <span class=\"pfx-cell-compose\" [ngClass]=\"getComposeClasses(element, column)\" [ngStyle]=\"getComposeGapStyle(element, column)\">\n @for (it of getComposeItems(element, column); track trackComposeItem($index, it)) {\n @switch (getItemEffectiveType(element, column, it)) {\n <!-- Reuse helpers by projecting item as faux column -->\n @case ('icon') {\n <span class=\"pfx-icon-renderer\" [style.color]=\"getIconColor(element, asItemColumn(column, it)) || null\" [ngStyle]=\"getIconStyle(element, asItemColumn(column, it))\" [attr.aria-label]=\"getIconAriaLabel(element, asItemColumn(column, it)) || null\"><praxis-rich-content [layout]=\"'inline'\" rootClassName=\"pfx-icon-renderer__content\" [nodes]=\"getIconRichContentNodes(element, asItemColumn(column, it))\"></praxis-rich-content></span>\n }\n @case ('image') {\n <span class=\"pfx-cell-image\"><praxis-rich-content rootClassName=\"pfx-cell-image__content\" [nodes]=\"getImageRichContentNodes(element, asItemColumn(column, it))\"></praxis-rich-content></span>\n }\n @case ('badge') {\n @if (shouldRenderBadge(element, asItemColumn(column, it))) {\n <span class=\"pfx-badge\" [ngClass]=\"getBadgeClasses(element, asItemColumn(column, it))\"><praxis-rich-content [layout]=\"'inline'\" rootClassName=\"pfx-badge__content\" [nodes]=\"getBadgeRichContentNodes(element, asItemColumn(column, it))\"></praxis-rich-content></span>\n }\n }\n @case ('link') {\n <a class=\"pfx-link\" [attr.href]=\"getLinkHref(element, asItemColumn(column, it)) || null\" [attr.target]=\"getLinkTarget(element, asItemColumn(column, it)) || null\" [attr.rel]=\"getLinkRel(element, asItemColumn(column, it)) || null\" (click)=\"$event.stopPropagation()\"><praxis-rich-content [layout]=\"'inline'\" rootClassName=\"pfx-link__content\" [nodes]=\"getLinkRichContentNodes(element, asItemColumn(column, it))\"></praxis-rich-content></a>\n }\n @case ('button') {\n @switch (getButtonVariant(element, asItemColumn(column, it))) {\n @case ('outlined') {\n <button mat-stroked-button [color]=\"getButtonColor(element, asItemColumn(column, it)) || null\" [disabled]=\"isButtonDisabled(element, asItemColumn(column, it))\" [attr.aria-label]=\"getButtonAriaLabel(element, asItemColumn(column, it)) || getButtonLabel(element, asItemColumn(column, it))\" (click)=\"onButtonClick(element, asItemColumn(column, it), $event)\"><praxis-rich-content [layout]=\"'inline'\" rootClassName=\"pfx-button-renderer__content\" [nodes]=\"getButtonRichContentNodes(element, asItemColumn(column, it))\"></praxis-rich-content></button>\n }\n @case ('text') {\n <button mat-button [color]=\"getButtonColor(element, asItemColumn(column, it)) || null\" [disabled]=\"isButtonDisabled(element, asItemColumn(column, it))\" [attr.aria-label]=\"getButtonAriaLabel(element, asItemColumn(column, it)) || getButtonLabel(element, asItemColumn(column, it))\" (click)=\"onButtonClick(element, asItemColumn(column, it), $event)\"><praxis-rich-content [layout]=\"'inline'\" rootClassName=\"pfx-button-renderer__content\" [nodes]=\"getButtonRichContentNodes(element, asItemColumn(column, it))\"></praxis-rich-content></button>\n }\n @default {\n <button mat-flat-button [color]=\"getButtonColor(element, asItemColumn(column, it)) || null\" [disabled]=\"isButtonDisabled(element, asItemColumn(column, it))\" [attr.aria-label]=\"getButtonAriaLabel(element, asItemColumn(column, it)) || getButtonLabel(element, asItemColumn(column, it))\" (click)=\"onButtonClick(element, asItemColumn(column, it), $event)\"><praxis-rich-content [layout]=\"'inline'\" rootClassName=\"pfx-button-renderer__content\" [nodes]=\"getButtonRichContentNodes(element, asItemColumn(column, it))\"></praxis-rich-content></button>\n }\n }\n }\n @case ('chip') {\n @if (shouldRenderChip(element, asItemColumn(column, it))) {\n <span class=\"pfx-chip\" [ngClass]=\"getChipClasses(element, asItemColumn(column, it))\"><praxis-rich-content [layout]=\"'inline'\" rootClassName=\"pfx-chip__content\" [nodes]=\"getChipRichContentNodes(element, asItemColumn(column, it))\"></praxis-rich-content></span>\n }\n }\n @case ('progress') {\n <div class=\"pfx-progress\">\n <praxis-rich-content\n rootClassName=\"pfx-progress__content\"\n [context]=\"getProgressRichContentContext(element, asItemColumn(column, it))\"\n [nodes]=\"getProgressRichContentNodes(element, asItemColumn(column, it))\"\n ></praxis-rich-content>\n </div>\n }\n @case ('microVisualization') {\n <span class=\"pfx-micro-viz-cell\" [innerHTML]=\"getMicroVisualizationHtml(element, asItemColumn(column, it))\"></span>\n }\n @case ('avatar') {\n <span class=\"pfx-avatar-renderer\" [ngStyle]=\"getAvatarStyle(element, asItemColumn(column, it))\" [class.shape-rounded]=\"getAvatarShape(element, asItemColumn(column, it)) === 'rounded'\" [class.shape-circle]=\"getAvatarShape(element, asItemColumn(column, it)) === 'circle'\"><praxis-rich-content rootClassName=\"pfx-avatar-renderer__content\" [nodes]=\"getAvatarRichContentNodes(element, asItemColumn(column, it))\"></praxis-rich-content></span>\n }\n @case ('toggle') {\n <mat-slide-toggle [checked]=\"getToggleState(element, asItemColumn(column, it))\" [disabled]=\"isToggleDisabled(element, asItemColumn(column, it))\" [attr.aria-label]=\"getToggleAriaLabel(element, asItemColumn(column, it)) || 'Alternar'\" (change)=\"onToggleChange(element, asItemColumn(column, it), $event)\" (click)=\"$event.stopPropagation()\"></mat-slide-toggle>\n }\n @case ('menu') {\n <button mat-icon-button [matMenuTriggerFor]=\"menuRef\" (click)=\"$event.stopPropagation()\" [attr.aria-label]=\"getMenuAriaLabel(element, asItemColumn(column, it)) || 'Menu'\"><praxis-rich-content rootClassName=\"pfx-menu-trigger__content\" [nodes]=\"getMenuTriggerRichContentNodes()\"></praxis-rich-content></button>\n <mat-menu #menuRef=\"matMenu\">\n @for (mi of getMenuItems(element, asItemColumn(column, it)); track mi.id) {\n <button mat-menu-item (click)=\"onMenuItemClick(mi, element, $event)\" [disabled]=\"!mi.__visible\">\n <praxis-rich-content\n rootClassName=\"pfx-menu-item__content\"\n [nodes]=\"getMenuItemRichContentNodes(mi)\"\n ></praxis-rich-content>\n </button>\n }\n </mat-menu>\n }\n @case ('rating') {\n <praxis-table-rating\n class=\"pfx-rating-cell\"\n [itemsCount]=\"getRatingMax(element, asItemColumn(column, it))\"\n [value]=\"getRatingValue(element, asItemColumn(column, it))\"\n [size]=\"getRatingSize(element, asItemColumn(column, it))\"\n [ratingColor]=\"getRatingColor(element, asItemColumn(column, it))\"\n [outlineColor]=\"getRatingOutlineColor(element, asItemColumn(column, it))\"\n [ariaLabel]=\"getRatingAriaLabel(element, asItemColumn(column, it)) || column.header\">\n </praxis-table-rating>\n }\n @case ('html') {\n <span [innerHTML]=\"getSafeHtml(element, asItemColumn(column, it))\"></span>\n }\n <!-- Value item: render base cell text alongside visuals -->\n @case ('value') {\n <span class=\"pfx-cell-value\">{{ getComposeItemValue(element, column, it) }}</span>\n }\n }\n }\n </span>\n }\n <!-- Default text rendering -->\n @default {\n {{ getCellValue(element, column) }}\n }\n }\n </div>\n </td>\n </ng-container>\n }\n @if (config.actions?.row?.enabled) {\n <ng-container matColumnDef=\"_actions\" [sticky]=\"config.actions?.row?.sticky === true || config.actions?.row?.sticky === 'start'\" [stickyEnd]=\"config.actions?.row?.sticky === 'end'\">\n <th mat-header-cell *matHeaderCellDef #actionsHeaderCell [style.width]=\"getRowActionsWidthStyle()\" class=\"praxis-actions-header\" [class.align-start]=\"getActionsHeaderAlign() === 'start'\" [class.align-center]=\"getActionsHeaderAlign() === 'center'\" [class.align-end]=\"getActionsHeaderAlign() === 'end'\">\n <div class=\"praxis-actions-header__content\" [matTooltip]=\"getActionsHeaderTooltip() || ''\" [matTooltipDisabled]=\"!getActionsHeaderTooltip()\">\n <praxis-rich-content\n rootClassName=\"praxis-actions-header__nodes\"\n [nodes]=\"getActionsHeaderRichContentNodes()\"\n ></praxis-rich-content>\n </div>\n </th>\n <td\n mat-cell\n *matCellDef=\"let row\"\n class=\"praxis-actions-cell\"\n [class.dense]=\"dense\"\n [style.width]=\"getRowActionsWidthStyle()\"\n >\n <div\n class=\"praxis-actions-cell__content\"\n [class.praxis-actions-cell__content--discovering]=\"isRowDiscoveryPending(row)\"\n [attr.aria-busy]=\"isRowDiscoveryPending(row) ? 'true' : null\"\n >\n <!-- A\u00C3\u00A7\u00C3\u00B5es inline -->\n <!-- Inline actions: icons mode -->\n @if (config.actions?.row?.display === 'icons' || !config.actions?.row?.display) {\n @for (a of getInlineRowActions(row); track trackAction($index, a)) {\n <span\n class=\"praxis-row-action-anchor\"\n [class.praxis-row-action-anchor--workflow]=\"isWorkflowRowAction(a)\"\n [class.praxis-row-action-anchor--blocked]=\"isBlockedWorkflowRowAction(a, row)\"\n [matTooltip]=\"getActionTooltip(a, row)\"\n [matTooltipDisabled]=\"!getActionTooltip(a, row)\"\n matTooltipPosition=\"above\"\n matTooltipClass=\"praxis-tooltip\"\n >\n <button\n mat-icon-button\n class=\"praxis-icon-btn\"\n [class.praxis-icon-btn--workflow]=\"isWorkflowRowAction(a)\"\n [class.praxis-icon-btn--blocked]=\"isBlockedWorkflowRowAction(a, row)\"\n [disabled]=\"isActionDisabled(a, row)\"\n (click)=\"onRowAction(getActionId(a), row, $event, getRowActionRuntimeOptions(a, row))\"\n [attr.aria-label]=\"a.label || getActionId(a)\"\n [color]=\"a.color || null\"\n >\n <praxis-rich-content\n layout=\"inline\"\n rootClassName=\"praxis-row-action__content\"\n [nodes]=\"getRowActionIconRichContentNodes(a)\"\n ></praxis-rich-content>\n </button>\n </span>\n }\n }\n\n <!-- Inline actions: buttons mode (show label + icon) -->\n @if (config.actions?.row?.display === 'buttons') {\n @for (a of getInlineRowActions(row); track trackAction($index, a)) {\n <span\n class=\"praxis-row-action-anchor\"\n [class.praxis-row-action-anchor--workflow]=\"isWorkflowRowAction(a)\"\n [class.praxis-row-action-anchor--blocked]=\"isBlockedWorkflowRowAction(a, row)\"\n [matTooltip]=\"getActionTooltip(a, row)\"\n [matTooltipDisabled]=\"!getActionTooltip(a, row)\"\n matTooltipPosition=\"above\"\n matTooltipClass=\"praxis-tooltip\"\n >\n <button\n mat-flat-button\n class=\"praxis-row-btn\"\n [class.praxis-row-btn--workflow]=\"isWorkflowRowAction(a)\"\n [class.praxis-row-btn--blocked]=\"isBlockedWorkflowRowAction(a, row)\"\n [disabled]=\"isActionDisabled(a, row)\"\n (click)=\"onRowAction(getActionId(a), row, $event, getRowActionRuntimeOptions(a, row))\"\n [attr.aria-label]=\"a.label || getActionId(a)\"\n [color]=\"a.color || null\"\n >\n <praxis-rich-content\n layout=\"inline\"\n rootClassName=\"praxis-row-action__content\"\n [nodes]=\"getRowActionRichContentNodes(a)\"\n ></praxis-rich-content>\n </button>\n </span>\n }\n }\n\n <!-- Menu de overflow -->\n @if (hasOverflowRowActions(row)) {\n <button\n mat-icon-button\n class=\"praxis-icon-btn praxis-more-btn\"\n [matMenuTriggerFor]=\"rowMoreMenu\"\n (menuOpened)=\"onRowOverflowMenuOpened(row)\"\n [color]=\"getRowMenuButtonColor() || null\"\n [attr.aria-label]=\"getRowMenuTooltip(row)\"\n [matTooltip]=\"getRowMenuTooltip(row)\"\n matTooltipPosition=\"above\"\n >\n <mat-icon [praxisIcon]=\"getRowMenuIcon()\"></mat-icon>\n </button>\n }\n <mat-menu #rowMoreMenu=\"matMenu\" xPosition=\"before\">\n @if (hasRowOverflowMenuLoadingState(row)) {\n <button mat-menu-item disabled>\n <mat-icon>hourglass_empty</mat-icon>\n <praxis-rich-content\n rootClassName=\"praxis-row-overflow-menu__label\"\n [nodes]=\"getTableChromeTextRichContentNodes(getRowOverflowMenuLoadingLabel(), 'praxis-row-overflow-menu__label-text')\"\n ></praxis-rich-content>\n </button>\n }\n @for (a of getOverflowRowActions(row); track trackAction($index, a)) {\n <button\n mat-menu-item\n (click)=\"onRowAction(getActionId(a), row, $event, getRowActionRuntimeOptions(a, row))\"\n [disabled]=\"isActionDisabled(a, row)\"\n >\n <mat-icon [color]=\"a.color || null\" [praxisIcon]=\"a.icon\"></mat-icon>\n <praxis-rich-content\n rootClassName=\"praxis-row-overflow-menu__label\"\n [nodes]=\"getTableChromeTextRichContentNodes(a.label || getActionId(a), 'praxis-row-overflow-menu__label-text')\"\n ></praxis-rich-content>\n </button>\n }\n @if (hasRowOverflowMenuEmptyState(row)) {\n <button mat-menu-item disabled>\n <mat-icon>info</mat-icon>\n <praxis-rich-content\n rootClassName=\"praxis-row-overflow-menu__label\"\n [nodes]=\"getTableChromeTextRichContentNodes(getRowOverflowMenuEmptyLabel(row), 'praxis-row-overflow-menu__label-text')\"\n ></praxis-rich-content>\n </button>\n }\n </mat-menu>\n </div>\n </td>\n </ng-container>\n }\n\n <tr\n mat-header-row\n *matHeaderRowDef=\"displayedColumns\"\n ></tr>\n @if (!isVirtualized()) {\n <tr\n mat-row\n *matRowDef=\"let row; let i = index; columns: displayedColumns\"\n [class.pfx-row-selected]=\"selection.isSelected(row)\"\n [class.pfx-row-click-selectable]=\"isRowClickSelectable()\"\n [class.pfx-row-expanded]=\"isRowExpansionRuntimeEnabled() && isRowExpanded(row, i)\"\n [attr.aria-selected]=\"config.behavior?.selection?.enabled ? (selection.isSelected(row) ? 'true' : 'false') : null\"\n [attr.aria-expanded]=\"isRowExpansionRuntimeEnabled() ? (isRowExpanded(row, i) ? 'true' : 'false') : null\"\n [ngClass]=\"getRowClasses(row)\"\n [ngStyle]=\"getRowNgStyle(row)\"\n [matTooltip]=\"getRowTooltip(row) || null\"\n [matTooltipDisabled]=\"!getRowTooltip(row)\"\n [matTooltipPosition]=\"getRowTooltipPosition(row)\"\n [matTooltipShowDelay]=\"getRowTooltipShowDelay(row)\"\n (click)=\"onRowClicked(row, i, $event)\"\n (dblclick)=\"onRowDoubleClicked(row, i)\"\n ></tr>\n @if (isRowExpansionRuntimeEnabled()) {\n <ng-container matColumnDef=\"_detail\">\n <td\n mat-cell\n *matCellDef=\"let row; let i = index\"\n class=\"pfx-expansion-detail-cell\"\n [attr.colspan]=\"displayedColumns.length\"\n >\n <section\n class=\"pfx-expansion-detail-panel\"\n [ngClass]=\"getExpansionMotionPresetClass()\"\n [ngStyle]=\"getExpansionMotionStyle()\"\n [attr.id]=\"getRowExpansionDetailId(row, i)\"\n role=\"region\"\n [attr.aria-label]=\"getRowExpansionRegionAriaLabel(row, i)\"\n [attr.aria-busy]=\"getExpansionDetailViewState(row, i).status === 'loading' ? 'true' : 'false'\"\n >\n @let detailState = getExpansionDetailViewState(row, i);\n @if (detailState.status === 'loading') {\n <div class=\"pfx-expansion-detail-message\" role=\"status\" aria-live=\"polite\">\n <praxis-rich-content\n rootClassName=\"pfx-expansion-detail-message__content\"\n [nodes]=\"getExpansionDetailTextRichContentNodes('Carregando detail schema...', 'pfx-expansion-detail-message__text')\"\n [context]=\"getExpansionDetailRichContentContext(row, i)\"\n ></praxis-rich-content>\n </div>\n } @else if (detailState.status !== 'ready') {\n <div\n class=\"pfx-expansion-detail-message pfx-expansion-detail-message--error\"\n role=\"alert\"\n aria-live=\"assertive\"\n aria-atomic=\"true\"\n >\n <praxis-rich-content\n rootClassName=\"pfx-expansion-detail-message__content\"\n [nodes]=\"getExpansionDetailTextRichContentNodes(detailState.message || 'Detail indispon\u00EDvel para esta linha.', 'pfx-expansion-detail-message__text')\"\n [context]=\"getExpansionDetailRichContentContext(row, i)\"\n ></praxis-rich-content>\n </div>\n } @else {\n @if (getExpansionDetailLayout(detailState.schema) === 'tabs') {\n @let detailTabs = getExpansionDetailTabs(detailState.schema);\n @if (detailTabs.length) {\n <div class=\"pfx-expansion-detail-tabs\" role=\"tablist\" aria-label=\"Se\u00C3\u00A7\u00C3\u00B5es do detail\">\n @for (tab of detailTabs; track $index; let tabIndex = $index) {\n <button\n type=\"button\"\n class=\"pfx-expansion-detail-tab-btn\"\n role=\"tab\"\n [attr.id]=\"getExpansionDetailTabId(row, i, tab, tabIndex)\"\n [attr.aria-controls]=\"getExpansionDetailPanelId(row, i, tab, tabIndex)\"\n [attr.aria-selected]=\"isExpansionDetailTabActive(row, i, tab, tabIndex, detailTabs) ? 'true' : 'false'\"\n [attr.tabindex]=\"isExpansionDetailTabActive(row, i, tab, tabIndex, detailTabs) ? '0' : '-1'\"\n [class.is-active]=\"isExpansionDetailTabActive(row, i, tab, tabIndex, detailTabs)\"\n (click)=\"onExpansionDetailTabSelect(row, i, tab, tabIndex, $event)\"\n (keydown)=\"onExpansionDetailTabKeydown($event, row, i, tabIndex, detailTabs)\"\n >\n <praxis-rich-content\n rootClassName=\"pfx-expansion-detail-tab-btn__content\"\n [nodes]=\"getExpansionDetailTabButtonRichContentNodes(tab)\"\n [context]=\"getExpansionDetailRichContentContext(row, i)\"\n ></praxis-rich-content>\n </button>\n }\n </div>\n @for (tab of detailTabs; track $index; let tabIndex = $index) {\n @if (isExpansionDetailTabActive(row, i, tab, tabIndex, detailTabs)) {\n <div\n class=\"pfx-expansion-detail-tab-panel\"\n role=\"tabpanel\"\n [attr.id]=\"getExpansionDetailPanelId(row, i, tab, tabIndex)\"\n [attr.aria-labelledby]=\"getExpansionDetailTabId(row, i, tab, tabIndex)\"\n >\n @if (getExpansionDetailTabRichContentNodes(tab, row, i); as richNodes) {\n <praxis-rich-content\n class=\"pfx-expansion-node-host pfx-expansion-node-host--tab\"\n [nodes]=\"richNodes\"\n [context]=\"getExpansionDetailRichContentContext(row, i)\"\n ></praxis-rich-content>\n } @else {\n @for (childNode of getExpansionDetailNodeChildren(tab); track $index) {\n <ng-container\n *ngTemplateOutlet=\"\n expansionDetailNodeTemplate;\n context: { $implicit: childNode, row: row, index: i }\n \"\n ></ng-container>\n }\n }\n </div>\n }\n }\n } @else {\n <div class=\"pfx-expansion-detail-message\">\n <praxis-rich-content\n rootClassName=\"pfx-expansion-detail-message__content\"\n [nodes]=\"getExpansionDetailTextRichContentNodes('Schema em layout tabs sem abas v\u00E1lidas.', 'pfx-expansion-detail-message__text')\"\n [context]=\"getExpansionDetailRichContentContext(row, i)\"\n ></praxis-rich-content>\n </div>\n }\n } @else {\n <div class=\"pfx-expansion-detail-stack\">\n @for (node of getExpansionDetailItems(detailState.schema); track $index) {\n <ng-container\n *ngTemplateOutlet=\"\n expansionDetailNodeTemplate;\n context: { $implicit: node, row: row, index: i }\n \"\n ></ng-container>\n }\n </div>\n }\n }\n\n <ng-template #expansionDetailNodeTemplate let-node let-row=\"row\" let-index=\"index\">\n @if (getExpansionDetailRichContentNodes(node, row, index); as richNodes) {\n <praxis-rich-content\n class=\"pfx-expansion-node-host\"\n [nodes]=\"richNodes\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n } @else {\n @switch (getExpansionDetailNodeType(node)) {\n @case ('list') {\n <section class=\"pfx-expansion-node pfx-expansion-node-list\">\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-list__title\"\n [nodes]=\"getExpansionDetailTextRichContentNodes(getExpansionDetailNodeTitle(node, 'Lista'), 'pfx-expansion-node-list__title-text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n @let listItems = getExpansionDetailListItems(row, node);\n @let listEntries = getExpansionDetailListEntries(row, node);\n @if (listItems.length) {\n <ul>\n @for (entry of listEntries; track $index) {\n <li>\n @if (getExpansionDetailListItemRichContentNodes(entry); as richNodes) {\n <praxis-rich-content\n class=\"pfx-expansion-node-list__item-host\"\n [nodes]=\"richNodes\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n } @else {\n {{ formatExpansionDetailListEntry(entry) }}\n }\n </li>\n }\n </ul>\n } @else {\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-placeholder\"\n [nodes]=\"getExpansionDetailTextRichContentNodes('Sem itens.', 'pfx-expansion-node-placeholder__text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n }\n </section>\n }\n @case ('detailList') {\n <section class=\"pfx-expansion-node pfx-expansion-node-rich-list\">\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-rich-list__title\"\n [nodes]=\"getExpansionDetailTextRichContentNodes(getExpansionDetailNodeTitle(node, 'Cole\u00E7\u00E3o rica'), 'pfx-expansion-node-rich-list__title-text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n @let richListEntries = getExpansionDetailRichListEntries(row, node);\n @if (richListEntries.length) {\n <div class=\"pfx-expansion-node-rich-list__items\">\n @for (entry of richListEntries; track $index) {\n <article [class]=\"getExpansionDetailRichListItemClassName(node)\">\n <praxis-rich-content\n class=\"pfx-expansion-node-rich-list__item-host\"\n [nodes]=\"getExpansionDetailRichListItemNodes(node)\"\n [context]=\"getExpansionDetailRichListItemContext(row, index, node, entry, $index)\"\n ></praxis-rich-content>\n @let itemActions = getExpansionDetailRichListItemActions(node, row, index, entry, $index);\n @if (itemActions.length) {\n <div class=\"pfx-expansion-node-rich-list__item-actions\">\n @for (action of itemActions; track action.actionId) {\n <button\n type=\"button\"\n mat-stroked-button\n class=\"pfx-expansion-node-rich-list__item-action-btn\"\n [disabled]=\"isExpansionDetailRichListItemActionDisabled(action, row, index, node, entry, $index)\"\n (click)=\"onExpansionDetailRichListItemAction(action, row, index, node, entry, $index, $event)\"\n >\n <praxis-rich-content\n class=\"pfx-expansion-node-rich-list__item-action-host\"\n [nodes]=\"getExpansionDetailRichListItemActionNodes(action)\"\n [context]=\"getExpansionDetailRichListItemContext(row, index, node, entry, $index)\"\n ></praxis-rich-content>\n </button>\n }\n </div>\n }\n </article>\n }\n </div>\n } @else {\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-placeholder\"\n [nodes]=\"getExpansionDetailTextRichContentNodes(getExpansionDetailRichListEmptyText(node), 'pfx-expansion-node-placeholder__text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n }\n </section>\n }\n @case ('card') {\n <section class=\"pfx-expansion-node pfx-expansion-node-card\">\n <header class=\"pfx-expansion-node-card__header\">\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-card__title\"\n [nodes]=\"getExpansionDetailTextRichContentNodes(getExpansionDetailNodeTitle(node, 'Card'), 'pfx-expansion-node-card__title-text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n @if (node?.subtitle) {\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-card__subtitle\"\n [nodes]=\"getExpansionDetailTextRichContentNodes(node.subtitle, 'pfx-expansion-node-card__subtitle-text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n }\n </header>\n @if (getExpansionDetailNodeChildren(node).length) {\n <div class=\"pfx-expansion-node-card__content\">\n @for (childNode of getExpansionDetailNodeChildren(node); track $index) {\n <ng-container\n *ngTemplateOutlet=\"\n expansionDetailNodeTemplate;\n context: { $implicit: childNode, row: row, index: index }\n \"\n ></ng-container>\n }\n </div>\n }\n </section>\n }\n @case ('cardGrid') {\n <section class=\"pfx-expansion-node pfx-expansion-node-card-grid\">\n @if (getExpansionDetailCardGridHeaderNodes(node); as cardGridHeaderNodes) {\n @if (cardGridHeaderNodes.length) {\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-card-grid__header\"\n [nodes]=\"cardGridHeaderNodes\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n }\n }\n @let gridCards = getExpansionDetailCardGridCards(node);\n @if (gridCards.length) {\n <div\n class=\"pfx-expansion-node-card-grid__cards\"\n [ngStyle]=\"getExpansionDetailCardGridStyles(node)\"\n >\n @for (card of gridCards; track $index) {\n <praxis-rich-content\n class=\"pfx-expansion-node-card-grid__card-host\"\n [nodes]=\"getExpansionDetailCardGridCardNodes(card)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n }\n </div>\n } @else {\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-placeholder\"\n [nodes]=\"getExpansionDetailTextRichContentNodes('Sem itens.', 'pfx-expansion-node-placeholder__text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n }\n </section>\n }\n @case ('richText') {\n <div\n class=\"pfx-expansion-node pfx-expansion-node-richtext\"\n [innerHTML]=\"getExpansionDetailRichText(node)\"\n ></div>\n }\n @case ('formRef') {\n <section class=\"pfx-expansion-node pfx-expansion-node-embed\">\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-embed__header\"\n [nodes]=\"getExpansionDetailEmbedHeaderNodes(node)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-embed__meta\"\n [nodes]=\"getExpansionDetailEmbedMetaNodes(node)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-embed__empty\"\n [nodes]=\"getExpansionDetailTextRichContentNodes(getExpansionDetailEmbedEmptyText(node), 'pfx-expansion-node-embed__empty-text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n @if (getExpansionDetailEmbedAction(node, row, index); as embedAction) {\n <button\n type=\"button\"\n mat-stroked-button\n class=\"pfx-expansion-node-embed__action-btn\"\n [disabled]=\"isExpansionDetailEmbedActionDisabled(embedAction, row, index)\"\n (click)=\"onExpansionDetailEmbedAction(embedAction, row, index, $event)\"\n >\n <praxis-rich-content\n class=\"pfx-expansion-node-embed__action-host\"\n [nodes]=\"getExpansionDetailEmbedActionNodes(embedAction)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n </button>\n }\n </section>\n }\n @case ('tableRef') {\n <section class=\"pfx-expansion-node pfx-expansion-node-embed\">\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-embed__header\"\n [nodes]=\"getExpansionDetailEmbedHeaderNodes(node)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-embed__meta\"\n [nodes]=\"getExpansionDetailEmbedMetaNodes(node)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-embed__empty\"\n [nodes]=\"getExpansionDetailTextRichContentNodes(getExpansionDetailEmbedEmptyText(node), 'pfx-expansion-node-embed__empty-text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n @if (getExpansionDetailEmbedAction(node, row, index); as embedAction) {\n <button\n type=\"button\"\n mat-stroked-button\n class=\"pfx-expansion-node-embed__action-btn\"\n [disabled]=\"isExpansionDetailEmbedActionDisabled(embedAction, row, index)\"\n (click)=\"onExpansionDetailEmbedAction(embedAction, row, index, $event)\"\n >\n <praxis-rich-content\n class=\"pfx-expansion-node-embed__action-host\"\n [nodes]=\"getExpansionDetailEmbedActionNodes(embedAction)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n </button>\n }\n </section>\n }\n @case ('chartRef') {\n @if (getExpansionDetailInlineRendererView(node, row, index); as inlineRenderer) {\n <section class=\"pfx-expansion-node pfx-expansion-node-embed pfx-expansion-node-embed--inline pfx-expansion-node-embed--chart\">\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-embed__header\"\n [nodes]=\"getExpansionDetailEmbedHeaderNodes(node)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n <ng-container\n *ngComponentOutlet=\"inlineRenderer.component; inputs: inlineRenderer.inputs\"\n ></ng-container>\n @if (getExpansionDetailEmbedAction(node, row, index); as embedAction) {\n <button\n type=\"button\"\n mat-stroked-button\n class=\"pfx-expansion-node-embed__action-btn\"\n [disabled]=\"isExpansionDetailEmbedActionDisabled(embedAction, row, index)\"\n (click)=\"onExpansionDetailEmbedAction(embedAction, row, index, $event)\"\n >\n <praxis-rich-content\n class=\"pfx-expansion-node-embed__action-host\"\n [nodes]=\"getExpansionDetailEmbedActionNodes(embedAction)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n </button>\n }\n </section>\n } @else {\n <section class=\"pfx-expansion-node pfx-expansion-node-embed\">\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-embed__header\"\n [nodes]=\"getExpansionDetailEmbedHeaderNodes(node)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-embed__meta\"\n [nodes]=\"getExpansionDetailEmbedMetaNodes(node)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-embed__empty\"\n [nodes]=\"getExpansionDetailTextRichContentNodes(getExpansionDetailEmbedEmptyText(node), 'pfx-expansion-node-embed__empty-text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n @if (getExpansionDetailEmbedAction(node, row, index); as embedAction) {\n <button\n type=\"button\"\n mat-stroked-button\n class=\"pfx-expansion-node-embed__action-btn\"\n [disabled]=\"isExpansionDetailEmbedActionDisabled(embedAction, row, index)\"\n (click)=\"onExpansionDetailEmbedAction(embedAction, row, index, $event)\"\n >\n <praxis-rich-content\n class=\"pfx-expansion-node-embed__action-host\"\n [nodes]=\"getExpansionDetailEmbedActionNodes(embedAction)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n </button>\n }\n </section>\n }\n }\n @case ('templateRef') {\n <section class=\"pfx-expansion-node pfx-expansion-node-embed\">\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-embed__header\"\n [nodes]=\"getExpansionDetailEmbedHeaderNodes(node)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-embed__meta\"\n [nodes]=\"getExpansionDetailEmbedMetaNodes(node)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-embed__empty\"\n [nodes]=\"getExpansionDetailTextRichContentNodes(getExpansionDetailEmbedEmptyText(node), 'pfx-expansion-node-embed__empty-text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n @if (getExpansionDetailEmbedAction(node, row, index); as embedAction) {\n <button\n type=\"button\"\n mat-stroked-button\n class=\"pfx-expansion-node-embed__action-btn\"\n [disabled]=\"isExpansionDetailEmbedActionDisabled(embedAction, row, index)\"\n (click)=\"onExpansionDetailEmbedAction(embedAction, row, index, $event)\"\n >\n <praxis-rich-content\n class=\"pfx-expansion-node-embed__action-host\"\n [nodes]=\"getExpansionDetailEmbedActionNodes(embedAction)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n </button>\n }\n </section>\n }\n @case ('diagramEmbed') {\n <section class=\"pfx-expansion-node pfx-expansion-node-embed\">\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-embed__header\"\n [nodes]=\"getExpansionDetailEmbedHeaderNodes(node)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-embed__meta\"\n [nodes]=\"getExpansionDetailEmbedMetaNodes(node)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n @if (getExpansionDetailDiagramSource(row, node); as diagramSource) {\n <div class=\"pfx-expansion-node-embed__diagram\">\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-embed__diagram-label\"\n [nodes]=\"getExpansionDetailTextRichContentNodes(getExpansionDetailDiagramSourceLabel(), 'pfx-expansion-node-embed__diagram-label-text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n <pre class=\"pfx-expansion-node-embed__diagram-source\">{{ diagramSource }}</pre>\n </div>\n } @else {\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-embed__empty\"\n [nodes]=\"getExpansionDetailTextRichContentNodes(getExpansionDetailEmbedEmptyText(node), 'pfx-expansion-node-embed__empty-text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n }\n @if (getExpansionDetailEmbedAction(node, row, index); as embedAction) {\n <button\n type=\"button\"\n mat-stroked-button\n class=\"pfx-expansion-node-embed__action-btn\"\n [disabled]=\"isExpansionDetailEmbedActionDisabled(embedAction, row, index)\"\n (click)=\"onExpansionDetailEmbedAction(embedAction, row, index, $event)\"\n >\n <praxis-rich-content\n class=\"pfx-expansion-node-embed__action-host\"\n [nodes]=\"getExpansionDetailEmbedActionNodes(embedAction)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n </button>\n }\n </section>\n }\n @case ('action') {\n <div class=\"pfx-expansion-node pfx-expansion-node-action\">\n <button\n type=\"button\"\n mat-stroked-button\n [disabled]=\"isExpansionDetailActionDisabled(node)\"\n (click)=\"onExpansionDetailAction(node, row, $event)\"\n >\n <praxis-rich-content\n class=\"pfx-expansion-node-action__content\"\n [nodes]=\"getExpansionDetailActionRichContentNodes(node)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n </button>\n @if (getExpansionDetailActionStatusText(node); as actionStatusText) {\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-action__status\"\n [nodes]=\"getExpansionDetailTextRichContentNodes(actionStatusText, 'pfx-expansion-node-action__status-text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n }\n </div>\n }\n @case ('actionBar') {\n <section class=\"pfx-expansion-node pfx-expansion-node-action-bar\">\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-action-bar__title\"\n [nodes]=\"getExpansionDetailTextRichContentNodes(getExpansionDetailActionBarTitle(node), 'pfx-expansion-node-action-bar__title-text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n @let actionBarActions = getExpansionDetailActionBarActions(node, row, index);\n @if (actionBarActions.length) {\n <div class=\"pfx-expansion-node-action-bar__actions\">\n @for (action of actionBarActions; track action.actionId) {\n <button\n type=\"button\"\n mat-stroked-button\n class=\"pfx-expansion-node-action-bar__action-btn\"\n [disabled]=\"isExpansionDetailActionBarActionDisabled(action, row, index)\"\n (click)=\"onExpansionDetailActionBarAction(action, row, index, $event)\"\n >\n <praxis-rich-content\n class=\"pfx-expansion-node-action-bar__action-host\"\n [nodes]=\"getExpansionDetailActionBarActionNodes(action)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n </button>\n }\n </div>\n } @else {\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-placeholder\"\n [nodes]=\"getExpansionDetailTextRichContentNodes(getExpansionDetailActionBarEmptyText(node), 'pfx-expansion-node-placeholder__text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n }\n </section>\n }\n @case ('tab') {\n <div class=\"pfx-expansion-node pfx-expansion-node-placeholder\">\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-placeholder__content\"\n [nodes]=\"getExpansionDetailTextRichContentNodes('Node', 'pfx-expansion-node-placeholder__text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n <code>tab</code>\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-placeholder__content\"\n [nodes]=\"getExpansionDetailTextRichContentNodes('fora de contexto de tabs.', 'pfx-expansion-node-placeholder__text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n </div>\n }\n @default {\n <div class=\"pfx-expansion-node pfx-expansion-node-placeholder\">\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-placeholder__content\"\n [nodes]=\"getExpansionDetailTextRichContentNodes('Node n\u00E3o suportado:', 'pfx-expansion-node-placeholder__text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n <code>{{ getExpansionDetailNodeType(node) }}</code>\n </div>\n }\n }\n }\n </ng-template>\n </section>\n </td>\n </ng-container>\n <tr\n mat-row\n *matRowDef=\"let row; columns: expansionDetailRowColumns; when: isExpansionDetailRow\"\n class=\"pfx-expansion-detail-row\"\n ></tr>\n }\n }\n </table>\n }\n\n <!-- Virtual rows path (header preserved above) -->\n @if (shouldRenderDataSurface() && !schemaError && !dataError && isVirtualized()) {\n <cdk-virtual-scroll-viewport\n class=\"ptable-viewport\"\n [itemSize]=\"getVirtItemHeight()\"\n [minBufferPx]=\"getVirtBufferSize() * getVirtItemHeight()\"\n [maxBufferPx]=\"getVirtBufferSize() * getVirtItemHeight() * 2\"\n [style.minHeight]=\"getVirtMinHeightHostStyle()\"\n >\n <table\n class=\"mat-mdc-table\"\n [ngClass]=\"getTableElevationClassName()\"\n [class.table-stack-top]=\"hasTopToolbarStack()\"\n [style.width]=\"getVirtualTableWidthStyle()\"\n >\n <tbody>\n <tr class=\"mat-mdc-row\"\n *cdkVirtualFor=\"let row of dataSource.data; let i = index; trackBy: trackByRow\"\n [class.pfx-row-selected]=\"selection.isSelected(row)\"\n [class.pfx-row-click-selectable]=\"isRowClickSelectable()\"\n [attr.aria-selected]=\"config.behavior?.selection?.enabled ? (selection.isSelected(row) ? 'true' : 'false') : null\"\n [ngClass]=\"getRowClasses(row)\"\n [ngStyle]=\"getRowNgStyle(row)\"\n [matTooltip]=\"getRowTooltip(row) || null\"\n [matTooltipDisabled]=\"!getRowTooltip(row)\"\n [matTooltipPosition]=\"getRowTooltipPosition(row)\"\n [matTooltipShowDelay]=\"getRowTooltipShowDelay(row)\"\n (click)=\"onRowClicked(row, i, $event)\"\n (dblclick)=\"onRowDoubleClicked(row, i)\">\n <!-- Selection column -->\n @if (isSelectionColumnEnabled()) { <td class=\"mat-mdc-cell\">\n <mat-checkbox\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleRow(row)\"\n [checked]=\"selection.isSelected(row)\">\n </mat-checkbox>\n </td> }\n <!-- Data columns -->\n @for (column of visibleColumns; track column.field) {\n <td class=\"mat-mdc-cell\"\n [style.text-align]=\"getColumnTextAlignStyle(column)\"\n [style.width]=\"getColumnWidthStyle(column)\"\n [attr.style]=\"getColumnCellAttrStyle(column)\"\n [ngClass]=\"getCellClasses(row, column)\"\n [ngStyle]=\"getCellNgStyle(row, column)\"\n [matTooltip]=\"getCellTooltip(row, column) || ''\"\n [matTooltipPosition]=\"getCellTooltipPosition(row, column)\"\n [matTooltipDisabled]=\"!getCellTooltip(row, column)\"\n [attr.title]=\"getCellTooltip(row, column) || null\">\n <div\n class=\"pfx-cell-content\"\n [ngClass]=\"getCellContentClasses(row, column)\"\n [ngStyle]=\"getCellContentNgStyle(row, column)\"\n >\n @switch (getEffectiveRendererType(row, column)) {\n @case ('icon') {\n <span class=\"pfx-icon-renderer\"\n [style.color]=\"getIconColor(row, column) || null\"\n [ngStyle]=\"getIconStyle(row, column)\"\n [attr.aria-label]=\"getIconAriaLabel(row, column) || null\">\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-icon-renderer__content\"\n [nodes]=\"getIconRichContentNodes(row, column)\"\n ></praxis-rich-content>\n </span>\n }\n @case ('image') {\n <span class=\"pfx-cell-image\">\n <praxis-rich-content\n rootClassName=\"pfx-cell-image__content\"\n [nodes]=\"getImageRichContentNodes(row, column)\"\n ></praxis-rich-content>\n </span>\n }\n @case ('badge') {\n @if (shouldRenderBadge(row, column)) {\n <span class=\"pfx-badge\" [ngClass]=\"getBadgeClasses(row, column)\">\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-badge__content\"\n [nodes]=\"getBadgeRichContentNodes(row, column)\"\n ></praxis-rich-content>\n </span>\n }\n }\n @case ('chip') {\n @if (shouldRenderChip(row, column)) {\n <span class=\"pfx-chip\" [ngClass]=\"getChipClasses(row, column)\">\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-chip__content\"\n [nodes]=\"getChipRichContentNodes(row, column)\"\n ></praxis-rich-content>\n </span>\n }\n }\n @case ('progress') {\n <div class=\"pfx-progress\">\n <praxis-rich-content\n rootClassName=\"pfx-progress__content\"\n [context]=\"getProgressRichContentContext(row, column)\"\n [nodes]=\"getProgressRichContentNodes(row, column)\"\n ></praxis-rich-content>\n </div>\n }\n @case ('microVisualization') {\n <span class=\"pfx-micro-viz-cell\" [innerHTML]=\"getMicroVisualizationHtml(row, column)\"></span>\n }\n @case ('avatar') {\n <span\n class=\"pfx-avatar-renderer\"\n [ngStyle]=\"getAvatarStyle(row, column)\"\n [class.shape-rounded]=\"getAvatarShape(row, column) === 'rounded'\"\n [class.shape-circle]=\"getAvatarShape(row, column) === 'circle'\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-avatar-renderer__content\"\n [nodes]=\"getAvatarRichContentNodes(row, column)\"\n ></praxis-rich-content>\n </span>\n }\n @case ('link') {\n <a\n class=\"pfx-link\"\n [attr.href]=\"getLinkHref(row, column) || null\"\n [attr.target]=\"getLinkTarget(row, column) || null\"\n [attr.rel]=\"getLinkRel(row, column) || null\"\n (click)=\"$event.stopPropagation()\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-link__content\"\n [nodes]=\"getLinkRichContentNodes(row, column)\"\n ></praxis-rich-content>\n </a>\n }\n @case ('button') {\n @switch (getButtonVariant(row, column)) {\n @case ('outlined') {\n <button\n mat-stroked-button\n [color]=\"getButtonColor(row, column) || null\"\n [disabled]=\"isButtonDisabled(row, column)\"\n [attr.aria-label]=\"getButtonAriaLabel(row, column) || getButtonLabel(row, column)\"\n (click)=\"onButtonClick(row, column, $event)\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-button-renderer__content\"\n [nodes]=\"getButtonRichContentNodes(row, column)\"\n ></praxis-rich-content>\n </button>\n }\n @case ('text') {\n <button\n mat-button\n [color]=\"getButtonColor(row, column) || null\"\n [disabled]=\"isButtonDisabled(row, column)\"\n [attr.aria-label]=\"getButtonAriaLabel(row, column) || getButtonLabel(row, column)\"\n (click)=\"onButtonClick(row, column, $event)\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-button-renderer__content\"\n [nodes]=\"getButtonRichContentNodes(row, column)\"\n ></praxis-rich-content>\n </button>\n }\n @default {\n <button\n mat-flat-button\n [color]=\"getButtonColor(row, column) || null\"\n [disabled]=\"isButtonDisabled(row, column)\"\n [attr.aria-label]=\"getButtonAriaLabel(row, column) || getButtonLabel(row, column)\"\n (click)=\"onButtonClick(row, column, $event)\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-button-renderer__content\"\n [nodes]=\"getButtonRichContentNodes(row, column)\"\n ></praxis-rich-content>\n </button>\n }\n }\n }\n @case ('menu') {\n <button\n mat-icon-button\n [matMenuTriggerFor]=\"menuRef\"\n (click)=\"$event.stopPropagation()\"\n [attr.aria-label]=\"getMenuAriaLabel(row, column) || 'Menu'\"\n >\n <praxis-rich-content\n rootClassName=\"pfx-menu-trigger__content\"\n [nodes]=\"getMenuTriggerRichContentNodes()\"\n ></praxis-rich-content>\n </button>\n <mat-menu #menuRef=\"matMenu\">\n @for (it of getMenuItems(row, column); track it.id) {\n <button\n mat-menu-item\n (click)=\"onMenuItemClick(it, row, $event)\"\n [disabled]=\"!it.__visible\"\n >\n <praxis-rich-content\n rootClassName=\"pfx-menu-item__content\"\n [nodes]=\"getMenuItemRichContentNodes(it)\"\n ></praxis-rich-content>\n </button>\n }\n </mat-menu>\n }\n @default {\n {{ getCellValue(row, column) }}\n }\n }\n </div>\n </td>\n }\n\n <!-- Actions column -->\n @if (config.actions?.row?.enabled) {\n <td class=\"mat-mdc-cell praxis-actions-cell\" [class.dense]=\"dense\" [style.width]=\"getRowActionsWidthStyle()\">\n <div\n class=\"praxis-actions-cell__content\"\n [class.praxis-actions-cell__content--discovering]=\"isRowDiscoveryPending(row)\"\n [attr.aria-busy]=\"isRowDiscoveryPending(row) ? 'true' : null\"\n >\n @if (config.actions?.row?.display === 'icons' || !config.actions?.row?.display) {\n @for (a of getInlineRowActions(row); track trackAction($index, a)) {\n <span\n class=\"praxis-row-action-anchor\"\n [class.praxis-row-action-anchor--workflow]=\"isWorkflowRowAction(a)\"\n [class.praxis-row-action-anchor--blocked]=\"isBlockedWorkflowRowAction(a, row)\"\n [matTooltip]=\"getActionTooltip(a, row)\"\n [matTooltipDisabled]=\"!getActionTooltip(a, row)\"\n matTooltipPosition=\"above\"\n matTooltipClass=\"praxis-tooltip\"\n >\n <button mat-icon-button class=\"praxis-icon-btn\"\n [class.praxis-icon-btn--workflow]=\"isWorkflowRowAction(a)\"\n [class.praxis-icon-btn--blocked]=\"isBlockedWorkflowRowAction(a, row)\"\n [disabled]=\"isActionDisabled(a, row)\"\n (click)=\"onRowAction(getActionId(a), row, $event, getRowActionRuntimeOptions(a, row))\"\n [attr.aria-label]=\"a.label || getActionId(a)\"\n [color]=\"a.color || null\">\n <praxis-rich-content\n layout=\"inline\"\n rootClassName=\"praxis-row-action__content\"\n [nodes]=\"getRowActionIconRichContentNodes(a)\"\n ></praxis-rich-content>\n </button>\n </span>\n }\n }\n @if (config.actions?.row?.display === 'buttons') {\n @for (a of getInlineRowActions(row); track trackAction($index, a)) {\n <span\n class=\"praxis-row-action-anchor\"\n [class.praxis-row-action-anchor--workflow]=\"isWorkflowRowAction(a)\"\n [class.praxis-row-action-anchor--blocked]=\"isBlockedWorkflowRowAction(a, row)\"\n [matTooltip]=\"getActionTooltip(a, row)\"\n [matTooltipDisabled]=\"!getActionTooltip(a, row)\"\n matTooltipPosition=\"above\"\n matTooltipClass=\"praxis-tooltip\"\n >\n <button mat-flat-button class=\"praxis-row-btn\"\n [class.praxis-row-btn--workflow]=\"isWorkflowRowAction(a)\"\n [class.praxis-row-btn--blocked]=\"isBlockedWorkflowRowAction(a, row)\"\n [disabled]=\"isActionDisabled(a, row)\"\n (click)=\"onRowAction(getActionId(a), row, $event, getRowActionRuntimeOptions(a, row))\"\n [attr.aria-label]=\"a.label || getActionId(a)\"\n [color]=\"a.color || null\">\n <praxis-rich-content\n layout=\"inline\"\n rootClassName=\"praxis-row-action__content\"\n [nodes]=\"getRowActionRichContentNodes(a)\"\n ></praxis-rich-content>\n </button>\n </span>\n }\n }\n @if (hasOverflowRowActions(row)) {\n <button mat-icon-button class=\"praxis-icon-btn praxis-more-btn\"\n [matMenuTriggerFor]=\"rowMoreMenuV\"\n (menuOpened)=\"onRowOverflowMenuOpened(row)\"\n [color]=\"getRowMenuButtonColor() || null\"\n [attr.aria-label]=\"getRowMenuTooltip(row)\"\n [matTooltip]=\"getRowMenuTooltip(row)\"\n matTooltipPosition=\"above\">\n <mat-icon [praxisIcon]=\"getRowMenuIcon()\"></mat-icon>\n </button>\n }\n <mat-menu #rowMoreMenuV=\"matMenu\" xPosition=\"before\">\n @if (hasRowOverflowMenuLoadingState(row)) {\n <button mat-menu-item disabled>\n <mat-icon>hourglass_empty</mat-icon>\n <praxis-rich-content\n rootClassName=\"praxis-row-overflow-menu__label\"\n [nodes]=\"getTableChromeTextRichContentNodes(getRowOverflowMenuLoadingLabel(), 'praxis-row-overflow-menu__label-text')\"\n ></praxis-rich-content>\n </button>\n }\n @for (a of getOverflowRowActions(row); track trackAction($index, a)) {\n <button mat-menu-item (click)=\"onRowAction(getActionId(a), row, $event, getRowActionRuntimeOptions(a, row))\" [disabled]=\"isActionDisabled(a, row)\">\n <mat-icon [color]=\"a.color || null\" [praxisIcon]=\"a.icon\"></mat-icon>\n <praxis-rich-content\n rootClassName=\"praxis-row-overflow-menu__label\"\n [nodes]=\"getTableChromeTextRichContentNodes(a.label || getActionId(a), 'praxis-row-overflow-menu__label-text')\"\n ></praxis-rich-content>\n </button>\n }\n @if (hasRowOverflowMenuEmptyState(row)) {\n <button mat-menu-item disabled>\n <mat-icon>info</mat-icon>\n <praxis-rich-content\n rootClassName=\"praxis-row-overflow-menu__label\"\n [nodes]=\"getTableChromeTextRichContentNodes(getRowOverflowMenuEmptyLabel(row), 'praxis-row-overflow-menu__label-text')\"\n ></praxis-rich-content>\n </button>\n }\n </mat-menu>\n </div>\n </td>\n }\n </tr>\n </tbody>\n </table>\n </cdk-virtual-scroll-viewport>\n }\n\n</div>\n@if (shouldShowLoadingSurface()) {\n <div class=\"ptable-loading-state\" role=\"status\" aria-live=\"polite\">\n <div class=\"ptable-loading-state__hero\" aria-hidden=\"true\">\n <span class=\"ptable-loading-state__line ptable-loading-state__line--wide\"></span>\n <span class=\"ptable-loading-state__line ptable-loading-state__line--short\"></span>\n <div class=\"ptable-loading-state__rows\">\n @for (placeholder of [1, 2, 3]; track placeholder) {\n <div class=\"ptable-loading-state__row\">\n <span class=\"ptable-loading-state__cell ptable-loading-state__cell--short\"></span>\n <span class=\"ptable-loading-state__cell\"></span>\n <span class=\"ptable-loading-state__cell ptable-loading-state__cell--wide\"></span>\n </div>\n }\n </div>\n </div>\n <div class=\"ptable-loading-state__message\">\n {{ getLoadingSurfaceMessage() }}\n </div>\n </div>\n}\n@if (shouldShowNoDataState()) {\n <div class=\"ptable-no-data-state\" role=\"status\" aria-live=\"polite\">\n <praxis-empty-state-card\n [icon]=\"getNoDataStateIcon()\"\n [title]=\"getNoDataStateTitle()\"\n [description]=\"getNoDataStateDescription()\"\n [primaryAction]=\"getNoDataStatePrimaryAction()\"\n [secondaryActions]=\"getNoDataStateSecondaryActions()\"\n [inline]=\"true\"\n ></praxis-empty-state-card>\n </div>\n}\n@if (\n shouldRenderDataSurface()\n && !schemaError\n && !dataError\n && shouldRenderFloatingBulkActions()\n && getFloatingBulkActions().length\n && !shouldHideFloatingBulkActions()\n ) {\n <div [class]=\"'praxis-floating-bulk-actions ' + getFloatingBulkPositionClass()\">\n @for (action of getFloatingBulkActions(); track getActionId(action)) {\n <button\n mat-mini-fab\n [color]=\"action.color || 'primary'\"\n [disabled]=\"isFloatingBulkActionDisabled(action)\"\n (click)=\"onToolbarAction({ action: getActionId(action), actionConfig: action })\"\n [attr.aria-label]=\"action.label || getActionId(action)\"\n [matTooltip]=\"action.label || getActionId(action)\"\n matTooltipPosition=\"left\"\n >\n <praxis-rich-content\n rootClassName=\"praxis-floating-bulk-actions__content\"\n [nodes]=\"getFloatingBulkActionRichContentNodes(action)\"\n ></praxis-rich-content>\n </button>\n }\n </div>\n}\n<!-- Barra de a\u00C3\u00A7\u00C3\u00B5es no rodap\u00C3\u00A9 (opcional) -->\n@if (shouldRenderDataSurface() && !schemaError && !dataError && showToolbar && shouldRenderFooterToolbar()) {\n <praxis-table-toolbar\n [config]=\"config\"\n [backgroundColor]=\"getToolbarActionsBackgroundColor()\"\n [style.--pfx-filter-h]=\"getToolbarLayoutHeightHostStyle()\"\n [class.footer-flat]=\"hasBottomPaginator()\"\n class=\"praxis-toolbar-footer\"\n placement=\"footer\"\n [showMain]=\"shouldShowFooterToolbarMain()\"\n [showEndActions]=\"shouldShowFooterToolbarEndActions()\"\n [showActionsGroup]=\"shouldShowToolbarActionsBottom()\"\n [showMobileActions]=\"shouldShowToolbarActionsBottom()\"\n [evaluationContext]=\"getToolbarEvaluationContext()\"\n [columnVisibilityController]=\"toolbarColumnVisibilityController\"\n [exportBusy]=\"exportBusy\"\n (toolbarAction)=\"onToolbarAction($event)\"\n (exportAction)=\"onExportAction($event)\"\n >\n @if (shouldShowFooterToolbarMain() && shouldRenderAdvancedFilter()) {\n <praxis-filter\n advancedFilter\n [resourcePath]=\"getAdvancedFilterResourcePath()\"\n [filterId]=\"tableId\"\n [formId]=\"tableId\"\n [persistenceKey]=\"getAdvancedFilterPersistenceKey()\"\n [fieldMetadata]=\"getAdvancedFilterFieldMetadata()\"\n [enableCustomization]=\"enableCustomization\"\n [value]=\"advancedFilterValue\"\n [alwaysVisibleFields]=\"getAdvancedFilterAlwaysVisibleFields()\"\n [alwaysVisibleFieldMetadataOverrides]=\"getAdvancedFilterAlwaysVisibleFieldMetadataOverrides()\"\n [selectedFieldIds]=\"config.behavior?.filtering?.advancedFilters?.settings?.selectedFieldIds ?? []\"\n [allowSaveTags]=\"config.behavior?.filtering?.advancedFilters?.settings?.allowSaveTags\"\n [changeDebounceMs]=\"config.behavior?.filtering?.advancedFilters?.settings?.changeDebounceMs ?? 300\"\n [i18n]=\"getFilterI18n()\"\n [mode]=\"'filter'\"\n [showFilterSettings]=\"enableCustomization\"\n (change)=\"onAdvancedFilterChange($event)\"\n (requestSearch)=\"onAdvancedFilterSubmit($event)\"\n (clear)=\"onAdvancedFilterClear()\"\n ></praxis-filter>\n }\n @if (shouldShowFooterToolbarMain() && shouldRenderAdvancedFilter()) {\n <ng-content select=\"[advancedFilter]\"></ng-content>\n }\n @if (shouldShowFooterToolbarMain() && shouldRenderAdvancedFilter()) {\n <ng-content select=\"[toolbar]\"></ng-content>\n }\n @if (shouldShowFooterToolbarMain() && shouldRenderAdvancedFilter()) {\n @if (shouldShowAiAssistantEntrypoint()) {\n <button\n end-actions\n mat-icon-button\n color=\"primary\"\n type=\"button\"\n class=\"praxis-table-ai-trigger praxis-table-toolbar-action--ai\"\n [class.praxis-table-ai-trigger--minimized]=\"hasMinimizedAiAssistantSession()\"\n [attr.data-testid]=\"aiAssistantTriggerTestId('footer')\"\n (click)=\"openAiAssistant()\"\n [attr.aria-label]=\"aiAssistantTriggerLabel()\"\n [matBadge]=\"aiAssistantTriggerBadge()\"\n [matBadgeHidden]=\"!hasMinimizedAiAssistantSession()\"\n matBadgeColor=\"accent\"\n matBadgeSize=\"small\"\n matBadgePosition=\"above after\"\n [matTooltip]=\"aiAssistantTriggerTooltip()\"\n matTooltipPosition=\"below\"\n >\n <mat-icon>{{ aiAssistantTriggerIcon() }}</mat-icon>\n </button>\n }\n }\n @if (shouldShowFooterToolbarMain() && shouldRenderAdvancedFilter() && enableCustomization) {\n <button\n end-actions\n mat-icon-button\n color=\"primary\"\n data-role=\"table-settings\"\n class=\"praxis-table-toolbar-action--configuration\"\n data-testid=\"table-settings-trigger\"\n (click)=\"openTableSettings()\"\n [attr.aria-label]=\"getTableSettingsLabel()\"\n [matBadge]=\"schemaOutdated ? '!' : ''\"\n [matBadgeHidden]=\"!schemaOutdated\"\n matBadgeColor=\"warn\"\n matBadgeSize=\"small\"\n matBadgePosition=\"above after\"\n [matTooltip]=\"getTableSettingsTooltip()\"\n matTooltipPosition=\"below\"\n >\n <mat-icon>settings</mat-icon>\n </button>\n }\n </praxis-table-toolbar>\n}\n@if (shouldRenderDataSurface() && !schemaError && !dataError && getPaginationEnabled() && (config.behavior?.pagination?.position === 'bottom' || config.behavior?.pagination?.position === 'both' || !config.behavior?.pagination?.position)) {\n <mat-paginator\n [length]=\"getPaginationLength()\"\n [pageSize]=\"getPaginationPageSize()\"\n [pageSizeOptions]=\"getPaginationPageSizeOptions()\"\n [selectConfig]=\"paginatorSelectConfig\"\n [showFirstLastButtons]=\"getPaginationShowFirstLast()\"\n (page)=\"onPageChange($event)\"\n [class.compact]=\"config.behavior?.pagination?.style === 'compact'\"\n [class.footer-stack]=\"shouldShowToolbarActionsBottom()\"\n >\n </mat-paginator>\n}\n", styles: ["@charset \"UTF-8\";table{width:100%}.praxis-visually-hidden-status{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}.praxis-column-reorder-status{margin:8px 0;padding:10px 12px;border-radius:8px;border:1px solid var(--p-table-border-color);background:var(--p-table-row-hover-bg);color:var(--p-table-header-fg);font-size:12px;line-height:1.4;box-shadow:0 4px 12px #00000014;animation:pfx-column-reorder-status-in var(--p-table-drag-status-enter-duration, .18s) var(--p-table-motion-easing, cubic-bezier(0, 0, .2, 1))}@keyframes pfx-column-reorder-status-in{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}.praxis-actions-cell{height:100%;padding-inline:12px;white-space:nowrap}.pfx-expansion-col-header,.pfx-expansion-col-cell{width:52px;min-width:52px;text-align:center}.pfx-expansion-toggle:focus-visible{outline:2px solid var(--md-sys-color-primary);outline-offset:2px}.pfx-expansion-detail-row{background:var(--md-sys-color-surface-container-low)}.pfx-expansion-detail-cell{padding:0!important;border-bottom:1px solid var(--p-table-border-color)}.pfx-expansion-detail-panel{padding:12px 16px;border-left:3px solid var(--md-sys-color-primary)}.pfx-expansion-detail-panel.pfx-expansion-motion-none{animation:none;transition:none}.pfx-expansion-detail-panel.pfx-expansion-motion-subtle-slide{animation:pfx-expansion-subtle-slide-in var(--pfx-expansion-motion-duration, .16s) var(--pfx-expansion-motion-easing, cubic-bezier(.2, 0, 0, 1))}.pfx-expansion-detail-panel.pfx-expansion-motion-accordion{animation:pfx-expansion-accordion-in var(--pfx-expansion-motion-duration, .18s) var(--pfx-expansion-motion-easing, cubic-bezier(.2, 0, 0, 1));transform-origin:top center}.pfx-expansion-detail-panel.pfx-expansion-motion-fade-scale{animation:pfx-expansion-fade-scale-in var(--pfx-expansion-motion-duration, .16s) var(--pfx-expansion-motion-easing, cubic-bezier(.2, 0, 0, 1));transform-origin:top center}@keyframes pfx-expansion-subtle-slide-in{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}@keyframes pfx-expansion-accordion-in{0%{opacity:0;transform:scaleY(.96)}to{opacity:1;transform:scaleY(1)}}@keyframes pfx-expansion-fade-scale-in{0%{opacity:0;transform:translateY(-2px) scale(.985)}to{opacity:1;transform:translateY(0) scale(1)}}.pfx-expansion-detail-schema{margin:0;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:12px;line-height:1.4;white-space:pre-wrap;word-break:break-word;color:var(--md-sys-color-on-surface-variant)}.pfx-expansion-detail-message{font-size:13px;color:var(--md-sys-color-on-surface-variant)}.pfx-expansion-detail-message--error{color:var(--md-sys-color-error)}.pfx-expansion-detail-stack{display:grid;gap:10px}.pfx-expansion-detail-tabs{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:10px}.pfx-expansion-detail-tab-btn{border:1px solid var(--p-table-border-color);background:var(--md-sys-color-surface);color:var(--md-sys-color-on-surface);border-radius:999px;padding:6px 12px;font-size:12px;line-height:1.2;cursor:pointer}.pfx-expansion-detail-tab-btn__content{display:inline-flex;align-items:center;gap:6px;min-width:0}.pfx-expansion-detail-tab-btn__icon .prx-rich-icon{font-size:16px;line-height:1}.pfx-expansion-detail-tab-btn__title{white-space:nowrap}.pfx-expansion-detail-tab-btn__badge .prx-rich-badge{padding:0 8px;min-height:18px;background:color-mix(in srgb,currentColor 12%,transparent);color:inherit}.pfx-expansion-detail-tab-btn.is-active{border-color:var(--md-sys-color-primary);color:var(--md-sys-color-primary);font-weight:600}.pfx-expansion-detail-tab-btn:focus-visible{outline:2px solid var(--md-sys-color-primary);outline-offset:2px}.pfx-expansion-detail-tab-panel{display:grid;gap:10px}.pfx-expansion-node{border:1px solid var(--p-table-border-color);border-radius:8px;padding:10px 12px;background:var(--md-sys-color-surface)}.pfx-expansion-node-card__header{margin-bottom:8px}.pfx-expansion-node-card__title{margin:0;font-size:14px;line-height:1.3}.pfx-expansion-node-card__subtitle{margin:4px 0 0;font-size:12px;color:var(--md-sys-color-on-surface-variant)}.pfx-expansion-node-card__content{display:grid;gap:10px}.pfx-expansion-node-value{display:flex;align-items:baseline;gap:8px}.pfx-expansion-node-value__label{color:var(--md-sys-color-on-surface-variant);font-size:12px}.pfx-expansion-node-value__content{font-size:14px}.pfx-expansion-node-list__title{margin:0 0 6px;font-size:13px}.pfx-expansion-node-list ul{margin:0;padding-left:18px}.pfx-expansion-node-rich-list__title{margin:0 0 8px;font-size:13px}.pfx-expansion-node-rich-list__items{display:grid;gap:12px}.pfx-expansion-node-rich-list__item{display:grid;gap:10px;padding:12px;border:1px solid var(--md-sys-color-outline-variant, #d7dbe5);border-radius:14px;background:var(--md-sys-color-surface-container-lowest, #fff)}.pfx-expansion-node-rich-list__item--row{grid-template-columns:minmax(0,1fr) auto;align-items:center}.pfx-expansion-node-rich-list__item--stack{grid-template-columns:minmax(0,1fr)}.pfx-expansion-node-rich-list__item--card-list{grid-template-columns:minmax(0,1fr);box-shadow:0 4px 14px #0f172a0a}.pfx-expansion-node-rich-list__item-host{min-width:0}.pfx-expansion-node-rich-list__item-actions{display:flex;flex-wrap:wrap;gap:8px;align-items:center}.pfx-expansion-node-rich-list__item-action-btn{min-width:0}.pfx-expansion-node-rich-list__item-action-host{display:inline-flex;align-items:center}.pfx-expansion-node-action-bar__title{margin:0 0 12px}.pfx-expansion-node-action-bar__actions{display:flex;flex-wrap:wrap;gap:8px;align-items:center}.pfx-expansion-node-action-bar__action-btn{min-width:0}.pfx-expansion-node-action-bar__action-host{display:inline-flex;align-items:center}.pfx-expansion-node-card-grid__header{margin:0 0 12px}.pfx-expansion-node-card-grid__cards{display:grid;gap:12px;grid-template-columns:var(--pfx-expansion-card-grid-columns, repeat(auto-fit, minmax(var(--pfx-expansion-card-grid-min-width, 220px), 1fr)))}.pfx-expansion-node-card-grid__card-host{min-width:0}.pfx-expansion-node-card-grid__card-host [data-rich-node-type=card]{height:100%}.pfx-expansion-node-richtext :where(p,ul,ol,h1,h2,h3,h4,h5,h6){margin-top:0;margin-bottom:8px}.pfx-expansion-node-placeholder{font-size:12px;color:var(--md-sys-color-on-surface-variant)}:host.density-compact{--p-table-header-height-default: 32px;--p-table-row-height-default: 30px;--p-header-padding-default: 4px 8px;--p-cell-padding-default: 3px 8px;--p-header-font-size-default: 11.5px;--p-cell-font-size-default: 12px;--p-actions-btn-size-default: 28px;--p-actions-icon-size-default: 15px;--p-actions-more-btn-size-default: 28px;--p-actions-more-icon-size-default: 15px;--p-table-paginator-container-min-height-default: 32px;--p-table-paginator-container-padding-default: 2px 8px;--p-table-paginator-container-gap-default: 6px;--p-table-paginator-select-width-default: 64px;--p-table-paginator-select-height-default: 28px;--p-table-paginator-select-padding-inline-default: 8px 6px;--p-table-paginator-action-size-default: 28px}:host.density-comfortable{--p-table-header-height-default: 40px;--p-table-row-height-default: 44px;--p-header-padding-default: 10px 14px;--p-cell-padding-default: 10px 14px;--p-header-font-size-default: inherit;--p-cell-font-size-default: inherit;--p-actions-btn-size-default: 36px;--p-actions-icon-size-default: 18px;--p-actions-more-btn-size-default: 36px;--p-actions-more-icon-size-default: 18px;--p-table-paginator-container-min-height-default: 44px;--p-table-paginator-container-padding-default: 6px 10px;--p-table-paginator-container-gap-default: 10px;--p-table-paginator-select-width-default: 78px;--p-table-paginator-select-height-default: 36px;--p-table-paginator-select-padding-inline-default: 12px 10px;--p-table-paginator-action-size-default: 36px}:host.density-spacious{--p-table-header-height-default: 52px;--p-table-row-height-default: 56px;--p-header-padding-default: 16px 20px;--p-cell-padding-default: 16px 20px;--p-header-font-size-default: inherit;--p-cell-font-size-default: inherit;--p-actions-btn-size-default: 44px;--p-actions-icon-size-default: 24px;--p-actions-more-btn-size-default: 44px;--p-actions-more-icon-size-default: 24px;--p-table-paginator-container-min-height-default: 52px;--p-table-paginator-container-padding-default: 8px 14px;--p-table-paginator-container-gap-default: 12px;--p-table-paginator-select-width-default: 86px;--p-table-paginator-select-height-default: 40px;--p-table-paginator-select-padding-inline-default: 14px 12px;--p-table-paginator-action-size-default: 40px}@media(pointer:coarse){:host.density-compact{--p-table-row-height-default: 44px;--p-table-header-height-default: 44px;--p-table-paginator-container-min-height-default: 44px;--p-table-paginator-action-size-default: 40px}}:host.density-compact .praxis-actions-cell{padding-inline:8px}:host.density-spacious .praxis-actions-cell{padding-inline:16px}.praxis-actions-cell__content{display:flex;align-items:center;justify-content:flex-end;gap:6px;width:100%;transition:opacity .12s ease}.praxis-actions-cell.dense .praxis-actions-cell__content{gap:6px}.praxis-actions-cell__content--discovering{opacity:.78}.praxis-row-action-anchor{display:inline-flex;align-items:center}.praxis-row-action-anchor--workflow{position:relative}.praxis-row-action-anchor--workflow:after{content:\"\";position:absolute;right:4px;top:4px;width:6px;height:6px;border-radius:999px;background:var(--md-sys-color-secondary);opacity:.9;pointer-events:none}.praxis-row-action-anchor--blocked:after{background:var(--md-sys-color-error)}.praxis-icon-btn{width:var(--p-actions-btn-size, var(--p-actions-btn-size-default, 40px));height:var(--p-actions-btn-size, var(--p-actions-btn-size-default, 40px));border:0;background:transparent;padding:0;display:inline-flex;align-items:center;justify-content:center;border-radius:9999px;cursor:pointer;--mat-icon-button-state-layer-size: var(--p-actions-btn-size, var(--p-actions-btn-size-default, 40px))}.praxis-icon-btn:hover{background:var(--md-sys-color-surface-variant)}.praxis-icon-btn:focus-visible{outline:2px solid var(--md-sys-color-primary);outline-offset:2px}.praxis-icon-btn mat-icon,.praxis-icon-btn .mat-icon{font-size:var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px));width:var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px));height:var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px));line-height:var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px))}.praxis-icon-btn praxis-rich-content{display:inline-flex;align-items:center;justify-content:center;width:var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px));height:var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px));line-height:var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px))}:host ::ng-deep .praxis-icon-btn .praxis-row-action__content,:host ::ng-deep .praxis-icon-btn .praxis-row-action__icon{display:inline-flex;align-items:center;justify-content:center;width:var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px));height:var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px));line-height:var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px))}:host ::ng-deep .praxis-icon-btn .praxis-row-action__icon .prx-rich-icon{font-size:var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px));width:var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px));height:var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px));line-height:var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px))}.praxis-icon-btn--workflow{background:color-mix(in srgb,var(--md-sys-color-secondary-container) 36%,transparent)}.praxis-icon-btn--blocked{background:color-mix(in srgb,var(--md-sys-color-error-container) 42%,transparent)}.praxis-more-btn{width:var(--p-actions-more-btn-size, var(--p-actions-more-btn-size-default, var(--p-actions-btn-size, var(--p-actions-btn-size-default, 40px))));height:var(--p-actions-more-btn-size, var(--p-actions-more-btn-size-default, var(--p-actions-btn-size, var(--p-actions-btn-size-default, 40px))));--mat-icon-button-state-layer-size: var(--p-actions-more-btn-size, var(--p-actions-more-btn-size-default, var(--p-actions-btn-size, var(--p-actions-btn-size-default, 40px))));background-image:var(--p-actions-more-btn-gradient, none);background-size:100% 100%;background-repeat:no-repeat}.praxis-more-btn mat-icon,.praxis-more-btn .mat-icon{font-size:var(--p-actions-more-icon-size, var(--p-actions-more-icon-size-default, var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px))));width:var(--p-actions-more-icon-size, var(--p-actions-more-icon-size-default, var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px))));height:var(--p-actions-more-icon-size, var(--p-actions-more-icon-size-default, var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px))));line-height:var(--p-actions-more-icon-size, var(--p-actions-more-icon-size-default, var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px))));color:var(--p-actions-more-icon-color);background-image:var(--p-actions-more-icon-gradient, none);-webkit-background-clip:text;background-clip:text}.praxis-row-btn--workflow{box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--md-sys-color-secondary) 28%,transparent)}.praxis-row-btn--blocked{box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--md-sys-color-error) 28%,transparent)}.praxis-icon-btn.destructive mat-icon{color:var(--md-sys-color-error)}.mat-mdc-tooltip.praxis-tooltip{margin-top:-8px;margin-bottom:8px}.spacer{flex:1 1 auto}.praxis-table-header{display:flex;flex-wrap:wrap;align-items:flex-start;gap:6px;margin:10px 0 8px;width:100%;clear:both;position:relative}.praxis-table-header.stacked{margin:0}.praxis-table-header>praxis-table-toolbar{flex:1 0 100%}.praxis-floating-bulk-actions{position:fixed;z-index:var(--praxis-layer-floating-local, 200);display:inline-flex;align-items:center;gap:8px;padding:8px;border-radius:999px;background:var(--md-sys-color-surface-container-highest);box-shadow:0 8px 20px #00000029}.praxis-floating-bulk-actions.pos-bottom-right{right:20px;bottom:20px}.praxis-floating-bulk-actions.pos-bottom-left{left:20px;bottom:20px}.praxis-floating-bulk-actions.pos-top-right{right:20px;top:20px}.praxis-floating-bulk-actions.pos-top-left{left:20px;top:20px}@media(max-width:768px){.praxis-floating-bulk-actions{gap:6px;padding:6px}.praxis-floating-bulk-actions.pos-bottom-right{right:12px;left:auto;bottom:12px}.praxis-floating-bulk-actions.pos-bottom-left{left:12px;right:auto;bottom:12px}.praxis-floating-bulk-actions.pos-top-right{right:12px;left:auto;top:12px}.praxis-floating-bulk-actions.pos-top-left{left:12px;right:auto;top:12px}}:host{display:block;width:100%;min-width:0;max-width:100%;--pfx-toolbar-pad-y: 6px;--pfx-toolbar-pad-x: 12px;--p-table-bg: var(--md-sys-color-surface-container-highest);--p-table-text-color: var(--md-sys-color-on-surface);--p-table-header-bg: var(--md-sys-color-surface-container-highest);--p-table-header-fg: var(--md-sys-color-on-surface);--p-table-border-color: var(--md-sys-color-outline-variant);--p-table-row-even-bg: var(--md-sys-color-surface-container);--p-table-row-hover-bg: var(--md-sys-color-surface-container-high);--p-table-row-selected-bg: var(--md-sys-color-primary-container);--p-table-row-selected-fg: var(--md-sys-color-on-primary-container);--p-table-row-selected-font-weight: 600;--p-table-row-selected-indicator: linear-gradient( 180deg, var(--md-sys-color-primary), var(--md-sys-color-secondary) );--p-table-badge-soft-primary-bg: var(--md-sys-color-primary-container);--p-table-badge-soft-primary-fg: var(--md-sys-color-on-primary-container);--p-table-badge-soft-accent-bg: var(--md-sys-color-secondary-container);--p-table-badge-soft-accent-fg: var(--md-sys-color-on-secondary-container);--p-table-badge-soft-warn-bg: var(--md-sys-color-error-container);--p-table-badge-soft-warn-fg: var(--md-sys-color-on-error-container);--p-table-state-success-bg: var(--md-sys-color-tertiary-container);--p-table-state-success-fg: var(--md-sys-color-on-tertiary-container);--p-table-state-warning-bg: var(--md-sys-color-secondary-container);--p-table-state-warning-fg: var(--md-sys-color-on-secondary-container);--p-table-state-danger-bg: var(--md-sys-color-error-container);--p-table-state-danger-fg: var(--md-sys-color-on-error-container);--p-table-state-highlight-bg: var(--md-sys-color-primary-container);--p-table-state-highlight-fg: var(--md-sys-color-on-primary-container);--p-table-reorder-transition-duration: .16s;--p-table-drag-preview-scale: 1.01;--p-table-drag-status-enter-duration: .18s;--p-table-drag-preview-shadow: 0 14px 32px rgba(0, 0, 0, .28), 0 0 0 1px var(--p-table-border-color);--p-table-column-resize-hit-area: 10px;--p-table-column-resize-line-width: 1px;--p-table-column-resize-separator-color: color-mix( in srgb, var(--p-table-border-color) 78%, transparent );--p-table-column-resize-separator-hover-color: var(--md-sys-color-primary);--p-table-column-resize-active-color: var(--md-sys-color-primary)}:host ::ng-deep .mat-mdc-table{background:var(--p-table-bg);color:var(--p-table-text-color);border-radius:12px 12px 0 0;width:100%;box-shadow:var(--p-table-surface-shadow);transition:box-shadow var(--p-table-selection-transition-duration, .18s) var(--p-table-motion-easing, cubic-bezier(0, 0, .2, 1))}:host ::ng-deep .mat-mdc-table:hover{box-shadow:var(--p-table-surface-shadow-hover, var(--p-table-surface-shadow))}:host ::ng-deep .mat-mdc-table.pfx-column-resize-enabled{table-layout:fixed}:host ::ng-deep .mat-mdc-table.table-stack-top{border-top-left-radius:0;border-top-right-radius:0}:host ::ng-deep .praxis-toolbar-footer{border:0 solid var(--p-table-border-color);border-top:0;border-radius:0;background:var(--p-table-bg)}:host ::ng-deep .mat-mdc-paginator.footer-stack{border-top-left-radius:0;border-top-right-radius:0;border-top:0}:host ::ng-deep .mat-mdc-paginator.footer-stack .mat-mdc-paginator-container{padding:var(--p-table-paginator-footer-stack-padding, 6px 10px)}:host ::ng-deep .mat-mdc-paginator{--p-table-paginator-bg-default: color-mix( in srgb, var(--p-table-bg) 94%, var(--md-sys-color-surface, white) 6% );--p-table-paginator-border-color-default: color-mix(in srgb, var(--p-table-border-color) 82%, transparent);--p-table-paginator-select-bg-default: color-mix(in srgb, var(--p-table-bg) 88%, var(--p-table-text-color) 12%);--p-table-paginator-select-border-color-default: color-mix( in srgb, var(--p-table-border-color) 74%, transparent );--p-table-paginator-select-border-color-hover-default: color-mix( in srgb, var(--md-sys-color-primary) 36%, var(--p-table-border-color) );--p-table-paginator-select-border-color-focus-default: color-mix( in srgb, var(--md-sys-color-primary) 72%, var(--p-table-border-color) );--p-table-paginator-select-focus-ring-default: color-mix(in srgb, var(--md-sys-color-primary) 18%, transparent);--p-table-paginator-select-radius-default: 999px;--p-table-paginator-select-shadow-default: inset 0 1px 0 color-mix(in srgb, var(--md-sys-color-on-surface) 8%, transparent);--p-table-paginator-select-text-color-default: var(--p-table-text-color);--p-table-paginator-select-icon-color-default: color-mix(in srgb, var(--p-table-text-color) 72%, transparent);--p-table-paginator-range-text-color-default: color-mix(in srgb, var(--p-table-text-color) 78%, transparent);border-top:1px solid var(--p-table-paginator-border-color, var(--p-table-paginator-border-color-default));background:var(--p-table-paginator-bg, var(--p-table-paginator-bg-default))}:host ::ng-deep .mat-mdc-paginator .mat-mdc-paginator-container{min-height:var(--p-table-paginator-container-min-height, var(--p-table-paginator-container-min-height-default, 44px));padding:var(--p-table-paginator-container-padding, var(--p-table-paginator-container-padding-default, 6px 10px));gap:var(--p-table-paginator-container-gap, var(--p-table-paginator-container-gap-default, 10px))}:host ::ng-deep .mat-mdc-paginator.compact{--p-table-paginator-container-min-height-default: 30px;--p-table-paginator-container-padding-default: 2px 8px;--p-table-paginator-container-gap-default: 6px;--p-table-paginator-select-width-default: 62px;--p-table-paginator-select-height-default: 28px;--p-table-paginator-select-padding-inline-default: 8px 6px;--p-table-paginator-action-size-default: 28px}:host ::ng-deep .mat-mdc-paginator .mat-mdc-icon-button{width:var(--p-table-paginator-action-size, var(--p-table-paginator-action-size-default, 36px));height:var(--p-table-paginator-action-size, var(--p-table-paginator-action-size-default, 36px));display:inline-grid;place-items:center;padding:0;line-height:0;--mdc-icon-button-state-layer-size: var(--p-table-paginator-action-size, var(--p-table-paginator-action-size-default, 36px));--mat-icon-button-state-layer-size: var(--p-table-paginator-action-size, var(--p-table-paginator-action-size-default, 36px))}:host ::ng-deep .mat-mdc-paginator .mat-mdc-paginator-icon{display:block;flex:0 0 auto;margin:0}.praxis-table-ai-trigger{transition:background-color .16s ease,box-shadow .16s ease,color .16s ease}.praxis-table-ai-trigger--minimized{background:color-mix(in srgb,var(--md-sys-color-primary-container, rgba(59, 130, 246, .22)) 72%,transparent);color:var(--md-sys-color-on-primary-container, var(--md-sys-color-primary, #2563eb));box-shadow:0 0 0 1px color-mix(in srgb,var(--md-sys-color-primary, #2563eb) 34%,transparent),0 8px 20px color-mix(in srgb,var(--md-sys-color-primary, #2563eb) 16%,transparent)}.praxis-table-ai-trigger--minimized:hover,.praxis-table-ai-trigger--minimized:focus-visible{background:color-mix(in srgb,var(--md-sys-color-primary-container, rgba(59, 130, 246, .22)) 86%,transparent)}:host ::ng-deep .mat-mdc-paginator .mat-mdc-paginator-page-size-select{margin-left:4px;width:var(--p-table-paginator-select-width, var(--p-table-paginator-select-width-default, 78px))}:host ::ng-deep .mat-mdc-paginator .mat-mdc-paginator-page-size-select .mat-mdc-text-field-wrapper{--mdc-outlined-text-field-container-color: var( --p-table-paginator-select-bg, var(--p-table-paginator-select-bg-default) );--mdc-outlined-text-field-input-text-color: var( --p-table-paginator-select-text-color, var(--p-table-paginator-select-text-color-default) );min-height:var(--p-table-paginator-select-height, var(--p-table-paginator-select-height-default, 36px));height:var(--p-table-paginator-select-height, var(--p-table-paginator-select-height-default, 36px));padding-inline:var(--p-table-paginator-select-padding-inline, var(--p-table-paginator-select-padding-inline-default, 12px 10px));border:1px solid var(--p-table-paginator-select-border-color, var(--p-table-paginator-select-border-color-default));border-radius:var(--p-table-paginator-select-radius, var(--p-table-paginator-select-radius-default));background:var(--p-table-paginator-select-bg, var(--p-table-paginator-select-bg-default))!important;background-color:var(--p-table-paginator-select-bg, var(--p-table-paginator-select-bg-default))!important;color:var(--p-table-paginator-select-text-color, var(--p-table-paginator-select-text-color-default))!important;box-shadow:var(--p-table-paginator-select-shadow, var(--p-table-paginator-select-shadow-default))}:host ::ng-deep .mat-mdc-paginator .mat-mdc-paginator-page-size-select .mat-mdc-text-field-wrapper:hover{border-color:var(--p-table-paginator-select-border-color-hover, var(--p-table-paginator-select-border-color-hover-default))}:host ::ng-deep .mat-mdc-paginator .mat-mdc-paginator-page-size-select.mat-focused .mat-mdc-text-field-wrapper{border-color:var(--p-table-paginator-select-border-color-focus, var(--p-table-paginator-select-border-color-focus-default));box-shadow:0 0 0 3px var(--p-table-paginator-select-focus-ring, var(--p-table-paginator-select-focus-ring-default)),var(--p-table-paginator-select-shadow, var(--p-table-paginator-select-shadow-default))}:host ::ng-deep .mat-mdc-paginator .mat-mdc-paginator-page-size-select .mat-mdc-form-field-flex{min-height:var(--p-table-paginator-select-height, var(--p-table-paginator-select-height-default, 36px));align-items:center}:host ::ng-deep .mat-mdc-paginator .mat-mdc-paginator-page-size-select .mat-mdc-form-field-infix{display:flex;align-items:center;min-height:var(--p-table-paginator-select-height, var(--p-table-paginator-select-height-default, 36px));padding-block:0;width:auto}:host ::ng-deep .mat-mdc-paginator .mat-mdc-paginator-page-size-select .mat-mdc-select-trigger{min-height:var(--p-table-paginator-select-height, var(--p-table-paginator-select-height-default, 36px));padding-right:2px;color:var(--p-table-paginator-select-text-color, var(--p-table-paginator-select-text-color-default))}:host ::ng-deep .mat-mdc-paginator .mat-mdc-paginator-page-size-select .mat-mdc-select-arrow{color:var(--p-table-paginator-select-icon-color, var(--p-table-paginator-select-icon-color-default))}:host ::ng-deep .mat-mdc-paginator .mat-mdc-paginator-page-size-select .mdc-notched-outline__leading,:host ::ng-deep .mat-mdc-paginator .mat-mdc-paginator-page-size-select .mdc-notched-outline__notch,:host ::ng-deep .mat-mdc-paginator .mat-mdc-paginator-page-size-select .mdc-notched-outline__trailing{border-color:transparent!important;border-width:0!important}:host ::ng-deep .mat-mdc-paginator .mat-mdc-paginator-page-size-select .mat-mdc-form-field-subscript-wrapper{display:none}:host ::ng-deep .mat-mdc-paginator .mat-mdc-paginator-range-label{font-size:12px;font-weight:600;color:var(--p-table-paginator-range-text-color, var(--p-table-paginator-range-text-color-default))}:host ::ng-deep .mat-mdc-paginator .mat-mdc-select-value-text{font-size:12px;font-weight:700;color:var(--p-table-paginator-select-text-color, var(--p-table-paginator-select-text-color-default))}::ng-deep .praxis-table-paginator-select-panel.mat-mdc-select-panel{--mat-select-panel-background-color: var(--md-sys-color-surface-container, #fff);background:var(--md-sys-color-surface-container, #fff)!important;background-color:var(--md-sys-color-surface-container, #fff)!important;border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant, #d7dbe5) 70%,transparent);box-shadow:0 12px 28px color-mix(in srgb,var(--md-sys-color-shadow, #000) 28%,transparent)}::ng-deep .praxis-table-paginator-select-panel .mat-mdc-option{--mat-option-label-text-color: var(--md-sys-color-on-surface, #111827);color:var(--md-sys-color-on-surface, #111827)!important}::ng-deep .praxis-table-paginator-select-panel .mat-mdc-option:hover:not(.mdc-list-item--disabled),::ng-deep .praxis-table-paginator-select-panel .mat-mdc-option.mat-mdc-option-active{--mat-option-hover-state-layer-color: color-mix( in srgb, var(--md-sys-color-primary, #2f7cff) 14%, transparent );background:color-mix(in srgb,var(--md-sys-color-primary, #2f7cff) 14%,transparent)!important;color:var(--md-sys-color-on-surface, #111827)!important}:host [data-role=table-settings].mat-mdc-icon-button{--mdc-icon-button-icon-color: var(--md-sys-color-primary);color:var(--md-sys-color-primary)}.pfx-link{color:var(--md-sys-color-primary);text-decoration:underline;cursor:pointer}.pfx-chip{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;border-radius:10px;font-size:12px;line-height:1;border:1px solid transparent;white-space:nowrap;--prx-rich-content-inline-gap: 6px}.pfx-chip-icon{font-size:14px;width:14px;height:14px}.pfx-chip--plain{background:transparent;border-color:transparent;color:var(--md-sys-color-on-surface)}.pfx-chip--outlined{background:transparent;border-color:var(--md-sys-color-outline-variant);color:var(--md-sys-color-on-surface)}.pfx-chip--filled-primary{background:var(--md-sys-color-primary);color:var(--md-sys-color-on-primary)}.pfx-chip--filled-accent{background:var(--md-sys-color-secondary);color:var(--md-sys-color-on-secondary)}.pfx-chip--filled-warn,.pfx-chip--filled-danger{background:var(--md-sys-color-error);color:var(--md-sys-color-on-error)}.pfx-chip--filled-success{background:var(--p-table-state-success-bg);color:var(--p-table-state-success-fg)}.pfx-chip--filled-info{background:var(--md-sys-color-tertiary);color:var(--md-sys-color-on-tertiary)}.pfx-chip--filled-basic{background:var(--md-sys-color-surface-container-highest);color:var(--md-sys-color-on-surface);border-color:var(--md-sys-color-outline-variant)}.pfx-chip--soft-primary{background:var(--p-table-badge-soft-primary-bg);color:var(--p-table-badge-soft-primary-fg)}.pfx-chip--soft-accent{background:var(--p-table-badge-soft-accent-bg);color:var(--p-table-badge-soft-accent-fg)}.pfx-chip--soft-warn{background:var(--p-table-badge-soft-warn-bg);color:var(--p-table-badge-soft-warn-fg)}.pfx-chip--soft-danger{background:color-mix(in srgb,var(--p-table-state-danger-bg) 72%,transparent);color:var(--p-table-state-danger-fg);border-color:color-mix(in srgb,var(--p-table-state-danger-fg) 18%,transparent)}.pfx-chip--soft-success{background:color-mix(in srgb,var(--p-table-state-success-bg) 72%,transparent);color:var(--p-table-state-success-fg);border-color:color-mix(in srgb,var(--p-table-state-success-fg) 18%,transparent)}.pfx-chip--soft-info{background:color-mix(in srgb,var(--md-sys-color-tertiary-container) 72%,transparent);color:var(--md-sys-color-on-tertiary-container);border-color:color-mix(in srgb,var(--md-sys-color-tertiary) 18%,transparent)}.pfx-chip--soft-basic{background:color-mix(in srgb,var(--md-sys-color-surface-container-highest) 82%,transparent);color:color-mix(in srgb,var(--md-sys-color-on-surface) 76%,transparent);border-color:color-mix(in srgb,var(--md-sys-color-outline-variant) 65%,transparent)}.pfx-progress{position:relative;width:100%;min-width:0;max-width:140px;display:inline-block;vertical-align:middle}.pfx-progress .pfx-progress__content{width:100%;min-width:0}.pfx-progress .prx-rich-progress{width:100%}.pfx-progress-bar{height:100%;background:var(--md-sys-color-primary);transition:width .2s ease}.pfx-progress-label{margin-left:8px;font-size:12px;opacity:.8;display:inline-block;vertical-align:middle}.pfx-micro-viz-cell{display:inline-block;width:min(100%,180px);min-width:112px;max-width:220px;vertical-align:middle}.pfx-micro-viz-cell .pfx-micro-viz{display:grid;gap:4px;width:100%;min-width:0;color:var(--md-sys-color-on-surface);font-size:12px;line-height:1.2}.pfx-micro-viz-cell .pfx-micro-viz__row{display:grid;grid-template-columns:minmax(42px,.8fr) minmax(52px,1fr) auto;align-items:center;gap:6px;min-width:0}.pfx-micro-viz-cell .pfx-micro-viz__label,.pfx-micro-viz-cell .pfx-micro-viz__value{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pfx-micro-viz-cell .pfx-micro-viz__track{position:relative;display:block;height:8px;min-width:0;border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-outline-variant) 62%,transparent);overflow:hidden}.pfx-micro-viz-cell .pfx-micro-viz__bar,.pfx-micro-viz-cell .pfx-micro-viz__segment{display:block;height:100%;border-radius:inherit;background:var(--md-sys-color-primary)}.pfx-micro-viz-cell .pfx-micro-viz__row[data-tone=success] .pfx-micro-viz__bar,.pfx-micro-viz-cell .pfx-micro-viz__segment[data-tone=success],.pfx-micro-viz-cell .pfx-micro-viz[data-tone=success] .pfx-micro-viz__bar{background:var(--p-table-state-success-fg, #168a4a)}.pfx-micro-viz-cell .pfx-micro-viz__row[data-tone=warning] .pfx-micro-viz__bar,.pfx-micro-viz-cell .pfx-micro-viz__segment[data-tone=warning],.pfx-micro-viz-cell .pfx-micro-viz[data-tone=warning] .pfx-micro-viz__bar{background:var(--p-table-state-warning-fg, #b45f06)}.pfx-micro-viz-cell .pfx-micro-viz__row[data-tone=danger] .pfx-micro-viz__bar,.pfx-micro-viz-cell .pfx-micro-viz__segment[data-tone=danger],.pfx-micro-viz-cell .pfx-micro-viz[data-tone=danger] .pfx-micro-viz__bar{background:var(--p-table-state-danger-fg, #b3261e)}.pfx-micro-viz-cell .pfx-micro-viz__segments{display:flex;width:100%;height:8px;overflow:hidden;border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-outline-variant) 62%,transparent)}.pfx-micro-viz-cell .pfx-micro-viz__meta{display:flex;justify-content:space-between;gap:8px;min-width:0;color:color-mix(in srgb,var(--md-sys-color-on-surface) 72%,transparent)}.pfx-micro-viz-cell .pfx-micro-viz__bullet .pfx-micro-viz__target{position:absolute;top:-2px;bottom:-2px;width:2px;border-radius:999px;background:var(--md-sys-color-on-surface)}.pfx-micro-viz-cell .pfx-micro-viz__delta[data-tone=success]{color:var(--p-table-state-success-fg, #168a4a)}.pfx-micro-viz-cell .pfx-micro-viz__delta[data-tone=warning]{color:var(--p-table-state-warning-fg, #b45f06)}.pfx-micro-viz-cell .pfx-micro-viz__delta[data-tone=danger]{color:var(--p-table-state-danger-fg, #b3261e)}.pfx-micro-viz-cell .pfx-micro-viz__fallback{display:inline-block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pfx-micro-viz-cell .pfx-micro-viz.pfx-micro-viz__radial,.pfx-micro-viz-cell .pfx-micro-viz.pfx-micro-viz__harvey,.pfx-micro-viz-cell .pfx-micro-viz.pfx-micro-viz__process{display:inline-flex}.pfx-micro-viz__radial{align-items:center;justify-content:center;position:relative}.pfx-micro-radial-svg{width:24px;height:24px;overflow:visible;flex-shrink:0;display:block}.pfx-micro-radial-svg__track{fill:none;stroke:var(--pfx-micro-track-color, var(--md-sys-color-surface-container-high, #e5e7eb));stroke-width:3}.pfx-micro-radial-svg__bar{fill:none;stroke:currentColor;stroke-width:3;stroke-linecap:round;transform:rotate(-90deg);transform-origin:50% 50%;transition:stroke-dasharray .35s ease}.pfx-micro-radial-svg__text{font-size:8px;font-weight:700;text-anchor:middle;fill:currentColor;font-family:var(--md-sys-typescale-body-medium-font-family, sans-serif)}.pfx-micro-viz__harvey{align-items:center;gap:0}.pfx-micro-harvey-svg{width:18px;height:18px;overflow:visible;flex-shrink:0}.pfx-micro-harvey-svg__track{fill:none;stroke:var(--pfx-micro-track-color, var(--md-sys-color-surface-container-high, #e5e7eb));stroke-width:2}.pfx-micro-harvey-svg__bar{fill:none;stroke:currentColor;stroke-width:16;transform:rotate(-90deg);transform-origin:50% 50%;transition:stroke-dasharray .35s ease}.pfx-micro-harvey-fraction{display:inline-flex;align-items:center;font-size:11px;font-variant-numeric:tabular-nums;margin-left:6px;font-family:var(--md-sys-typescale-body-medium-font-family, sans-serif)}.pfx-micro-harvey-fraction strong{color:currentColor;font-weight:700}.pfx-separator{opacity:.6;color:var(--md-sys-color-on-surface-variant, #4b5563);margin-inline:2px}.pfx-total{color:var(--md-sys-color-on-surface-variant, #4b5563)}.pfx-micro-viz__bullet{display:flex;flex-direction:column;gap:4px;width:100%}.pfx-micro-bullet__top{display:flex;justify-content:space-between;align-items:baseline;font-size:11px}.pfx-micro-bullet__label{color:var(--md-sys-color-on-surface-variant, #4b5563);font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pfx-micro-bullet__value{font-weight:700;color:currentColor;font-variant-numeric:tabular-nums;flex-shrink:0}.pfx-micro-bullet__target-val{font-weight:400;font-size:10px;color:var(--md-sys-color-on-surface-variant, #4b5563);margin-left:4px}.pfx-micro-bullet__track{position:relative;display:block;overflow:hidden;border-radius:var(--pfx-micro-track-radius, 999px);background:var(--pfx-micro-track-color, var(--md-sys-color-surface-container-high, #e5e7eb));block-size:10px;width:100%}.pfx-micro-bullet__range{position:absolute;inset-block:0;display:block;block-size:100%;opacity:.32}.pfx-micro-bullet__range[data-tone=success]{background:var(--p-table-state-success-fg, #168a4a)}.pfx-micro-bullet__range[data-tone=warning]{background:var(--p-table-state-warning-fg, #b45f06)}.pfx-micro-bullet__range[data-tone=danger],.pfx-micro-bullet__range[data-tone=critical]{background:var(--p-table-state-danger-fg, #b3261e)}.pfx-micro-bullet__range[data-tone=info]{background:var(--md-sys-color-primary, #2563eb)}.pfx-micro-bullet__actual{position:absolute;inset-block-start:3px;inset-inline-start:0;block-size:4px;border-radius:inherit}.pfx-micro-bullet__actual[data-tone=success]{background:var(--p-table-state-success-fg, #168a4a)}.pfx-micro-bullet__actual[data-tone=warning]{background:var(--p-table-state-warning-fg, #b45f06)}.pfx-micro-bullet__actual[data-tone=danger],.pfx-micro-bullet__actual[data-tone=critical]{background:var(--p-table-state-danger-fg, #b3261e)}.pfx-micro-bullet__actual[data-tone=info]{background:var(--md-sys-color-primary, #2563eb)}.pfx-micro-bullet__target{position:absolute;inset-block:0;inline-size:2px;background:var(--md-sys-color-on-surface, #111827)}.pfx-micro-bullet__bottom{display:flex;justify-content:space-between;font-size:9px;color:var(--md-sys-color-on-surface-variant, #4b5563)}.pfx-micro-viz-container{display:flex;align-items:center;gap:8px;width:100%}.pfx-micro-trend__label-col{display:flex;flex-direction:column;justify-content:center;font-size:11px;line-height:1.2;flex-shrink:0;min-width:24px;font-family:var(--md-sys-typescale-body-medium-font-family, sans-serif)}.pfx-micro-trend__label-col--start{align-items:flex-end;text-align:right}.pfx-micro-trend__label-col--end{align-items:flex-start;text-align:left}.pfx-micro-trend__value{font-weight:700;color:var(--md-sys-color-on-surface, #1f2937)}.pfx-micro-trend__label{color:var(--md-sys-color-on-surface-variant, #4b5563);font-size:9px}.pfx-micro-viz__line,.pfx-micro-viz__area,.pfx-micro-viz__column{display:block;width:100%;height:30px;overflow:visible;flex:1 1 auto}.pfx-micro-line__svg,.pfx-micro-area__svg,.pfx-micro-column__svg{width:100%;height:100%;display:block;overflow:visible}.pfx-micro-line__path,.pfx-micro-area__path{stroke:currentColor}.pfx-micro-area__fill{fill:currentColor}.pfx-micro-trend__marker{fill:currentColor;stroke:var(--md-sys-color-surface, #ffffff);stroke-width:1.5px}.pfx-micro-trend__marker[data-tone=success]{fill:var(--p-table-state-success-fg, #168a4a)}.pfx-micro-trend__marker[data-tone=warning]{fill:var(--p-table-state-warning-fg, #b45f06)}.pfx-micro-trend__marker[data-tone=danger],.pfx-micro-trend__marker[data-tone=critical]{fill:var(--p-table-state-danger-fg, #b3261e)}.pfx-micro-trend__marker[data-tone=info]{fill:var(--md-sys-color-primary, #2563eb)}.pfx-micro-viz__process{align-items:center;width:100%;min-width:120px;padding-block:4px;overflow-x:auto;-webkit-overflow-scrolling:touch}.pfx-micro-step{display:flex;align-items:center;flex:1 1 0%;min-width:0}.pfx-micro-step[data-state=future]{opacity:.38}.pfx-micro-step[data-state=disabled]{opacity:.28;pointer-events:none}.pfx-micro-step__node-wrapper{display:flex;flex-direction:column;align-items:center;position:relative;flex-shrink:0}.pfx-micro-step__node{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;border-radius:50%;font-size:11px;font-weight:700;background:var(--md-sys-color-surface-container-high, #e5e7eb);color:var(--md-sys-color-on-surface, #1f2937);border:2px solid transparent;transition:all .2s ease}.pfx-micro-step__node[data-tone=success]{background:var(--p-table-state-success-fg, #168a4a);color:#fff}.pfx-micro-step__node[data-tone=warning]{background:var(--p-table-state-warning-fg, #b45f06);color:#fff}.pfx-micro-step__node[data-tone=danger],.pfx-micro-step__node[data-tone=critical]{background:var(--p-table-state-danger-fg, #b3261e);color:#fff}.pfx-micro-step__node[data-tone=info]{background:var(--md-sys-color-primary, #2563eb);color:#fff}.pfx-micro-step__icon{font-size:12px}.pfx-micro-step__label{font-size:9px;margin-top:4px;text-align:center;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:72px;color:var(--md-sys-color-on-surface-variant, #4b5563)}.pfx-micro-step__connector{flex:1 1 auto;height:2px;background:var(--md-sys-color-surface-container-high, #e5e7eb);margin-inline:8px;min-width:16px}.pfx-micro-step__connector[data-tone=success]{background:var(--p-table-state-success-fg, #168a4a)}.pfx-micro-step__connector[data-tone=warning]{background:var(--p-table-state-warning-fg, #b45f06)}.pfx-micro-step__connector[data-tone=danger],.pfx-micro-step__connector[data-tone=critical]{background:var(--p-table-state-danger-fg, #b3261e)}.pfx-micro-step__connector[data-tone=info]{background:var(--md-sys-color-primary, #2563eb)}.pfx-micro-viz[data-tone=success]{color:var(--p-table-state-success-fg, #168a4a)}.pfx-micro-viz[data-tone=warning]{color:var(--p-table-state-warning-fg, #b45f06)}.pfx-micro-viz[data-tone=danger],.pfx-micro-viz[data-tone=critical]{color:var(--p-table-state-danger-fg, #b3261e)}.pfx-micro-viz[data-tone=info]{color:var(--md-sys-color-primary, #2563eb)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz[data-tone=success]{color:var(--p-table-state-success-fg, #168a4a)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz[data-tone=warning]{color:var(--p-table-state-warning-fg, #b45f06)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz[data-tone=danger],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz[data-tone=critical]{color:var(--p-table-state-danger-fg, #b3261e)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz[data-tone=info]{color:var(--md-sys-color-primary, #2563eb)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz.pfx-micro-viz__delta{display:inline-flex;align-items:center;justify-content:flex-end;gap:5px;width:auto;min-width:0;font-weight:700;font-variant-numeric:tabular-nums;white-space:nowrap}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__delta-symbol{display:inline-grid;width:12px;min-width:12px;height:12px;min-height:12px;place-items:center;border-radius:0;background:transparent;font-size:11px;line-height:1;transform:translateY(-.5px)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz.pfx-micro-viz__radial,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz.pfx-micro-viz__harvey{display:inline-flex;align-items:center;justify-content:center;width:auto;min-width:0;height:auto;gap:8px}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz.pfx-micro-viz__radial{justify-content:flex-start;gap:7px}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-radial-svg{display:block;width:24px;height:24px;overflow:visible;flex:0 0 auto}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-radial-svg__track{fill:none;stroke:var(--pfx-micro-track-color, var(--md-sys-color-surface-container-high, #e5e7eb));stroke-width:3.4}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-radial-svg__bar{fill:none;stroke:currentColor;stroke-width:3.4;stroke-linecap:round;transform:rotate(-90deg);transform-origin:50% 50%}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-radial-svg__text{font-family:var(--md-sys-typescale-body-medium-font-family, sans-serif);font-size:8.5px;font-weight:700;text-anchor:middle;fill:currentColor}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-radial-value{color:currentColor;font-family:var(--md-sys-typescale-body-medium-font-family, sans-serif);font-size:12px;font-weight:700;font-variant-numeric:tabular-nums;line-height:1;white-space:nowrap}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-harvey-svg{display:block;width:26px;height:26px;overflow:visible;flex:0 0 auto}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-harvey-svg__track{fill:none;stroke:var(--pfx-micro-track-color, var(--md-sys-color-surface-container-high, #e5e7eb));stroke-width:2.4}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-harvey-svg__bar{fill:none;stroke:currentColor;stroke-width:16;transform:rotate(-90deg);transform-origin:50% 50%}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-harvey-fraction{display:inline-flex;align-items:center;font-family:var(--md-sys-typescale-body-medium-font-family, sans-serif);font-size:12px;font-variant-numeric:tabular-nums;white-space:nowrap}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-harvey-fraction strong{color:currentColor;font-weight:700}:host ::ng-deep .pfx-micro-viz-cell .pfx-separator{margin-inline:2px;color:var(--md-sys-color-on-surface-variant, #4b5563);opacity:.6}:host ::ng-deep .pfx-micro-viz-cell .pfx-total{color:var(--md-sys-color-on-surface-variant, #4b5563)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz.pfx-micro-viz__process{display:inline-flex;align-items:center;justify-content:center;width:100%;min-width:112px;overflow:hidden}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz-container{display:flex;align-items:center;gap:8px;width:100%;min-width:0}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz.pfx-micro-viz__line,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz.pfx-micro-viz__area,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz.pfx-micro-viz__column{display:block;flex:1 1 auto;width:100%;min-width:0;height:30px;overflow:visible}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-line__svg,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-area__svg,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-column__svg{display:block;width:100%;height:100%;overflow:visible}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-line__path,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-area__path{stroke:currentColor}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-area__fill{fill:currentColor}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-column__bar,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-trend__marker{fill:currentColor}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-column__bar[data-tone=success],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-trend__marker[data-tone=success]{fill:var(--p-table-state-success-fg, #168a4a)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-column__bar[data-tone=warning],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-trend__marker[data-tone=warning]{fill:var(--p-table-state-warning-fg, #b45f06)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-column__bar[data-tone=danger],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-column__bar[data-tone=critical],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-trend__marker[data-tone=danger],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-trend__marker[data-tone=critical]{fill:var(--p-table-state-danger-fg, #b3261e)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-column__bar[data-tone=info],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-trend__marker[data-tone=info]{fill:var(--md-sys-color-primary, #2563eb)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step{display:flex;align-items:center;flex:0 1 auto;min-width:0}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__node-wrapper{display:inline-flex;align-items:center;min-width:0}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__node{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;border-radius:50%;background:var(--md-sys-color-surface-container-high, #e5e7eb);color:var(--md-sys-color-on-surface, #1f2937);font-size:12px;font-weight:700;line-height:1;flex:0 0 auto}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__icon{font-size:15px;line-height:1}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__label{display:none}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__connector{flex:0 1 24px;min-width:12px;max-width:28px;height:2px;margin-inline:6px;background:var(--md-sys-color-surface-container-high, #e5e7eb)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__node[data-tone=success],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__connector[data-tone=success]{background:var(--p-table-state-success-fg, #168a4a)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__node[data-tone=warning],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__connector[data-tone=warning]{background:var(--p-table-state-warning-fg, #b45f06)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__node[data-tone=danger],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__node[data-tone=critical],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__connector[data-tone=danger],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__connector[data-tone=critical]{background:var(--p-table-state-danger-fg, #b3261e)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__node[data-tone=info],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__connector[data-tone=info]{background:var(--md-sys-color-primary, #2563eb)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__node[data-tone=success],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__node[data-tone=warning],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__node[data-tone=danger],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__node[data-tone=critical],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__node[data-tone=info]{color:var(--md-sys-color-on-primary, #ffffff)}.pfx-avatar{display:inline-flex;align-items:center;justify-content:center;background:var(--md-sys-color-surface-container);color:var(--md-sys-color-on-surface);border-radius:4px;overflow:hidden;font-weight:600}.pfx-avatar.shape-rounded{border-radius:8px}.pfx-avatar.shape-circle{border-radius:999px}.pfx-avatar--initials{text-transform:uppercase;font-size:12px}.pfx-cell-compose{display:inline-flex;align-items:center;gap:6px}.pfx-cell-compose.dir-col{flex-direction:column;align-items:stretch}.pfx-cell-compose.align-start{justify-content:flex-start}.pfx-cell-compose.align-center{justify-content:center}.pfx-cell-compose.align-end{justify-content:flex-end}.pfx-cell-compose.wrap{flex-wrap:wrap}.pfx-cell-compose.ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.px-scroll-viewport{width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;overscroll-behavior-x:contain;background:var(--p-table-bg);border-radius:12px 12px 0 0}.px-scroll-viewport:has(.mat-mdc-table.table-stack-top){border-top-left-radius:0;border-top-right-radius:0}.px-scroll-viewport.scroll-none{overflow-x:visible}.px-scroll-viewport.scroll-auto ::ng-deep .mat-mdc-table{width:max-content;min-width:100%}.px-scroll-viewport.scroll-wrap ::ng-deep .mat-mdc-header-cell,.px-scroll-viewport.scroll-wrap ::ng-deep .mat-mdc-cell{white-space:normal;text-overflow:initial}.px-scroll-viewport.scroll-wrap ::ng-deep .mat-mdc-table{width:100%}:host ::ng-deep .mat-mdc-header-row{position:sticky;top:0;z-index:var(--praxis-layer-sticky-local, 100);height:var(--p-table-header-height, var(--p-table-header-height-default, var(--mat-table-header-container-height, 40px)));min-height:var(--p-table-header-height, var(--p-table-header-height-default, var(--mat-table-header-container-height, 40px)));background:var(--p-table-header-bg);color:var(--p-table-header-fg);box-shadow:var(--p-table-header-shadow, 0 1px 0 var(--p-table-border-color));border-bottom:1px solid var(--p-table-border-color)}:host ::ng-deep .mat-mdc-header-cell{color:var(--p-table-header-fg);font-weight:600}:host ::ng-deep .mat-sort-header-content,:host ::ng-deep .mat-mdc-header-row .mat-icon{color:inherit;font-weight:600}:host ::ng-deep .mat-mdc-header-cell.mat-sort-header-sorted .mat-sort-header-arrow,:host ::ng-deep .mat-mdc-header-cell:hover .mat-sort-header-arrow{color:var(--p-table-header-fg)!important}:host ::ng-deep .mat-mdc-header-cell.mat-sort-header-sorted .mat-sort-header-arrow .mat-sort-header-indicator,:host ::ng-deep .mat-mdc-header-cell.mat-sort-header-sorted .mat-sort-header-arrow .mat-sort-header-stem,:host ::ng-deep .mat-mdc-header-cell.mat-sort-header-sorted .mat-sort-header-arrow .mat-sort-header-pointer,:host ::ng-deep .mat-mdc-header-cell.mat-sort-header-sorted .mat-sort-header-arrow .mat-sort-header-pointer-left,:host ::ng-deep .mat-mdc-header-cell.mat-sort-header-sorted .mat-sort-header-arrow .mat-sort-header-pointer-right{border-color:var(--p-table-header-fg)!important;background:var(--p-table-header-fg)!important}:host ::ng-deep .mat-mdc-header-cell{height:var(--p-table-header-height, var(--p-table-header-height-default, var(--mat-table-header-container-height, 40px)));padding:var(--p-header-padding, var(--p-header-padding-default, 12px 16px))!important;font-size:var(--p-header-font-size, var(--p-header-font-size-default, inherit));font-weight:var(--p-header-font-weight, 600);letter-spacing:var(--p-header-letter-spacing, normal);text-transform:var(--p-header-text-transform, none);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;position:relative}:host ::ng-deep .mat-mdc-header-cell.praxis-header-align-left .mat-sort-header-container{justify-content:flex-start}:host ::ng-deep .mat-mdc-header-cell.praxis-header-align-center .mat-sort-header-container{justify-content:center}:host ::ng-deep .mat-mdc-header-cell.praxis-header-align-right .mat-sort-header-container{justify-content:flex-end}:host ::ng-deep .mat-mdc-header-cell.praxis-header-align-left .praxis-header-label-text{text-align:left}:host ::ng-deep .mat-mdc-header-cell.praxis-header-align-center .praxis-header-label-text{text-align:center}:host ::ng-deep .mat-mdc-header-cell.praxis-header-align-right .praxis-header-label-text{text-align:right}:host ::ng-deep .pfx-column-drag-enabled .mat-mdc-header-cell.praxis-header-draggable .mat-sort-header-container{display:flex;align-items:center;width:100%;gap:4px}:host ::ng-deep .pfx-column-drag-enabled .mat-mdc-header-cell.praxis-header-draggable{-webkit-user-select:none;user-select:none}:host ::ng-deep .mat-mdc-header-cell .praxis-header-sort-trigger{display:block;width:100%;min-width:0}:host ::ng-deep .mat-mdc-header-cell.praxis-header-resizable{overflow:visible}:host ::ng-deep .mat-mdc-header-cell .praxis-column-resize-handle{position:absolute;z-index:2;inset-block:0;inset-inline-end:0;width:var(--p-table-column-resize-hit-area);cursor:col-resize;touch-action:none;-webkit-user-select:none;user-select:none}:host ::ng-deep .mat-mdc-header-cell .praxis-column-resize-handle:after{content:\"\";position:absolute;inset-block:6px;inset-inline-start:calc((var(--p-table-column-resize-hit-area) - var(--p-table-column-resize-line-width)) / 2);width:var(--p-table-column-resize-line-width);background:var(--p-table-column-resize-separator-color);opacity:.76;transition:background-color .12s ease,opacity .12s ease,transform .12s ease,inset-block .12s ease}:host ::ng-deep .mat-mdc-header-cell .praxis-column-resize-handle:focus-visible{outline:2px solid var(--p-table-column-resize-separator-hover-color);outline-offset:-2px}:host ::ng-deep .mat-mdc-header-cell.praxis-header-resizable:hover .praxis-column-resize-handle:after,:host ::ng-deep .mat-mdc-header-cell.praxis-header-resizable:focus-within .praxis-column-resize-handle:after,:host ::ng-deep .mat-mdc-header-cell .praxis-column-resize-handle:hover:after,:host ::ng-deep .mat-mdc-header-cell .praxis-column-resize-handle:focus-visible:after{background:var(--p-table-column-resize-separator-hover-color);opacity:1}:host ::ng-deep .mat-mdc-header-cell.praxis-header-resizing .praxis-column-resize-handle:after{background:var(--p-table-column-resize-active-color);inset-block:0;opacity:1;transform:scaleX(2)}:host ::ng-deep .pfx-column-resizing,:host ::ng-deep .pfx-column-resizing .mat-mdc-header-cell{cursor:col-resize}:host ::ng-deep .pfx-column-drag-enabled .mat-mdc-header-cell.praxis-header-draggable.cdk-drag-dragging{cursor:grabbing}:host ::ng-deep .pfx-column-drag-enabled .mat-mdc-header-cell.praxis-header-draggable .mat-sort-header-content{display:inline-flex;align-items:center;gap:4px;flex:1 1 auto;min-width:0;max-width:100%;overflow:hidden}:host ::ng-deep .pfx-column-drag-enabled .mat-mdc-header-cell .praxis-header-label{display:inline-flex;align-items:center;gap:4px;flex:1 1 auto;min-width:0}:host ::ng-deep .pfx-column-drag-enabled .mat-mdc-header-cell .praxis-header-label-text{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}:host ::ng-deep .pfx-column-drag-indicator .cdk-drop-list-dragging .mat-mdc-header-cell:not(.cdk-drag-placeholder){transition:transform var(--p-table-reorder-transition-duration, .18s) var(--p-table-motion-easing, cubic-bezier(0, 0, .2, 1))}:host ::ng-deep .pfx-column-drag-indicator .mat-mdc-header-cell.cdk-drag-animating{transition:transform var(--p-table-reorder-transition-duration, .16s) var(--p-table-motion-easing, cubic-bezier(0, 0, .2, 1))}.pfx-column-drag-preview{box-sizing:border-box;display:flex;align-items:center;border-radius:10px;border:1px solid var(--p-table-border-color);background:linear-gradient(135deg,var(--p-table-header-bg) 0%,var(--p-table-row-hover-bg) 100%);color:var(--p-table-header-fg);box-shadow:var(--p-table-drag-preview-shadow);transform:scale(var(--p-table-drag-preview-scale, 1.01));pointer-events:none;z-index:var(--praxis-layer-authoring-hover, 300)}.pfx-column-drag-preview-custom{height:100%;padding:var(--p-header-padding, var(--p-header-padding-default, 12px 16px))}.pfx-column-drag-preview .mat-sort-header-arrow,.pfx-column-drag-preview .mat-sort-header-indicator,.pfx-column-drag-preview .mat-sort-header-stem,.pfx-column-drag-preview .mat-sort-header-pointer,.pfx-column-drag-preview .mat-sort-header-pointer-left,.pfx-column-drag-preview .mat-sort-header-pointer-right{display:none!important}.pfx-column-drag-preview .mat-sort-header-container{display:flex;align-items:center;width:100%;min-height:100%;padding-right:0!important}.pfx-column-drag-preview .praxis-header-sort-trigger{display:block;width:100%;min-width:0}.pfx-column-drag-preview .mat-sort-header-content,.pfx-column-drag-preview .praxis-header-label{display:inline-flex;align-items:center;flex:1 1 auto;min-width:0;width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pfx-column-drag-preview.praxis-header-align-left .mat-sort-header-container,.pfx-column-drag-preview.praxis-header-align-left,.pfx-column-drag-preview.praxis-header-align-left .mat-sort-header-content,.pfx-column-drag-preview.praxis-header-align-left .praxis-header-label{justify-content:flex-start}.pfx-column-drag-preview.praxis-header-align-center .mat-sort-header-container,.pfx-column-drag-preview.praxis-header-align-center,.pfx-column-drag-preview.praxis-header-align-center .mat-sort-header-content,.pfx-column-drag-preview.praxis-header-align-center .praxis-header-label{justify-content:center}.pfx-column-drag-preview.praxis-header-align-right .mat-sort-header-container,.pfx-column-drag-preview.praxis-header-align-right,.pfx-column-drag-preview.praxis-header-align-right .mat-sort-header-content,.pfx-column-drag-preview.praxis-header-align-right .praxis-header-label{justify-content:flex-end}.pfx-column-drag-preview.praxis-header-align-right .mat-sort-header-content{flex:0 1 auto;width:auto;margin-inline-start:auto}.pfx-column-drag-preview.praxis-header-align-right .praxis-header-label{width:auto}.pfx-column-drag-preview.praxis-header-align-left .praxis-header-label-text{text-align:left}.pfx-column-drag-preview.praxis-header-align-center .praxis-header-label-text{text-align:center}.pfx-column-drag-preview.praxis-header-align-right .praxis-header-label-text{text-align:right}:host ::ng-deep .pfx-column-drag-indicator .cdk-drag-placeholder{opacity:1;border:1px dashed var(--p-table-border-color);background:var(--p-table-row-hover-bg)}:host ::ng-deep .pfx-column-drag-indicator .cdk-drag-placeholder *{opacity:0}:host ::ng-deep .pfx-column-drag-indicator .mat-mdc-header-cell.cdk-drag-dragging{opacity:.58}@media(prefers-reduced-motion:reduce){:host ::ng-deep .pfx-column-drag-indicator .cdk-drop-list-dragging .mat-mdc-header-cell:not(.cdk-drag-placeholder){transition:none}.pfx-column-drag-preview{transition:none;transform:none}.praxis-column-reorder-status{animation:none}.pfx-expansion-detail-panel{animation:none!important;transition:none!important;transform:none!important}:host ::ng-deep .mat-mdc-row{transition:none}:host ::ng-deep .mat-mdc-table{transition:none}}.praxis-actions-header{text-align:right}.praxis-actions-header.align-start{text-align:left}.praxis-actions-header.align-center{text-align:center}.praxis-actions-header.align-end{text-align:right}.praxis-actions-header .praxis-actions-header__content{display:inline-flex;align-items:center;gap:var(--p-actions-header-gap, 6px);justify-content:center;max-width:100%;min-width:0;white-space:nowrap;color:var(--p-actions-header-color, inherit)}.praxis-actions-header .praxis-actions-header__content .mat-icon{font-size:18px;width:18px;height:18px;line-height:18px}.praxis-actions-header .praxis-actions-header__label{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@media(max-width:640px){.praxis-actions-header .praxis-actions-header__label{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap}}:host ::ng-deep .mat-mdc-header-cell .mat-sort-header-container{box-sizing:border-box;padding-inline-end:0;position:static}:host ::ng-deep .pfx-column-drag-enabled .mat-mdc-header-cell.praxis-header-draggable .mat-sort-header-container{padding-inline-end:0}:host ::ng-deep .mat-mdc-header-cell.praxis-header-resizable:not(.praxis-header-align-right) .mat-sort-header-container{padding-inline-end:calc(var(--p-table-column-resize-hit-area) + 8px)}:host ::ng-deep .mat-mdc-header-cell.praxis-header-resizable.praxis-header-align-center .mat-sort-header-container{padding-inline-start:calc(var(--p-table-column-resize-hit-area) + 8px)}:host ::ng-deep .mat-mdc-header-cell.praxis-header-resizable.praxis-header-align-right .mat-sort-header-container{padding-inline-end:0}:host ::ng-deep .mat-mdc-header-cell.praxis-header-resizable:not(.praxis-header-align-right) .mat-sort-header-content{box-sizing:border-box;padding-inline-end:18px}:host ::ng-deep .mat-mdc-header-cell.praxis-header-resizable.praxis-header-align-center .mat-sort-header-content{padding-inline-start:0;padding-inline-end:0}:host ::ng-deep .mat-mdc-header-cell.praxis-header-resizable.praxis-header-align-right .mat-sort-header-content{box-sizing:border-box;flex:0 1 auto;width:auto;padding-inline-start:0;padding-inline-end:0}:host ::ng-deep .mat-mdc-header-cell.praxis-header-resizable.praxis-header-align-right .praxis-header-label{width:auto}:host ::ng-deep .mat-mdc-header-cell .mat-sort-header-arrow{position:absolute;inset-inline-end:var(--p-table-sort-arrow-overlay-inset, 2px);top:50%;margin:0;transform:translateY(-50%)}:host ::ng-deep .mat-mdc-header-cell.praxis-header-resizable:not(.praxis-header-align-right) .mat-sort-header-arrow{inset-inline-end:calc(var(--p-table-column-resize-hit-area) + 2px)}:host ::ng-deep .mat-mdc-header-cell.praxis-header-align-right .mat-sort-header-arrow{position:static;order:-1;flex:0 0 auto;margin-inline:0 4px;transform:none}:host ::ng-deep .mat-mdc-cell{color:var(--p-table-text-color);height:var(--p-table-row-height, var(--p-table-row-height-default, 44px));padding:var(--p-cell-padding, var(--p-cell-padding-default, 10px 14px));font-size:var(--p-cell-font-size, var(--p-cell-font-size-default, inherit));line-height:1.25;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}:host ::ng-deep .mat-mdc-cell .pfx-cell-content,:host ::ng-deep .mat-cell .pfx-cell-content{display:inline-flex;align-items:center;gap:6px;width:100%;min-width:0;overflow:hidden}:host ::ng-deep .pfx-cell-content.pfx-cell-anim{animation-duration:var(--pfx-cell-anim-duration, .8s);animation-delay:var(--pfx-cell-anim-delay, 0ms);animation-fill-mode:both;animation-timing-function:ease-in-out}:host ::ng-deep .pfx-cell-content.pfx-cell-anim.pfx-cell-anim--once{animation-iteration-count:1}:host ::ng-deep .pfx-cell-content.pfx-cell-anim.pfx-cell-anim--loop{animation-iteration-count:infinite}:host ::ng-deep .pfx-cell-content.pfx-cell-anim.pfx-cell-anim--count{animation-iteration-count:var(--pfx-cell-anim-iteration-count, 1)}:host ::ng-deep .pfx-cell-content.pfx-cell-anim.pfx-cell-anim--on-hover{animation-play-state:paused}:host ::ng-deep .mat-mdc-cell:hover .pfx-cell-content.pfx-cell-anim.pfx-cell-anim--on-hover,:host ::ng-deep .mat-cell:hover .pfx-cell-content.pfx-cell-anim.pfx-cell-anim--on-hover{animation-play-state:running}:host ::ng-deep .pfx-cell-content.pfx-cell-anim.pfx-cell-anim--pulse{animation-name:pfx-cell-pulse}:host ::ng-deep .pfx-cell-content.pfx-cell-anim.pfx-cell-anim--blink{animation-name:pfx-cell-blink}:host ::ng-deep .pfx-cell-content.pfx-cell-anim.pfx-cell-anim--grow{animation-name:pfx-cell-grow}:host ::ng-deep .pfx-cell-content.pfx-cell-anim.pfx-cell-anim--fade{animation-name:pfx-cell-fade}:host ::ng-deep .pfx-cell-content.pfx-cell-anim.pfx-cell-anim--slide-in{animation-name:pfx-cell-slide-in}:host ::ng-deep .pfx-cell-content.pfx-cell-anim.pfx-cell-anim--border-pulse{animation-name:pfx-cell-border-pulse}@keyframes pfx-cell-pulse{0%{transform:scale(1)}50%{transform:scale(var(--pfx-cell-anim-scale-peak, 1.015))}to{transform:scale(1)}}@keyframes pfx-cell-blink{0%,49%{opacity:1}50%,to{opacity:var(--pfx-cell-anim-min-opacity, .35)}}@keyframes pfx-cell-grow{0%{transform:scale(.985)}to{transform:scale(1)}}@keyframes pfx-cell-fade{0%{opacity:0}to{opacity:1}}@keyframes pfx-cell-slide-in{0%{opacity:0;transform:translateY(var(--pfx-cell-anim-slide-distance, 4px))}to{opacity:1;transform:translateY(0)}}@keyframes pfx-cell-border-pulse{0%,to{box-shadow:inset 0 0 rgba(var(--pfx-cell-anim-border-rgb, 25, 118, 210),0)}50%{box-shadow:inset 0 0 0 2px rgba(var(--pfx-cell-anim-border-rgb, 25, 118, 210),var(--pfx-cell-anim-border-strength, .3))}}:host ::ng-deep .mat-mdc-row.pfx-row-anim{animation-duration:var(--pfx-row-anim-duration, .8s);animation-delay:var(--pfx-row-anim-delay, 0ms);animation-fill-mode:both;animation-timing-function:ease-in-out}:host ::ng-deep .mat-mdc-row.pfx-row-anim.pfx-row-anim--once{animation-iteration-count:1}:host ::ng-deep .mat-mdc-row.pfx-row-anim.pfx-row-anim--loop{animation-iteration-count:infinite}:host ::ng-deep .mat-mdc-row.pfx-row-anim.pfx-row-anim--count{animation-iteration-count:var(--pfx-row-anim-iteration-count, 1)}:host ::ng-deep .mat-mdc-row.pfx-row-anim.pfx-row-anim--on-hover{animation-play-state:paused}:host ::ng-deep .mat-mdc-row.pfx-row-anim.pfx-row-anim--on-hover:hover{animation-play-state:running}:host ::ng-deep .mat-mdc-row.pfx-row-anim.pfx-row-anim--pulse{animation-name:pfx-row-pulse}:host ::ng-deep .mat-mdc-row.pfx-row-anim.pfx-row-anim--blink{animation-name:pfx-row-blink}:host ::ng-deep .mat-mdc-row.pfx-row-anim.pfx-row-anim--grow{animation-name:pfx-row-grow}:host ::ng-deep .mat-mdc-row.pfx-row-anim.pfx-row-anim--fade{animation-name:pfx-row-fade}:host ::ng-deep .mat-mdc-row.pfx-row-anim.pfx-row-anim--slide-in{animation-name:pfx-row-slide-in}:host ::ng-deep .mat-mdc-row.pfx-row-anim.pfx-row-anim--border-pulse{animation-name:pfx-row-border-pulse}@keyframes pfx-row-pulse{0%{transform:scale(1)}50%{transform:scale(var(--pfx-row-anim-scale-peak, 1.015))}to{transform:scale(1)}}@keyframes pfx-row-blink{0%,49%{opacity:1}50%,to{opacity:var(--pfx-row-anim-min-opacity, .35)}}@keyframes pfx-row-grow{0%{transform:scale(.985)}to{transform:scale(1)}}@keyframes pfx-row-fade{0%{opacity:0}to{opacity:1}}@keyframes pfx-row-slide-in{0%{opacity:0;transform:translateY(var(--pfx-row-anim-slide-distance, 4px))}to{opacity:1;transform:translateY(0)}}@keyframes pfx-row-border-pulse{0%,to{box-shadow:inset 0 0 rgba(var(--pfx-row-anim-border-rgb, 25, 118, 210),0)}50%{box-shadow:inset 0 0 0 2px rgba(var(--pfx-row-anim-border-rgb, 25, 118, 210),var(--pfx-row-anim-border-strength, .3))}}@media(prefers-reduced-motion:reduce){:host ::ng-deep .pfx-cell-content.pfx-cell-anim,:host ::ng-deep .mat-mdc-row.pfx-row-anim{animation:none!important}}:host ::ng-deep .mat-mdc-row:hover{background:var(--p-table-row-hover-bg)}:host ::ng-deep .mat-mdc-row{height:var(--p-table-row-height, var(--p-table-row-height-default, 44px));min-height:var(--p-table-row-height, var(--p-table-row-height-default, 44px));transition:background-color var(--p-table-hover-transition-duration, .18s) var(--p-table-motion-easing, cubic-bezier(0, 0, .2, 1)),box-shadow var(--p-table-selection-transition-duration, .18s) var(--p-table-motion-easing, cubic-bezier(0, 0, .2, 1))}:host ::ng-deep .mat-mdc-row.pfx-row-click-selectable{cursor:pointer}:host ::ng-deep .mat-mdc-row:nth-child(2n){background:var(--p-table-row-even-bg)}:host ::ng-deep .mat-mdc-row:nth-child(2n):hover{background:var(--p-table-row-hover-bg)}:host ::ng-deep .mat-mdc-row.pfx-row-selected,:host ::ng-deep .mat-mdc-row.pfx-row-selected:hover{background:var(--p-table-row-selected-bg)}:host ::ng-deep .mat-mdc-row.pfx-row-selected .mat-mdc-cell{background:var(--p-table-row-selected-bg);color:var(--p-table-row-selected-fg);font-weight:var(--p-table-row-selected-font-weight)}:host ::ng-deep .mat-mdc-row.pfx-row-selected .mat-mdc-cell:first-child{position:relative}:host ::ng-deep .mat-mdc-row.pfx-row-selected .mat-mdc-cell:first-child:before{content:\"\";position:absolute;inset:0 auto 0 0;width:4px;border-radius:0 4px 4px 0;background:var(--p-table-row-selected-indicator);pointer-events:none}:host.row-borders ::ng-deep .mat-mdc-row .mat-mdc-cell{border-bottom:1px solid var(--p-table-border-color)}:host.row-borders ::ng-deep .mat-mdc-header-row .mat-mdc-header-cell{border-bottom:none}:host.col-borders ::ng-deep .mat-mdc-header-row .mat-mdc-header-cell,:host.col-borders ::ng-deep .mat-mdc-row .mat-mdc-cell{border-right:1px solid var(--p-table-border-color)}:host.col-borders ::ng-deep .mat-mdc-header-row .mat-mdc-header-cell:last-child,:host.col-borders ::ng-deep .mat-mdc-row .mat-mdc-cell:last-child{border-right:none}.ptable-error{display:flex;align-items:center;gap:12px;padding:12px;margin:8px 0;border:1px solid var(--md-sys-color-error);border-radius:8px}.ptable-error__content{flex:1}.ptable-error__title{font-weight:600}.ptable-info-banner{display:flex;gap:12px;align-items:center;padding:8px 12px;margin:8px 0;border-radius:8px;border:1px solid var(--md-sys-color-primary);background:var(--md-sys-color-primary-container);color:var(--md-sys-color-on-primary-container)}.ptable-info-banner .text{flex:1;font-weight:600}.ptable-info-banner .actions{display:flex;gap:8px}.pfx-cell-image{display:inline-block;vertical-align:middle;background:var(--md-sys-color-surface-variant);border:1px solid var(--md-sys-color-outline-variant)}.pfx-cell-image.shape-rounded{border-radius:8px}.pfx-cell-image.shape-circle{border-radius:9999px}.pfx-badge{display:inline-flex;align-items:center;gap:6px;line-height:1;padding:4px 8px;border-radius:9999px;font-size:12px;font-weight:600;border:1px solid transparent;white-space:nowrap;--prx-rich-content-inline-gap: 6px}.pfx-badge .pfx-badge-icon{font-size:16px;width:16px;height:16px}.pfx-badge--plain{background:transparent;border-color:transparent;color:inherit}.pfx-badge--filled-primary{background:var(--md-sys-color-primary);color:var(--md-sys-color-on-primary)}.pfx-badge--filled-accent{background:var(--md-sys-color-secondary);color:var(--md-sys-color-on-secondary)}.pfx-badge--filled-warn,.pfx-badge--filled-danger{background:var(--md-sys-color-error);color:var(--md-sys-color-on-error)}.pfx-badge--filled-success{background:var(--p-table-state-success-bg);color:var(--p-table-state-success-fg)}.pfx-badge--filled-info{background:var(--md-sys-color-tertiary);color:var(--md-sys-color-on-tertiary)}.pfx-badge--filled-basic{background:var(--md-sys-color-surface-container-highest);color:var(--md-sys-color-on-surface);border-color:var(--md-sys-color-outline-variant)}.pfx-badge--outlined{background:transparent;border-color:var(--md-sys-color-outline-variant);color:inherit}.pfx-badge--soft-primary{background:var(--p-table-badge-soft-primary-bg);color:var(--p-table-badge-soft-primary-fg)}.pfx-badge--soft-accent{background:var(--p-table-badge-soft-accent-bg);color:var(--p-table-badge-soft-accent-fg)}.pfx-badge--soft-warn{background:var(--p-table-badge-soft-warn-bg);color:var(--p-table-badge-soft-warn-fg)}.pfx-badge--soft-danger{background:color-mix(in srgb,var(--p-table-state-danger-bg) 72%,transparent);color:var(--p-table-state-danger-fg);border-color:color-mix(in srgb,var(--p-table-state-danger-fg) 18%,transparent)}.pfx-badge--soft-success{background:color-mix(in srgb,var(--p-table-state-success-bg) 72%,transparent);color:var(--p-table-state-success-fg);border-color:color-mix(in srgb,var(--p-table-state-success-fg) 18%,transparent)}.pfx-badge--soft-info{background:color-mix(in srgb,var(--md-sys-color-tertiary-container) 72%,transparent);color:var(--md-sys-color-on-tertiary-container);border-color:color-mix(in srgb,var(--md-sys-color-tertiary) 18%,transparent)}.pfx-badge--soft-basic{background:color-mix(in srgb,var(--md-sys-color-surface-container-highest) 82%,transparent);color:color-mix(in srgb,var(--md-sys-color-on-surface) 76%,transparent);border-color:color-mix(in srgb,var(--md-sys-color-outline-variant) 65%,transparent)}.row--success,.row--success td,td.row--success{background-color:var(--p-table-state-success-bg)!important;color:var(--p-table-state-success-fg)!important}.row--warning,.row--warning td,td.row--warning{background-color:var(--p-table-state-warning-bg)!important;color:var(--p-table-state-warning-fg)!important}.row--danger,.row--danger td,td.row--danger{background-color:var(--p-table-state-danger-bg)!important;color:var(--p-table-state-danger-fg)!important}.row--highlight,.row--highlight td,td.row--highlight{background-color:var(--p-table-state-highlight-bg)!important;color:var(--p-table-state-highlight-fg)!important;font-weight:600}.row--muted,.row--muted td,td.row--muted{opacity:.7;filter:saturate(.6)}.pfx-expansion-node-embed{display:flex;flex-direction:column;gap:12px;padding:16px;border:1px solid var(--md-sys-color-outline-variant);border-radius:16px;background:var(--md-sys-color-surface-container-low, var(--md-sys-color-surface))}.ptable-loading-state{padding:8px 12px 4px;display:grid;gap:10px}.ptable-loading-state__hero{display:grid;gap:10px;padding:14px;border-radius:8px;border:1px solid rgba(18,99,180,.08);background:linear-gradient(180deg,#ffffffa6,#ffffff47),linear-gradient(0deg,#1263b408,#1263b400)}.ptable-loading-state__rows{display:grid;gap:8px}.ptable-loading-state__row{display:grid;grid-template-columns:96px minmax(0,1fr) minmax(140px,1.2fr);gap:8px}.ptable-loading-state__line,.ptable-loading-state__cell{display:block;height:12px;border-radius:999px;background:linear-gradient(90deg,#1263b414,#1263b42e,#1263b414);background-size:200% 100%;animation:ptable-loading-wave 1.2s ease-in-out infinite}.ptable-loading-state__line--wide{width:180px}.ptable-loading-state__line--short{width:96px}.ptable-loading-state__cell--short{width:100%;max-width:84px}.ptable-loading-state__cell--wide{width:100%}.ptable-loading-state__message{font-size:.85rem;color:var(--md-sys-color-on-surface-variant, #5a5d67);padding-inline:4px}.pfx-expansion-node-embed__header,.pfx-expansion-node-embed__meta,.pfx-expansion-node-embed__empty,.pfx-expansion-node-embed__diagram-label{display:block}.pfx-expansion-node-embed--inline{min-width:0}.pfx-expansion-node-embed--chart praxis-chart{display:block;min-height:280px}.ptable-no-data-state{padding:8px 12px 4px}.ptable-no-data-state ::ng-deep .empty-card{margin:0;border-radius:8px}@keyframes ptable-loading-wave{0%{background-position:100% 0}to{background-position:-100% 0}}.pfx-expansion-node-embed__diagram{display:flex;flex-direction:column;gap:8px}.pfx-expansion-node-embed__diagram-source{margin:0;padding:12px;overflow:auto;border-radius:12px;border:1px solid var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface-container-highest, var(--md-sys-color-surface));color:var(--md-sys-color-on-surface);font-family:Consolas,Courier New,monospace;font-size:12px;line-height:1.4;white-space:pre-wrap}.pfx-expansion-node-embed__action-btn{align-self:flex-start}.pfx-expansion-node-embed__action-host{display:inline-flex}.praxis-table-columns-menu{max-height:320px;overflow-y:auto;padding:8px 0}.praxis-table-column-menu-item{display:flex!important;align-items:center;width:100%;box-sizing:border-box;padding:6px 16px;min-height:40px}.praxis-table-column-menu-item mat-checkbox{width:100%}\n"] }]
|
|
55811
|
+
], template: "@if (shouldShowEmptyState()) {\n <praxis-empty-state-card\n icon=\"link\"\n [title]=\"'Escolha o recurso da tabela'\"\n [description]=\"'Selecione um recurso da API para carregar colunas, registros e a\u00E7\u00F5es da tabela automaticamente.'\"\n [primaryAction]=\"{ label: 'Selecionar recurso', icon: 'bolt', action: openQuickConnect.bind(this) }\"\n ></praxis-empty-state-card>\n}\n\n<!-- Error State with Quick Connect CTA -->\n@if (isRemoteMode() && (schemaError || dataError)) {\n <div class=\"ptable-error\" role=\"alert\" aria-live=\"assertive\">\n <mat-icon color=\"warn\" aria-hidden=\"true\">error</mat-icon>\n <div class=\"ptable-error__content\">\n <praxis-rich-content\n rootClassName=\"ptable-error__title\"\n [nodes]=\"getTableChromeTextRichContentNodes('Erro', 'ptable-error__title-text')\"\n ></praxis-rich-content>\n <praxis-rich-content\n rootClassName=\"ptable-error__message\"\n [nodes]=\"getTableChromeTextRichContentNodes(errorMessage || 'Ocorreu um erro ao carregar a tabela.', 'ptable-error__message-text')\"\n ></praxis-rich-content>\n </div>\n <button mat-flat-button color=\"primary\" (click)=\"openQuickConnect()\">\n <mat-icon>bolt</mat-icon>\n <praxis-rich-content\n rootClassName=\"ptable-error__action-label\"\n [nodes]=\"getTableChromeTextRichContentNodes('Selecionar recurso', 'ptable-error__action-label-text')\"\n ></praxis-rich-content>\n </button>\n @if (enableCustomization) {\n <button\n mat-icon-button\n color=\"primary\"\n data-role=\"table-settings\"\n data-testid=\"table-settings-trigger\"\n (click)=\"openTableSettings()\"\n [attr.aria-label]=\"getTableSettingsLabel()\"\n [matTooltip]=\"getTableSettingsLabel()\"\n matTooltipPosition=\"below\"\n >\n <mat-icon>settings</mat-icon>\n </button>\n }\n @if (!schemaError) {\n <button mat-stroked-button (click)=\"retryData()\">\n <praxis-rich-content\n rootClassName=\"ptable-error__action-label\"\n [nodes]=\"getTableChromeTextRichContentNodes('Tentar novamente', 'ptable-error__action-label-text')\"\n ></praxis-rich-content>\n </button>\n }\n @if (schemaError) {\n <button mat-stroked-button (click)=\"reloadSchema()\">\n <praxis-rich-content\n rootClassName=\"ptable-error__action-label\"\n [nodes]=\"getTableChromeTextRichContentNodes('Recarregar colunas', 'ptable-error__action-label-text')\"\n ></praxis-rich-content>\n </button>\n }\n </div>\n}\n\n<!-- Inline banner for schema change (only in edit mode) -->\n@if (shouldShowOutdatedInline()) {\n <div class=\"ptable-info-banner\" role=\"status\" aria-live=\"polite\">\n <praxis-rich-content\n rootClassName=\"text\"\n [nodes]=\"getTableChromeTextRichContentNodes('O schema do servidor mudou. Reconciliar agora?', 'ptable-info-banner__text')\"\n ></praxis-rich-content>\n <div class=\"actions\">\n <button mat-stroked-button color=\"primary\" (click)=\"onReconcileRequested()\">\n <mat-icon>sync</mat-icon>\n <praxis-rich-content\n rootClassName=\"ptable-info-banner__action-label\"\n [nodes]=\"getTableChromeTextRichContentNodes('Reconciliar', 'ptable-info-banner__action-label-text')\"\n ></praxis-rich-content>\n </button>\n <button mat-button (click)=\"onSnoozeOutdated()\">\n <praxis-rich-content\n rootClassName=\"ptable-info-banner__action-label\"\n [nodes]=\"getTableChromeTextRichContentNodes('Lembrar depois', 'ptable-info-banner__action-label-text')\"\n ></praxis-rich-content>\n </button>\n <button mat-button (click)=\"onIgnoreOutdated()\">\n <praxis-rich-content\n rootClassName=\"ptable-info-banner__action-label\"\n [nodes]=\"getTableChromeTextRichContentNodes('Ignorar', 'ptable-info-banner__action-label-text')\"\n ></praxis-rich-content>\n </button>\n </div>\n </div>\n}\n\n@if (isAiAssistantEnabled() && aiAssistantOpen && aiAssistantViewState) {\n <praxis-ai-assistant-shell\n [labels]=\"aiAssistantLabels\"\n [mode]=\"aiAssistantViewState.mode\"\n [state]=\"aiAssistantViewState.state\"\n [contextItems]=\"aiAssistantViewState.contextItems\"\n [attachments]=\"aiAssistantViewState.attachments\"\n [messages]=\"aiAssistantViewState.messages\"\n [quickReplies]=\"aiAssistantViewState.quickReplies\"\n [recommendedIntents]=\"getAiAssistantRecommendedIntents()\"\n [prompt]=\"aiAssistantPrompt\"\n [statusText]=\"aiAssistantViewState.statusText\"\n [errorText]=\"aiAssistantViewState.errorText\"\n [busy]=\"aiAssistantViewState.state === 'processing' || aiAssistantViewState.state === 'applying'\"\n [canApply]=\"aiAssistantViewState.canApply\"\n [showAttachAction]=\"false\"\n [enablePastedAttachments]=\"false\"\n [voiceInputMode]=\"aiAssistantVoiceInputMode\"\n [voiceLanguage]=\"aiAssistantVoiceLanguage\"\n [layout]=\"aiAssistantLayout\"\n testIdPrefix=\"table-ai-assistant\"\n panelTestId=\"table-ai-assistant-panel\"\n submitTestId=\"table-ai-assistant-submit\"\n applyTestId=\"table-ai-assistant-apply\"\n (promptChange)=\"onAiAssistantPromptChange($event)\"\n (submitPrompt)=\"onAiAssistantSubmit($event)\"\n (apply)=\"onAiAssistantApply()\"\n (retryTurn)=\"onAiAssistantRetry()\"\n (cancelTurn)=\"onAiAssistantCancel()\"\n (quickReply)=\"onAiAssistantQuickReply($event)\"\n (recommendedIntent)=\"onAiAssistantRecommendedIntent($event)\"\n (editMessage)=\"onAiAssistantEditMessage($event)\"\n (resendMessage)=\"onAiAssistantResendMessage($event)\"\n (layoutChange)=\"onAiAssistantLayoutChange($event)\"\n (close)=\"closeAiAssistant()\"\n ></praxis-ai-assistant-shell>\n}\n\n@if (shouldRenderDataSurface() && !schemaError && !dataError && toolbarV2) {\n <div class=\"praxis-table-header\" [class.edit-mode]=\"enableCustomization\" [class.stacked]=\"hasTopToolbarStack()\">\n @if (showToolbar && shouldShowToolbarTopPlacement()) {\n <praxis-table-toolbar\n class=\"praxis-toolbar-stack-top\"\n [config]=\"config\"\n [backgroundColor]=\"getToolbarActionsBackgroundColor()\"\n [style.--pfx-filter-h]=\"getToolbarLayoutHeightHostStyle()\"\n [evaluationContext]=\"getToolbarEvaluationContext()\"\n [columnVisibilityController]=\"toolbarColumnVisibilityController\"\n [showActionsGroup]=\"shouldShowToolbarActionsTop()\"\n [showMobileActions]=\"shouldShowToolbarActionsTop()\"\n [exportBusy]=\"exportBusy\"\n (toolbarAction)=\"onToolbarAction($event)\"\n (exportAction)=\"onExportAction($event)\"\n >\n @if (shouldRenderAdvancedFilter()) {\n <praxis-filter\n advancedFilter\n [resourcePath]=\"getAdvancedFilterResourcePath()\"\n [filterId]=\"tableId\"\n [formId]=\"tableId\"\n [persistenceKey]=\"getAdvancedFilterPersistenceKey()\"\n [fieldMetadata]=\"getAdvancedFilterFieldMetadata()\"\n [enableCustomization]=\"enableCustomization\"\n [value]=\"advancedFilterValue\"\n\n [alwaysVisibleFields]=\"getAdvancedFilterAlwaysVisibleFields()\"\n [alwaysVisibleFieldMetadataOverrides]=\"getAdvancedFilterAlwaysVisibleFieldMetadataOverrides()\"\n [selectedFieldIds]=\"config.behavior?.filtering?.advancedFilters?.settings?.selectedFieldIds ?? []\"\n [allowSaveTags]=\"config.behavior?.filtering?.advancedFilters?.settings?.allowSaveTags\"\n [changeDebounceMs]=\"config.behavior?.filtering?.advancedFilters?.settings?.changeDebounceMs ?? 300\"\n [i18n]=\"getFilterI18n()\"\n [mode]=\"'filter'\"\n [showFilterSettings]=\"enableCustomization\"\n (change)=\"onAdvancedFilterChange($event)\"\n (requestSearch)=\"onAdvancedFilterSubmit($event)\"\n (clear)=\"onAdvancedFilterClear()\"\n ></praxis-filter>\n }\n <ng-content select=\"[advancedFilter]\" />\n <ng-content select=\"[toolbar]\" />\n\n <!-- AI Assistant in Toolbar -->\n @if (shouldShowAiAssistantEntrypoint()) {\n <button\n end-actions\n mat-icon-button\n color=\"primary\"\n type=\"button\"\n class=\"praxis-table-ai-trigger praxis-table-toolbar-action--ai\"\n [class.praxis-table-ai-trigger--minimized]=\"hasMinimizedAiAssistantSession()\"\n [attr.data-testid]=\"aiAssistantTriggerTestId('toolbar-top')\"\n (click)=\"openAiAssistant()\"\n [attr.aria-label]=\"aiAssistantTriggerLabel()\"\n [matBadge]=\"aiAssistantTriggerBadge()\"\n [matBadgeHidden]=\"!hasMinimizedAiAssistantSession()\"\n matBadgeColor=\"accent\"\n matBadgeSize=\"small\"\n matBadgePosition=\"above after\"\n [matTooltip]=\"aiAssistantTriggerTooltip()\"\n matTooltipPosition=\"below\"\n >\n <mat-icon>{{ aiAssistantTriggerIcon() }}</mat-icon>\n </button>\n }\n\n @if (enableCustomization) {\n <button end-actions mat-icon-button color=\"primary\" class=\"praxis-table-toolbar-action--configuration\" data-role=\"table-settings\" data-testid=\"table-settings-trigger\"\n (click)=\"openTableSettings()\" [attr.aria-label]=\"getTableSettingsLabel()\"\n [matBadge]=\"schemaOutdated ? '!' : ''\"\n [matBadgeHidden]=\"!schemaOutdated\"\n matBadgeColor=\"warn\" matBadgeSize=\"small\" matBadgePosition=\"above after\"\n [matTooltip]=\"getTableSettingsTooltip()\"\n matTooltipPosition=\"below\">\n <mat-icon>settings</mat-icon>\n </button>\n }\n </praxis-table-toolbar>\n }\n @if (!showToolbar && enableCustomization) {\n <div class=\"ptable-header-actions\">\n @if (shouldShowAiAssistantEntrypoint()) {\n <button\n mat-icon-button\n color=\"primary\"\n type=\"button\"\n class=\"praxis-table-ai-trigger praxis-table-toolbar-action--ai\"\n [class.praxis-table-ai-trigger--minimized]=\"hasMinimizedAiAssistantSession()\"\n [attr.data-testid]=\"aiAssistantTriggerTestId('header-top')\"\n (click)=\"openAiAssistant()\"\n [attr.aria-label]=\"aiAssistantTriggerLabel()\"\n [matBadge]=\"aiAssistantTriggerBadge()\"\n [matBadgeHidden]=\"!hasMinimizedAiAssistantSession()\"\n matBadgeColor=\"accent\"\n matBadgeSize=\"small\"\n matBadgePosition=\"above after\"\n [matTooltip]=\"aiAssistantTriggerTooltip()\"\n matTooltipPosition=\"below\"\n >\n <mat-icon>{{ aiAssistantTriggerIcon() }}</mat-icon>\n </button>\n }\n <button mat-icon-button color=\"primary\" class=\"praxis-table-toolbar-action--configuration\" data-role=\"table-settings\" data-testid=\"table-settings-trigger\" (click)=\"openTableSettings()\" [attr.aria-label]=\"getTableSettingsLabel()\"\n [matBadge]=\"schemaOutdated ? '!' : ''\"\n [matBadgeHidden]=\"!schemaOutdated\"\n matBadgeColor=\"warn\" matBadgeSize=\"small\" matBadgePosition=\"above after\"\n [matTooltip]=\"getTableSettingsTooltip()\"\n matTooltipPosition=\"below\">\n <mat-icon>settings</mat-icon>\n </button>\n @if (isRemoteMode()) {\n <button mat-icon-button (click)=\"disconnect()\" [attr.aria-label]=\"getDisconnectLabel()\" [matTooltip]=\"getDisconnectTooltip()\">\n <mat-icon>link_off</mat-icon>\n </button>\n }\n </div>\n }\n </div>\n} @else {\n @if (shouldRenderDataSurface() && !schemaError && !dataError) {\n @if (showToolbar && shouldShowToolbarTopPlacement()) {\n <praxis-table-toolbar\n class=\"praxis-toolbar-stack-top\"\n [config]=\"config\"\n [backgroundColor]=\"getToolbarActionsBackgroundColor()\"\n [style.--pfx-filter-h]=\"getToolbarLayoutHeightHostStyle()\"\n [evaluationContext]=\"getToolbarEvaluationContext()\"\n [showActionsGroup]=\"shouldShowToolbarActionsTop()\"\n [showMobileActions]=\"shouldShowToolbarActionsTop()\"\n [exportBusy]=\"exportBusy\"\n (toolbarAction)=\"onToolbarAction($event)\"\n (exportAction)=\"onExportAction($event)\"\n >\n @if (shouldRenderAdvancedFilter()) {\n <praxis-filter\n advancedFilter\n [resourcePath]=\"getAdvancedFilterResourcePath()\"\n [filterId]=\"tableId\"\n [formId]=\"tableId\"\n [persistenceKey]=\"getAdvancedFilterPersistenceKey()\"\n [fieldMetadata]=\"getAdvancedFilterFieldMetadata()\"\n [enableCustomization]=\"enableCustomization\"\n [value]=\"advancedFilterValue\"\n\n [alwaysVisibleFields]=\"getAdvancedFilterAlwaysVisibleFields()\"\n [alwaysVisibleFieldMetadataOverrides]=\"getAdvancedFilterAlwaysVisibleFieldMetadataOverrides()\"\n [selectedFieldIds]=\"config.behavior?.filtering?.advancedFilters?.settings?.selectedFieldIds ?? []\"\n [allowSaveTags]=\"config.behavior?.filtering?.advancedFilters?.settings?.allowSaveTags\"\n [changeDebounceMs]=\"config.behavior?.filtering?.advancedFilters?.settings?.changeDebounceMs ?? 300\"\n [i18n]=\"getFilterI18n()\"\n [mode]=\"'filter'\"\n [showFilterSettings]=\"enableCustomization\"\n (change)=\"onAdvancedFilterChange($event)\"\n (requestSearch)=\"onAdvancedFilterSubmit($event)\"\n (clear)=\"onAdvancedFilterClear()\"\n ></praxis-filter>\n }\n <ng-content select=\"[advancedFilter]\" />\n <ng-content select=\"[toolbar]\" />\n @if (shouldShowAiAssistantEntrypoint()) {\n <button\n end-actions\n mat-icon-button\n color=\"primary\"\n type=\"button\"\n class=\"praxis-table-ai-trigger praxis-table-toolbar-action--ai\"\n [class.praxis-table-ai-trigger--minimized]=\"hasMinimizedAiAssistantSession()\"\n [attr.data-testid]=\"aiAssistantTriggerTestId('toolbar-stacked')\"\n (click)=\"openAiAssistant()\"\n [attr.aria-label]=\"aiAssistantTriggerLabel()\"\n [matBadge]=\"aiAssistantTriggerBadge()\"\n [matBadgeHidden]=\"!hasMinimizedAiAssistantSession()\"\n matBadgeColor=\"accent\"\n matBadgeSize=\"small\"\n matBadgePosition=\"above after\"\n [matTooltip]=\"aiAssistantTriggerTooltip()\"\n matTooltipPosition=\"below\"\n >\n <mat-icon>{{ aiAssistantTriggerIcon() }}</mat-icon>\n </button>\n }\n @if (enableCustomization) {\n <button end-actions mat-icon-button color=\"primary\" class=\"praxis-table-toolbar-action--configuration\" data-role=\"table-settings\" data-testid=\"table-settings-trigger\"\n (click)=\"openTableSettings()\" [attr.aria-label]=\"getTableSettingsLabel()\"\n [matBadge]=\"schemaOutdated ? '!' : ''\"\n [matBadgeHidden]=\"!schemaOutdated\"\n matBadgeColor=\"warn\" matBadgeSize=\"small\" matBadgePosition=\"above after\"\n [matTooltip]=\"getTableSettingsTooltip()\"\n matTooltipPosition=\"below\">\n <mat-icon>settings</mat-icon>\n </button>\n }\n </praxis-table-toolbar>\n }\n @if (!showToolbar && enableCustomization) {\n <div class=\"ptable-header-actions\">\n @if (shouldShowAiAssistantEntrypoint()) {\n <button\n mat-icon-button\n color=\"primary\"\n type=\"button\"\n class=\"praxis-table-ai-trigger praxis-table-toolbar-action--ai\"\n [class.praxis-table-ai-trigger--minimized]=\"hasMinimizedAiAssistantSession()\"\n [attr.data-testid]=\"aiAssistantTriggerTestId('header-stacked')\"\n (click)=\"openAiAssistant()\"\n [attr.aria-label]=\"aiAssistantTriggerLabel()\"\n [matBadge]=\"aiAssistantTriggerBadge()\"\n [matBadgeHidden]=\"!hasMinimizedAiAssistantSession()\"\n matBadgeColor=\"accent\"\n matBadgeSize=\"small\"\n matBadgePosition=\"above after\"\n [matTooltip]=\"aiAssistantTriggerTooltip()\"\n matTooltipPosition=\"below\"\n >\n <mat-icon>{{ aiAssistantTriggerIcon() }}</mat-icon>\n </button>\n }\n <button mat-icon-button color=\"primary\" class=\"praxis-table-toolbar-action--configuration\" data-role=\"table-settings\" data-testid=\"table-settings-trigger\" (click)=\"openTableSettings()\" [attr.aria-label]=\"getTableSettingsLabel()\"\n [matBadge]=\"schemaOutdated ? '!' : ''\"\n [matBadgeHidden]=\"!schemaOutdated\"\n matBadgeColor=\"warn\" matBadgeSize=\"small\" matBadgePosition=\"above after\"\n [matTooltip]=\"getTableSettingsTooltip()\"\n matTooltipPosition=\"below\">\n <mat-icon>settings</mat-icon>\n </button>\n </div>\n }\n }\n}\n<!-- Paginador superior -->\n@if (shouldRenderDataSurface() && !schemaError && !dataError && getPaginationEnabled() && (config.behavior?.pagination?.position === 'top' || config.behavior?.pagination?.position === 'both')) {\n <mat-paginator\n [length]=\"getPaginationLength()\"\n [pageSize]=\"getPaginationPageSize()\"\n [pageSizeOptions]=\"getPaginationPageSizeOptions()\"\n [selectConfig]=\"paginatorSelectConfig\"\n [showFirstLastButtons]=\"getPaginationShowFirstLast()\"\n (page)=\"onPageChange($event)\"\n [class.compact]=\"config.behavior?.pagination?.style === 'compact'\"\n >\n </mat-paginator>\n}\n<div class=\"px-scroll-viewport\"\n cdkScrollable\n [class.scroll-auto]=\"horizontalScroll === 'auto'\"\n [class.scroll-wrap]=\"horizontalScroll === 'wrap'\"\n [class.scroll-none]=\"horizontalScroll === 'none'\">\n\n @if (shouldRenderDataSurface() && !schemaError && !dataError) {\n <div class=\"praxis-visually-hidden-status\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">\n {{ columnReorderStatusMessage }}\n </div>\n @if (exportStatusMessage) {\n <div class=\"praxis-visually-hidden-status\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">\n {{ exportStatusMessage }}\n </div>\n }\n @if (columnReorderVisualStatusMessage) {\n <div class=\"praxis-column-reorder-status\" role=\"note\">\n {{ columnReorderVisualStatusMessage }}\n </div>\n }\n <table\n mat-table\n data-testid=\"table-column-drag-drop-list\"\n [dataSource]=\"dataSource\"\n [multiTemplateDataRows]=\"isRowExpansionRuntimeEnabled()\"\n cdkDropList\n [cdkDropListDisabled]=\"!isColumnDraggingEnabled() || isColumnResizeActive()\"\n [cdkDropListData]=\"visibleDataColumnsForDrag\"\n cdkDropListOrientation=\"horizontal\"\n (cdkDropListDropped)=\"onColumnDrop($event)\"\n matSort\n (matSortChange)=\"onSortChange($event)\"\n [matSortDisabled]=\"!getSortingEnabled() || isColumnResizeActive()\"\n [ngClass]=\"getTableElevationClassName()\"\n [class.table-stack-top]=\"hasTopToolbarStack()\"\n [class.pfx-column-drag-enabled]=\"isColumnDraggingEnabled()\"\n [class.pfx-column-drag-indicator]=\"isColumnDragIndicatorEnabled()\"\n [class.pfx-column-resize-enabled]=\"isColumnResizeEnabled()\"\n [class.pfx-column-resizing]=\"isColumnResizeActive()\"\n [style.width]=\"getColumnResizeTableWidthStyle()\"\n [style.min-width]=\"getColumnResizeTableWidthStyle()\"\n [style.max-width]=\"getColumnResizeTableWidthStyle()\"\n >\n @if (isSelectionColumnEnabled()) {\n <ng-container\n matColumnDef=\"_select\"\n >\n <th mat-header-cell *matHeaderCellDef>\n @if (canSelectAll()) {\n <mat-checkbox\n (change)=\"masterToggle()\"\n [checked]=\"isAllSelected()\"\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\"\n [attr.aria-label]=\"getMasterSelectionAriaLabel()\"\n ></mat-checkbox>\n }\n </th>\n <td mat-cell *matCellDef=\"let row; let i = index\">\n @if (config.behavior?.selection?.type !== 'multiple') {\n <mat-radio-button\n (click)=\"$event.stopPropagation(); toggleRow(row)\"\n [checked]=\"selection.isSelected(row)\"\n [attr.aria-label]=\"getRowSelectionAriaLabel(row, i)\"\n ></mat-radio-button>\n } @else {\n <mat-checkbox\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleRow(row)\"\n [checked]=\"selection.isSelected(row)\"\n [attr.aria-label]=\"getRowSelectionAriaLabel(row, i)\"\n ></mat-checkbox>\n }\n </td>\n </ng-container>\n }\n\n @if (isRowExpansionRuntimeEnabled()) {\n <ng-container matColumnDef=\"_expander\">\n <th mat-header-cell *matHeaderCellDef class=\"pfx-expansion-col-header\">\n <span class=\"praxis-visually-hidden-status\">Expandir detalhes da linha</span>\n </th>\n <td mat-cell *matCellDef=\"let row; let i = index\" class=\"pfx-expansion-col-cell\">\n <button\n mat-icon-button\n class=\"pfx-expansion-toggle\"\n [disabled]=\"!isRowExpandable(row, i) || !isExpansionIconTriggerEnabled()\"\n [attr.aria-expanded]=\"isRowExpanded(row, i) ? 'true' : 'false'\"\n [attr.aria-controls]=\"getRowExpansionDetailId(row, i)\"\n [attr.aria-label]=\"getRowExpansionToggleAriaLabel(row, i)\"\n (click)=\"onExpansionToggleFromIcon(row, i, $event)\"\n (keydown)=\"onExpansionToggleKeydown($event, row, i)\"\n >\n <mat-icon [praxisIcon]=\"isRowExpanded(row, i)\n ? getExpansionExpandedIcon()\n : getExpansionCollapsedIcon()\"></mat-icon>\n </button>\n </td>\n </ng-container>\n }\n @for (column of visibleColumns; track column.field) {\n <ng-container\n [matColumnDef]=\"column.field\"\n [sticky]=\"column.sticky === true || column.sticky === 'start'\"\n [stickyEnd]=\"column.sticky === 'end'\"\n >\n <th\n mat-header-cell\n *matHeaderCellDef\n cdkDrag\n [cdkDragData]=\"column\"\n cdkDragLockAxis=\"x\"\n cdkDragPreviewClass=\"pfx-column-drag-preview\"\n (cdkDragStarted)=\"onColumnDragStarted(column)\"\n (cdkDragEnded)=\"onColumnDragEnded($event, column)\"\n [cdkDragDisabled]=\"!isColumnDraggingEnabled() || !isColumnDraggable(column) || isColumnResizeActive()\"\n [class.praxis-header-draggable]=\"isColumnDraggingEnabled() && isColumnDraggable(column)\"\n [class.praxis-header-resizable]=\"isColumnResizable(column)\"\n [class.praxis-header-resizing]=\"isColumnResizeActive(column)\"\n [class.praxis-header-align-left]=\"column.align === 'left'\"\n [class.praxis-header-align-center]=\"column.align === 'center'\"\n [class.praxis-header-align-right]=\"column.align === 'right'\"\n [style.text-align]=\"getColumnTextAlignStyle(column)\"\n [style.width]=\"getColumnWidthStyle(column)\"\n [attr.style]=\"getColumnHeaderAttrStyle(column)\"\n [ngStyle]=\"getColumnHeaderNgStyle(column)\"\n >\n <span\n class=\"praxis-header-sort-trigger\"\n [mat-sort-header]=\"column.field\"\n [disabled]=\"!getSortingEnabled() || column.sortable === false || isColumnResizeActive()\"\n (keydown)=\"onColumnHeaderReorderKeydown($event, column)\"\n >\n <span class=\"praxis-header-label\" data-testid=\"column-header-label\">\n <span class=\"praxis-header-label-text\">{{ column.header }}</span>\n </span>\n </span>\n <ng-template cdkDragPreview [matchSize]=\"true\">\n <div\n class=\"pfx-column-drag-preview pfx-column-drag-preview-custom\"\n [class.praxis-header-align-left]=\"column.align === 'left'\"\n [class.praxis-header-align-center]=\"column.align === 'center'\"\n [class.praxis-header-align-right]=\"column.align === 'right'\"\n [style.text-align]=\"getColumnTextAlignStyle(column)\"\n >\n <span class=\"praxis-header-label\">\n <span class=\"praxis-header-label-text\">{{ column.header }}</span>\n </span>\n </div>\n </ng-template>\n @if (isColumnResizable(column)) {\n <span\n class=\"praxis-column-resize-handle\"\n role=\"separator\"\n aria-orientation=\"vertical\"\n tabindex=\"0\"\n [attr.aria-label]=\"getColumnResizeHandleAriaLabel(column)\"\n [attr.aria-valuemin]=\"getColumnResizeMinWidthAriaValue(column)\"\n [attr.aria-valuemax]=\"getColumnResizeMaxWidthAriaValue(column)\"\n [attr.aria-valuenow]=\"getColumnResizeCurrentWidthAriaValue(column)\"\n [attr.title]=\"getColumnResizeHandleTooltip(column)\"\n (pointerdown)=\"onColumnResizePointerDown($event, column)\"\n (keydown)=\"onColumnResizeHandleKeydown($event, column)\"\n (click)=\"onColumnResizeHandleClick($event)\"\n ></span>\n }\n </th>\n <td\n mat-cell\n *matCellDef=\"let element\"\n [style.text-align]=\"getColumnTextAlignStyle(column)\"\n [style.width]=\"getColumnWidthStyle(column)\"\n [attr.style]=\"getColumnCellAttrStyle(column)\"\n [ngClass]=\"getCellClasses(element, column)\"\n [ngStyle]=\"getCellNgStyle(element, column)\"\n [matTooltip]=\"getCellTooltip(element, column) || ''\"\n [matTooltipPosition]=\"getCellTooltipPosition(element, column)\"\n [matTooltipDisabled]=\"!getCellTooltip(element, column)\"\n [attr.title]=\"getCellTooltip(element, column) || null\"\n >\n <div\n class=\"pfx-cell-content\"\n [ngClass]=\"getCellContentClasses(element, column)\"\n [ngStyle]=\"getCellContentNgStyle(element, column)\"\n >\n @switch (getEffectiveRendererType(element, column)) {\n <!-- Icon renderer -->\n @case ('icon') {\n <span\n class=\"pfx-icon-renderer\"\n [style.color]=\"getIconColor(element, column) || null\"\n [ngStyle]=\"getIconStyle(element, column)\"\n [attr.aria-label]=\"getIconAriaLabel(element, column) || null\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-icon-renderer__content\"\n [nodes]=\"getIconRichContentNodes(element, column)\"\n ></praxis-rich-content>\n </span>\n }\n <!-- Image renderer -->\n @case ('image') {\n <span class=\"pfx-cell-image\">\n <praxis-rich-content\n rootClassName=\"pfx-cell-image__content\"\n [nodes]=\"getImageRichContentNodes(element, column)\"\n ></praxis-rich-content>\n </span>\n }\n <!-- Badge renderer -->\n @case ('badge') {\n @if (shouldRenderBadge(element, column)) {\n <span class=\"pfx-badge\" [ngClass]=\"getBadgeClasses(element, column)\">\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-badge__content\"\n [nodes]=\"getBadgeRichContentNodes(element, column)\"\n ></praxis-rich-content>\n </span>\n }\n }\n <!-- Link renderer -->\n @case ('link') {\n <a\n class=\"pfx-link\"\n [attr.href]=\"getLinkHref(element, column) || null\"\n [attr.target]=\"getLinkTarget(element, column) || null\"\n [attr.rel]=\"getLinkRel(element, column) || null\"\n (click)=\"$event.stopPropagation()\"\n ><praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-link__content\"\n [nodes]=\"getLinkRichContentNodes(element, column)\"\n ></praxis-rich-content></a\n >\n }\n <!-- Button renderer -->\n @case ('button') {\n @switch (getButtonVariant(element, column)) {\n @case ('outlined') {\n <button\n mat-stroked-button\n [color]=\"getButtonColor(element, column) || null\"\n [disabled]=\"isButtonDisabled(element, column)\"\n [attr.aria-label]=\"getButtonAriaLabel(element, column) || getButtonLabel(element, column)\"\n (click)=\"onButtonClick(element, column, $event)\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-button-renderer__content\"\n [nodes]=\"getButtonRichContentNodes(element, column)\"\n ></praxis-rich-content>\n </button>\n }\n @case ('text') {\n <button\n mat-button\n [color]=\"getButtonColor(element, column) || null\"\n [disabled]=\"isButtonDisabled(element, column)\"\n [attr.aria-label]=\"getButtonAriaLabel(element, column) || getButtonLabel(element, column)\"\n (click)=\"onButtonClick(element, column, $event)\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-button-renderer__content\"\n [nodes]=\"getButtonRichContentNodes(element, column)\"\n ></praxis-rich-content>\n </button>\n }\n @default {\n <button\n mat-flat-button\n [color]=\"getButtonColor(element, column) || null\"\n [disabled]=\"isButtonDisabled(element, column)\"\n [attr.aria-label]=\"getButtonAriaLabel(element, column) || getButtonLabel(element, column)\"\n (click)=\"onButtonClick(element, column, $event)\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-button-renderer__content\"\n [nodes]=\"getButtonRichContentNodes(element, column)\"\n ></praxis-rich-content>\n </button>\n }\n }\n }\n <!-- Chip renderer -->\n @case ('chip') {\n @if (shouldRenderChip(element, column)) {\n <span class=\"pfx-chip\" [ngClass]=\"getChipClasses(element, column)\">\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-chip__content\"\n [nodes]=\"getChipRichContentNodes(element, column)\"\n ></praxis-rich-content>\n </span>\n }\n }\n <!-- Progress renderer -->\n @case ('progress') {\n <div class=\"pfx-progress\">\n <praxis-rich-content\n rootClassName=\"pfx-progress__content\"\n [context]=\"getProgressRichContentContext(element, column)\"\n [nodes]=\"getProgressRichContentNodes(element, column)\"\n ></praxis-rich-content>\n </div>\n }\n <!-- Micro visualization renderer -->\n @case ('microVisualization') {\n <span class=\"pfx-micro-viz-cell\" [innerHTML]=\"getMicroVisualizationHtml(element, column)\"></span>\n }\n <!-- Avatar renderer -->\n @case ('avatar') {\n <span class=\"pfx-avatar-renderer\"\n [ngStyle]=\"getAvatarStyle(element, column)\"\n [class.shape-rounded]=\"getAvatarShape(element, column) === 'rounded'\"\n [class.shape-circle]=\"getAvatarShape(element, column) === 'circle'\">\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-avatar-renderer__content\"\n [nodes]=\"getAvatarRichContentNodes(element, column)\"\n ></praxis-rich-content>\n </span>\n }\n <!-- Toggle renderer -->\n @case ('toggle') {\n <mat-slide-toggle\n [checked]=\"getToggleState(element, column)\"\n [disabled]=\"isToggleDisabled(element, column)\"\n [attr.aria-label]=\"getToggleAriaLabel(element, column) || 'Alternar'\"\n (change)=\"onToggleChange(element, column, $event)\"\n (click)=\"$event.stopPropagation()\"\n ></mat-slide-toggle>\n }\n <!-- Menu renderer -->\n @case ('menu') {\n <button mat-icon-button [matMenuTriggerFor]=\"menuRef\" (click)=\"$event.stopPropagation()\" [attr.aria-label]=\"getMenuAriaLabel(element, column) || 'Menu'\">\n <praxis-rich-content rootClassName=\"pfx-menu-trigger__content\" [nodes]=\"getMenuTriggerRichContentNodes()\"></praxis-rich-content>\n </button>\n <mat-menu #menuRef=\"matMenu\">\n @for (it of getMenuItems(element, column); track it.id) {\n <button mat-menu-item (click)=\"onMenuItemClick(it, element, $event)\" [disabled]=\"!it.__visible\" >\n <praxis-rich-content\n rootClassName=\"pfx-menu-item__content\"\n [nodes]=\"getMenuItemRichContentNodes(it)\"\n ></praxis-rich-content>\n </button>\n }\n </mat-menu>\n }\n <!-- Rating renderer -->\n @case ('rating') {\n <praxis-table-rating\n class=\"pfx-rating-cell\"\n [itemsCount]=\"getRatingMax(element, column)\"\n [value]=\"getRatingValue(element, column)\"\n [size]=\"getRatingSize(element, column)\"\n [ratingColor]=\"getRatingColor(element, column)\"\n [outlineColor]=\"getRatingOutlineColor(element, column)\"\n [ariaLabel]=\"getRatingAriaLabel(element, column) || column.header\">\n </praxis-table-rating>\n }\n <!-- HTML renderer (sanitizado) -->\n @case ('html') {\n <span [innerHTML]=\"getSafeHtml(element, column)\"></span>\n }\n <!-- Compose renderer -->\n @case ('compose') {\n <span class=\"pfx-cell-compose\" [ngClass]=\"getComposeClasses(element, column)\" [ngStyle]=\"getComposeGapStyle(element, column)\">\n @for (it of getComposeItems(element, column); track trackComposeItem($index, it)) {\n @switch (getItemEffectiveType(element, column, it)) {\n <!-- Reuse helpers by projecting item as faux column -->\n @case ('icon') {\n <span class=\"pfx-icon-renderer\" [style.color]=\"getIconColor(element, asItemColumn(column, it)) || null\" [ngStyle]=\"getIconStyle(element, asItemColumn(column, it))\" [attr.aria-label]=\"getIconAriaLabel(element, asItemColumn(column, it)) || null\"><praxis-rich-content [layout]=\"'inline'\" rootClassName=\"pfx-icon-renderer__content\" [nodes]=\"getIconRichContentNodes(element, asItemColumn(column, it))\"></praxis-rich-content></span>\n }\n @case ('image') {\n <span class=\"pfx-cell-image\"><praxis-rich-content rootClassName=\"pfx-cell-image__content\" [nodes]=\"getImageRichContentNodes(element, asItemColumn(column, it))\"></praxis-rich-content></span>\n }\n @case ('badge') {\n @if (shouldRenderBadge(element, asItemColumn(column, it))) {\n <span class=\"pfx-badge\" [ngClass]=\"getBadgeClasses(element, asItemColumn(column, it))\"><praxis-rich-content [layout]=\"'inline'\" rootClassName=\"pfx-badge__content\" [nodes]=\"getBadgeRichContentNodes(element, asItemColumn(column, it))\"></praxis-rich-content></span>\n }\n }\n @case ('link') {\n <a class=\"pfx-link\" [attr.href]=\"getLinkHref(element, asItemColumn(column, it)) || null\" [attr.target]=\"getLinkTarget(element, asItemColumn(column, it)) || null\" [attr.rel]=\"getLinkRel(element, asItemColumn(column, it)) || null\" (click)=\"$event.stopPropagation()\"><praxis-rich-content [layout]=\"'inline'\" rootClassName=\"pfx-link__content\" [nodes]=\"getLinkRichContentNodes(element, asItemColumn(column, it))\"></praxis-rich-content></a>\n }\n @case ('button') {\n @switch (getButtonVariant(element, asItemColumn(column, it))) {\n @case ('outlined') {\n <button mat-stroked-button [color]=\"getButtonColor(element, asItemColumn(column, it)) || null\" [disabled]=\"isButtonDisabled(element, asItemColumn(column, it))\" [attr.aria-label]=\"getButtonAriaLabel(element, asItemColumn(column, it)) || getButtonLabel(element, asItemColumn(column, it))\" (click)=\"onButtonClick(element, asItemColumn(column, it), $event)\"><praxis-rich-content [layout]=\"'inline'\" rootClassName=\"pfx-button-renderer__content\" [nodes]=\"getButtonRichContentNodes(element, asItemColumn(column, it))\"></praxis-rich-content></button>\n }\n @case ('text') {\n <button mat-button [color]=\"getButtonColor(element, asItemColumn(column, it)) || null\" [disabled]=\"isButtonDisabled(element, asItemColumn(column, it))\" [attr.aria-label]=\"getButtonAriaLabel(element, asItemColumn(column, it)) || getButtonLabel(element, asItemColumn(column, it))\" (click)=\"onButtonClick(element, asItemColumn(column, it), $event)\"><praxis-rich-content [layout]=\"'inline'\" rootClassName=\"pfx-button-renderer__content\" [nodes]=\"getButtonRichContentNodes(element, asItemColumn(column, it))\"></praxis-rich-content></button>\n }\n @default {\n <button mat-flat-button [color]=\"getButtonColor(element, asItemColumn(column, it)) || null\" [disabled]=\"isButtonDisabled(element, asItemColumn(column, it))\" [attr.aria-label]=\"getButtonAriaLabel(element, asItemColumn(column, it)) || getButtonLabel(element, asItemColumn(column, it))\" (click)=\"onButtonClick(element, asItemColumn(column, it), $event)\"><praxis-rich-content [layout]=\"'inline'\" rootClassName=\"pfx-button-renderer__content\" [nodes]=\"getButtonRichContentNodes(element, asItemColumn(column, it))\"></praxis-rich-content></button>\n }\n }\n }\n @case ('chip') {\n @if (shouldRenderChip(element, asItemColumn(column, it))) {\n <span class=\"pfx-chip\" [ngClass]=\"getChipClasses(element, asItemColumn(column, it))\"><praxis-rich-content [layout]=\"'inline'\" rootClassName=\"pfx-chip__content\" [nodes]=\"getChipRichContentNodes(element, asItemColumn(column, it))\"></praxis-rich-content></span>\n }\n }\n @case ('progress') {\n <div class=\"pfx-progress\">\n <praxis-rich-content\n rootClassName=\"pfx-progress__content\"\n [context]=\"getProgressRichContentContext(element, asItemColumn(column, it))\"\n [nodes]=\"getProgressRichContentNodes(element, asItemColumn(column, it))\"\n ></praxis-rich-content>\n </div>\n }\n @case ('microVisualization') {\n <span class=\"pfx-micro-viz-cell\" [innerHTML]=\"getMicroVisualizationHtml(element, asItemColumn(column, it))\"></span>\n }\n @case ('avatar') {\n <span class=\"pfx-avatar-renderer\" [ngStyle]=\"getAvatarStyle(element, asItemColumn(column, it))\" [class.shape-rounded]=\"getAvatarShape(element, asItemColumn(column, it)) === 'rounded'\" [class.shape-circle]=\"getAvatarShape(element, asItemColumn(column, it)) === 'circle'\"><praxis-rich-content rootClassName=\"pfx-avatar-renderer__content\" [nodes]=\"getAvatarRichContentNodes(element, asItemColumn(column, it))\"></praxis-rich-content></span>\n }\n @case ('toggle') {\n <mat-slide-toggle [checked]=\"getToggleState(element, asItemColumn(column, it))\" [disabled]=\"isToggleDisabled(element, asItemColumn(column, it))\" [attr.aria-label]=\"getToggleAriaLabel(element, asItemColumn(column, it)) || 'Alternar'\" (change)=\"onToggleChange(element, asItemColumn(column, it), $event)\" (click)=\"$event.stopPropagation()\"></mat-slide-toggle>\n }\n @case ('menu') {\n <button mat-icon-button [matMenuTriggerFor]=\"menuRef\" (click)=\"$event.stopPropagation()\" [attr.aria-label]=\"getMenuAriaLabel(element, asItemColumn(column, it)) || 'Menu'\"><praxis-rich-content rootClassName=\"pfx-menu-trigger__content\" [nodes]=\"getMenuTriggerRichContentNodes()\"></praxis-rich-content></button>\n <mat-menu #menuRef=\"matMenu\">\n @for (mi of getMenuItems(element, asItemColumn(column, it)); track mi.id) {\n <button mat-menu-item (click)=\"onMenuItemClick(mi, element, $event)\" [disabled]=\"!mi.__visible\">\n <praxis-rich-content\n rootClassName=\"pfx-menu-item__content\"\n [nodes]=\"getMenuItemRichContentNodes(mi)\"\n ></praxis-rich-content>\n </button>\n }\n </mat-menu>\n }\n @case ('rating') {\n <praxis-table-rating\n class=\"pfx-rating-cell\"\n [itemsCount]=\"getRatingMax(element, asItemColumn(column, it))\"\n [value]=\"getRatingValue(element, asItemColumn(column, it))\"\n [size]=\"getRatingSize(element, asItemColumn(column, it))\"\n [ratingColor]=\"getRatingColor(element, asItemColumn(column, it))\"\n [outlineColor]=\"getRatingOutlineColor(element, asItemColumn(column, it))\"\n [ariaLabel]=\"getRatingAriaLabel(element, asItemColumn(column, it)) || column.header\">\n </praxis-table-rating>\n }\n @case ('html') {\n <span [innerHTML]=\"getSafeHtml(element, asItemColumn(column, it))\"></span>\n }\n <!-- Value item: render base cell text alongside visuals -->\n @case ('value') {\n <span class=\"pfx-cell-value\">{{ getComposeItemValue(element, column, it) }}</span>\n }\n }\n }\n </span>\n }\n <!-- Default text rendering -->\n @default {\n {{ getCellValue(element, column) }}\n }\n }\n </div>\n </td>\n </ng-container>\n }\n @if (config.actions?.row?.enabled) {\n <ng-container matColumnDef=\"_actions\" [sticky]=\"config.actions?.row?.sticky === true || config.actions?.row?.sticky === 'start'\" [stickyEnd]=\"config.actions?.row?.sticky === 'end'\">\n <th mat-header-cell *matHeaderCellDef #actionsHeaderCell [style.width]=\"getRowActionsWidthStyle()\" class=\"praxis-actions-header\" [class.align-start]=\"getActionsHeaderAlign() === 'start'\" [class.align-center]=\"getActionsHeaderAlign() === 'center'\" [class.align-end]=\"getActionsHeaderAlign() === 'end'\">\n <div class=\"praxis-actions-header__content\" [matTooltip]=\"getActionsHeaderTooltip() || ''\" [matTooltipDisabled]=\"!getActionsHeaderTooltip()\">\n <praxis-rich-content\n rootClassName=\"praxis-actions-header__nodes\"\n [nodes]=\"getActionsHeaderRichContentNodes()\"\n ></praxis-rich-content>\n </div>\n </th>\n <td\n mat-cell\n *matCellDef=\"let row\"\n class=\"praxis-actions-cell\"\n [class.dense]=\"dense\"\n [style.width]=\"getRowActionsWidthStyle()\"\n >\n <div\n class=\"praxis-actions-cell__content\"\n [class.praxis-actions-cell__content--discovering]=\"isRowDiscoveryPending(row)\"\n [attr.aria-busy]=\"isRowDiscoveryPending(row) ? 'true' : null\"\n >\n <!-- A\u00C3\u00A7\u00C3\u00B5es inline -->\n <!-- Inline actions: icons mode -->\n @if (config.actions?.row?.display === 'icons' || !config.actions?.row?.display) {\n @for (a of getInlineRowActions(row); track trackAction($index, a)) {\n <span\n class=\"praxis-row-action-anchor\"\n [class.praxis-row-action-anchor--workflow]=\"isWorkflowRowAction(a)\"\n [class.praxis-row-action-anchor--blocked]=\"isBlockedWorkflowRowAction(a, row)\"\n [matTooltip]=\"getActionTooltip(a, row)\"\n [matTooltipDisabled]=\"!getActionTooltip(a, row)\"\n matTooltipPosition=\"above\"\n matTooltipClass=\"praxis-tooltip\"\n >\n <button\n mat-icon-button\n class=\"praxis-icon-btn\"\n [class.praxis-icon-btn--workflow]=\"isWorkflowRowAction(a)\"\n [class.praxis-icon-btn--blocked]=\"isBlockedWorkflowRowAction(a, row)\"\n [disabled]=\"isActionDisabled(a, row)\"\n (click)=\"onRowAction(getActionId(a), row, $event, getRowActionRuntimeOptions(a, row))\"\n [attr.aria-label]=\"a.label || getActionId(a)\"\n [color]=\"a.color || null\"\n >\n <praxis-rich-content\n layout=\"inline\"\n rootClassName=\"praxis-row-action__content\"\n [nodes]=\"getRowActionIconRichContentNodes(a)\"\n ></praxis-rich-content>\n </button>\n </span>\n }\n }\n\n <!-- Inline actions: buttons mode (show label + icon) -->\n @if (config.actions?.row?.display === 'buttons') {\n @for (a of getInlineRowActions(row); track trackAction($index, a)) {\n <span\n class=\"praxis-row-action-anchor\"\n [class.praxis-row-action-anchor--workflow]=\"isWorkflowRowAction(a)\"\n [class.praxis-row-action-anchor--blocked]=\"isBlockedWorkflowRowAction(a, row)\"\n [matTooltip]=\"getActionTooltip(a, row)\"\n [matTooltipDisabled]=\"!getActionTooltip(a, row)\"\n matTooltipPosition=\"above\"\n matTooltipClass=\"praxis-tooltip\"\n >\n <button\n mat-flat-button\n class=\"praxis-row-btn\"\n [class.praxis-row-btn--workflow]=\"isWorkflowRowAction(a)\"\n [class.praxis-row-btn--blocked]=\"isBlockedWorkflowRowAction(a, row)\"\n [disabled]=\"isActionDisabled(a, row)\"\n (click)=\"onRowAction(getActionId(a), row, $event, getRowActionRuntimeOptions(a, row))\"\n [attr.aria-label]=\"a.label || getActionId(a)\"\n [color]=\"a.color || null\"\n >\n <praxis-rich-content\n layout=\"inline\"\n rootClassName=\"praxis-row-action__content\"\n [nodes]=\"getRowActionRichContentNodes(a)\"\n ></praxis-rich-content>\n </button>\n </span>\n }\n }\n\n <!-- Menu de overflow -->\n @if (hasOverflowRowActions(row)) {\n <button\n mat-icon-button\n class=\"praxis-icon-btn praxis-more-btn\"\n [matMenuTriggerFor]=\"rowMoreMenu\"\n (menuOpened)=\"onRowOverflowMenuOpened(row)\"\n [color]=\"getRowMenuButtonColor() || null\"\n [attr.aria-label]=\"getRowMenuTooltip(row)\"\n [matTooltip]=\"getRowMenuTooltip(row)\"\n matTooltipPosition=\"above\"\n >\n <mat-icon [praxisIcon]=\"getRowMenuIcon()\"></mat-icon>\n </button>\n }\n <mat-menu #rowMoreMenu=\"matMenu\" xPosition=\"before\">\n @if (hasRowOverflowMenuLoadingState(row)) {\n <button mat-menu-item disabled>\n <mat-icon>hourglass_empty</mat-icon>\n <praxis-rich-content\n rootClassName=\"praxis-row-overflow-menu__label\"\n [nodes]=\"getTableChromeTextRichContentNodes(getRowOverflowMenuLoadingLabel(), 'praxis-row-overflow-menu__label-text')\"\n ></praxis-rich-content>\n </button>\n }\n @for (a of getOverflowRowActions(row); track trackAction($index, a)) {\n <button\n mat-menu-item\n (click)=\"onRowAction(getActionId(a), row, $event, getRowActionRuntimeOptions(a, row))\"\n [disabled]=\"isActionDisabled(a, row)\"\n >\n <mat-icon [color]=\"a.color || null\" [praxisIcon]=\"a.icon\"></mat-icon>\n <praxis-rich-content\n rootClassName=\"praxis-row-overflow-menu__label\"\n [nodes]=\"getTableChromeTextRichContentNodes(a.label || getActionId(a), 'praxis-row-overflow-menu__label-text')\"\n ></praxis-rich-content>\n </button>\n }\n @if (hasRowOverflowMenuEmptyState(row)) {\n <button mat-menu-item disabled>\n <mat-icon>info</mat-icon>\n <praxis-rich-content\n rootClassName=\"praxis-row-overflow-menu__label\"\n [nodes]=\"getTableChromeTextRichContentNodes(getRowOverflowMenuEmptyLabel(row), 'praxis-row-overflow-menu__label-text')\"\n ></praxis-rich-content>\n </button>\n }\n </mat-menu>\n </div>\n </td>\n </ng-container>\n }\n\n <tr\n mat-header-row\n *matHeaderRowDef=\"displayedColumns\"\n ></tr>\n @if (!isVirtualized()) {\n <tr\n mat-row\n *matRowDef=\"let row; let i = index; columns: displayedColumns\"\n [class.pfx-row-selected]=\"selection.isSelected(row)\"\n [class.pfx-row-click-selectable]=\"isRowClickSelectable()\"\n [class.pfx-row-expanded]=\"isRowExpansionRuntimeEnabled() && isRowExpanded(row, i)\"\n [attr.aria-selected]=\"config.behavior?.selection?.enabled ? (selection.isSelected(row) ? 'true' : 'false') : null\"\n [attr.aria-expanded]=\"isRowExpansionRuntimeEnabled() ? (isRowExpanded(row, i) ? 'true' : 'false') : null\"\n [ngClass]=\"getRowClasses(row)\"\n [ngStyle]=\"getRowNgStyle(row)\"\n [matTooltip]=\"getRowTooltip(row) || null\"\n [matTooltipDisabled]=\"!getRowTooltip(row)\"\n [matTooltipPosition]=\"getRowTooltipPosition(row)\"\n [matTooltipShowDelay]=\"getRowTooltipShowDelay(row)\"\n (click)=\"onRowClicked(row, i, $event)\"\n (dblclick)=\"onRowDoubleClicked(row, i)\"\n ></tr>\n @if (isRowExpansionRuntimeEnabled()) {\n <ng-container matColumnDef=\"_detail\">\n <td\n mat-cell\n *matCellDef=\"let row; let i = index\"\n class=\"pfx-expansion-detail-cell\"\n [attr.colspan]=\"displayedColumns.length\"\n >\n <section\n class=\"pfx-expansion-detail-panel\"\n [ngClass]=\"getExpansionMotionPresetClass()\"\n [ngStyle]=\"getExpansionMotionStyle()\"\n [attr.id]=\"getRowExpansionDetailId(row, i)\"\n role=\"region\"\n [attr.aria-label]=\"getRowExpansionRegionAriaLabel(row, i)\"\n [attr.aria-busy]=\"getExpansionDetailViewState(row, i).status === 'loading' ? 'true' : 'false'\"\n >\n @let detailState = getExpansionDetailViewState(row, i);\n @if (detailState.status === 'loading') {\n <div class=\"pfx-expansion-detail-message\" role=\"status\" aria-live=\"polite\">\n <praxis-rich-content\n rootClassName=\"pfx-expansion-detail-message__content\"\n [nodes]=\"getExpansionDetailTextRichContentNodes('Carregando detail schema...', 'pfx-expansion-detail-message__text')\"\n [context]=\"getExpansionDetailRichContentContext(row, i)\"\n ></praxis-rich-content>\n </div>\n } @else if (detailState.status !== 'ready') {\n <div\n class=\"pfx-expansion-detail-message pfx-expansion-detail-message--error\"\n role=\"alert\"\n aria-live=\"assertive\"\n aria-atomic=\"true\"\n >\n <praxis-rich-content\n rootClassName=\"pfx-expansion-detail-message__content\"\n [nodes]=\"getExpansionDetailTextRichContentNodes(detailState.message || 'Detail indispon\u00EDvel para esta linha.', 'pfx-expansion-detail-message__text')\"\n [context]=\"getExpansionDetailRichContentContext(row, i)\"\n ></praxis-rich-content>\n </div>\n } @else {\n @if (getExpansionDetailLayout(detailState.schema) === 'tabs') {\n @let detailTabs = getExpansionDetailTabs(detailState.schema);\n @if (detailTabs.length) {\n <div class=\"pfx-expansion-detail-tabs\" role=\"tablist\" aria-label=\"Se\u00C3\u00A7\u00C3\u00B5es do detail\">\n @for (tab of detailTabs; track $index; let tabIndex = $index) {\n <button\n type=\"button\"\n class=\"pfx-expansion-detail-tab-btn\"\n role=\"tab\"\n [attr.id]=\"getExpansionDetailTabId(row, i, tab, tabIndex)\"\n [attr.aria-controls]=\"getExpansionDetailPanelId(row, i, tab, tabIndex)\"\n [attr.aria-selected]=\"isExpansionDetailTabActive(row, i, tab, tabIndex, detailTabs) ? 'true' : 'false'\"\n [attr.tabindex]=\"isExpansionDetailTabActive(row, i, tab, tabIndex, detailTabs) ? '0' : '-1'\"\n [class.is-active]=\"isExpansionDetailTabActive(row, i, tab, tabIndex, detailTabs)\"\n (click)=\"onExpansionDetailTabSelect(row, i, tab, tabIndex, $event)\"\n (keydown)=\"onExpansionDetailTabKeydown($event, row, i, tabIndex, detailTabs)\"\n >\n <praxis-rich-content\n rootClassName=\"pfx-expansion-detail-tab-btn__content\"\n [nodes]=\"getExpansionDetailTabButtonRichContentNodes(tab)\"\n [context]=\"getExpansionDetailRichContentContext(row, i)\"\n ></praxis-rich-content>\n </button>\n }\n </div>\n @for (tab of detailTabs; track $index; let tabIndex = $index) {\n @if (isExpansionDetailTabActive(row, i, tab, tabIndex, detailTabs)) {\n <div\n class=\"pfx-expansion-detail-tab-panel\"\n role=\"tabpanel\"\n [attr.id]=\"getExpansionDetailPanelId(row, i, tab, tabIndex)\"\n [attr.aria-labelledby]=\"getExpansionDetailTabId(row, i, tab, tabIndex)\"\n >\n @if (getExpansionDetailTabRichContentNodes(tab, row, i); as richNodes) {\n <praxis-rich-content\n class=\"pfx-expansion-node-host pfx-expansion-node-host--tab\"\n [nodes]=\"richNodes\"\n [context]=\"getExpansionDetailRichContentContext(row, i)\"\n ></praxis-rich-content>\n } @else {\n @for (childNode of getExpansionDetailNodeChildren(tab); track $index) {\n <ng-container\n *ngTemplateOutlet=\"\n expansionDetailNodeTemplate;\n context: { $implicit: childNode, row: row, index: i }\n \"\n ></ng-container>\n }\n }\n </div>\n }\n }\n } @else {\n <div class=\"pfx-expansion-detail-message\">\n <praxis-rich-content\n rootClassName=\"pfx-expansion-detail-message__content\"\n [nodes]=\"getExpansionDetailTextRichContentNodes('Schema em layout tabs sem abas v\u00E1lidas.', 'pfx-expansion-detail-message__text')\"\n [context]=\"getExpansionDetailRichContentContext(row, i)\"\n ></praxis-rich-content>\n </div>\n }\n } @else {\n <div class=\"pfx-expansion-detail-stack\">\n @for (node of getExpansionDetailItems(detailState.schema); track $index) {\n <ng-container\n *ngTemplateOutlet=\"\n expansionDetailNodeTemplate;\n context: { $implicit: node, row: row, index: i }\n \"\n ></ng-container>\n }\n </div>\n }\n }\n\n <ng-template #expansionDetailNodeTemplate let-node let-row=\"row\" let-index=\"index\">\n @if (getExpansionDetailRichContentNodes(node, row, index); as richNodes) {\n <praxis-rich-content\n class=\"pfx-expansion-node-host\"\n [nodes]=\"richNodes\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n } @else {\n @switch (getExpansionDetailNodeType(node)) {\n @case ('list') {\n <section class=\"pfx-expansion-node pfx-expansion-node-list\">\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-list__title\"\n [nodes]=\"getExpansionDetailTextRichContentNodes(getExpansionDetailNodeTitle(node, 'Lista'), 'pfx-expansion-node-list__title-text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n @let listItems = getExpansionDetailListItems(row, node);\n @let listEntries = getExpansionDetailListEntries(row, node);\n @if (listItems.length) {\n <ul>\n @for (entry of listEntries; track $index) {\n <li>\n @if (getExpansionDetailListItemRichContentNodes(entry); as richNodes) {\n <praxis-rich-content\n class=\"pfx-expansion-node-list__item-host\"\n [nodes]=\"richNodes\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n } @else {\n {{ formatExpansionDetailListEntry(entry) }}\n }\n </li>\n }\n </ul>\n } @else {\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-placeholder\"\n [nodes]=\"getExpansionDetailTextRichContentNodes('Sem itens.', 'pfx-expansion-node-placeholder__text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n }\n </section>\n }\n @case ('detailList') {\n <section class=\"pfx-expansion-node pfx-expansion-node-rich-list\">\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-rich-list__title\"\n [nodes]=\"getExpansionDetailTextRichContentNodes(getExpansionDetailNodeTitle(node, 'Cole\u00E7\u00E3o rica'), 'pfx-expansion-node-rich-list__title-text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n @let richListEntries = getExpansionDetailRichListEntries(row, node);\n @if (richListEntries.length) {\n <div class=\"pfx-expansion-node-rich-list__items\">\n @for (entry of richListEntries; track $index) {\n <article [class]=\"getExpansionDetailRichListItemClassName(node)\">\n <praxis-rich-content\n class=\"pfx-expansion-node-rich-list__item-host\"\n [nodes]=\"getExpansionDetailRichListItemNodes(node)\"\n [context]=\"getExpansionDetailRichListItemContext(row, index, node, entry, $index)\"\n ></praxis-rich-content>\n @let itemActions = getExpansionDetailRichListItemActions(node, row, index, entry, $index);\n @if (itemActions.length) {\n <div class=\"pfx-expansion-node-rich-list__item-actions\">\n @for (action of itemActions; track action.actionId) {\n <button\n type=\"button\"\n mat-stroked-button\n class=\"pfx-expansion-node-rich-list__item-action-btn\"\n [disabled]=\"isExpansionDetailRichListItemActionDisabled(action, row, index, node, entry, $index)\"\n (click)=\"onExpansionDetailRichListItemAction(action, row, index, node, entry, $index, $event)\"\n >\n <praxis-rich-content\n class=\"pfx-expansion-node-rich-list__item-action-host\"\n [nodes]=\"getExpansionDetailRichListItemActionNodes(action)\"\n [context]=\"getExpansionDetailRichListItemContext(row, index, node, entry, $index)\"\n ></praxis-rich-content>\n </button>\n }\n </div>\n }\n </article>\n }\n </div>\n } @else {\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-placeholder\"\n [nodes]=\"getExpansionDetailTextRichContentNodes(getExpansionDetailRichListEmptyText(node), 'pfx-expansion-node-placeholder__text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n }\n </section>\n }\n @case ('card') {\n <section class=\"pfx-expansion-node pfx-expansion-node-card\">\n <header class=\"pfx-expansion-node-card__header\">\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-card__title\"\n [nodes]=\"getExpansionDetailTextRichContentNodes(getExpansionDetailNodeTitle(node, 'Card'), 'pfx-expansion-node-card__title-text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n @if (node?.subtitle) {\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-card__subtitle\"\n [nodes]=\"getExpansionDetailTextRichContentNodes(node.subtitle, 'pfx-expansion-node-card__subtitle-text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n }\n </header>\n @if (getExpansionDetailNodeChildren(node).length) {\n <div class=\"pfx-expansion-node-card__content\">\n @for (childNode of getExpansionDetailNodeChildren(node); track $index) {\n <ng-container\n *ngTemplateOutlet=\"\n expansionDetailNodeTemplate;\n context: { $implicit: childNode, row: row, index: index }\n \"\n ></ng-container>\n }\n </div>\n }\n </section>\n }\n @case ('cardGrid') {\n <section class=\"pfx-expansion-node pfx-expansion-node-card-grid\">\n @if (getExpansionDetailCardGridHeaderNodes(node); as cardGridHeaderNodes) {\n @if (cardGridHeaderNodes.length) {\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-card-grid__header\"\n [nodes]=\"cardGridHeaderNodes\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n }\n }\n @let gridCards = getExpansionDetailCardGridCards(node);\n @if (gridCards.length) {\n <div\n class=\"pfx-expansion-node-card-grid__cards\"\n [ngStyle]=\"getExpansionDetailCardGridStyles(node)\"\n >\n @for (card of gridCards; track $index) {\n <praxis-rich-content\n class=\"pfx-expansion-node-card-grid__card-host\"\n [nodes]=\"getExpansionDetailCardGridCardNodes(card)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n }\n </div>\n } @else {\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-placeholder\"\n [nodes]=\"getExpansionDetailTextRichContentNodes('Sem itens.', 'pfx-expansion-node-placeholder__text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n }\n </section>\n }\n @case ('richText') {\n <div\n class=\"pfx-expansion-node pfx-expansion-node-richtext\"\n [innerHTML]=\"getExpansionDetailRichText(node)\"\n ></div>\n }\n @case ('formRef') {\n <section class=\"pfx-expansion-node pfx-expansion-node-embed\">\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-embed__header\"\n [nodes]=\"getExpansionDetailEmbedHeaderNodes(node)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-embed__meta\"\n [nodes]=\"getExpansionDetailEmbedMetaNodes(node)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-embed__empty\"\n [nodes]=\"getExpansionDetailTextRichContentNodes(getExpansionDetailEmbedEmptyText(node), 'pfx-expansion-node-embed__empty-text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n @if (getExpansionDetailEmbedAction(node, row, index); as embedAction) {\n <button\n type=\"button\"\n mat-stroked-button\n class=\"pfx-expansion-node-embed__action-btn\"\n [disabled]=\"isExpansionDetailEmbedActionDisabled(embedAction, row, index)\"\n (click)=\"onExpansionDetailEmbedAction(embedAction, row, index, $event)\"\n >\n <praxis-rich-content\n class=\"pfx-expansion-node-embed__action-host\"\n [nodes]=\"getExpansionDetailEmbedActionNodes(embedAction)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n </button>\n }\n </section>\n }\n @case ('tableRef') {\n <section class=\"pfx-expansion-node pfx-expansion-node-embed\">\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-embed__header\"\n [nodes]=\"getExpansionDetailEmbedHeaderNodes(node)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-embed__meta\"\n [nodes]=\"getExpansionDetailEmbedMetaNodes(node)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-embed__empty\"\n [nodes]=\"getExpansionDetailTextRichContentNodes(getExpansionDetailEmbedEmptyText(node), 'pfx-expansion-node-embed__empty-text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n @if (getExpansionDetailEmbedAction(node, row, index); as embedAction) {\n <button\n type=\"button\"\n mat-stroked-button\n class=\"pfx-expansion-node-embed__action-btn\"\n [disabled]=\"isExpansionDetailEmbedActionDisabled(embedAction, row, index)\"\n (click)=\"onExpansionDetailEmbedAction(embedAction, row, index, $event)\"\n >\n <praxis-rich-content\n class=\"pfx-expansion-node-embed__action-host\"\n [nodes]=\"getExpansionDetailEmbedActionNodes(embedAction)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n </button>\n }\n </section>\n }\n @case ('chartRef') {\n @if (getExpansionDetailInlineRendererView(node, row, index); as inlineRenderer) {\n <section class=\"pfx-expansion-node pfx-expansion-node-embed pfx-expansion-node-embed--inline pfx-expansion-node-embed--chart\">\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-embed__header\"\n [nodes]=\"getExpansionDetailEmbedHeaderNodes(node)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n <ng-container\n *ngComponentOutlet=\"inlineRenderer.component; inputs: inlineRenderer.inputs\"\n ></ng-container>\n @if (getExpansionDetailEmbedAction(node, row, index); as embedAction) {\n <button\n type=\"button\"\n mat-stroked-button\n class=\"pfx-expansion-node-embed__action-btn\"\n [disabled]=\"isExpansionDetailEmbedActionDisabled(embedAction, row, index)\"\n (click)=\"onExpansionDetailEmbedAction(embedAction, row, index, $event)\"\n >\n <praxis-rich-content\n class=\"pfx-expansion-node-embed__action-host\"\n [nodes]=\"getExpansionDetailEmbedActionNodes(embedAction)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n </button>\n }\n </section>\n } @else {\n <section class=\"pfx-expansion-node pfx-expansion-node-embed\">\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-embed__header\"\n [nodes]=\"getExpansionDetailEmbedHeaderNodes(node)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-embed__meta\"\n [nodes]=\"getExpansionDetailEmbedMetaNodes(node)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-embed__empty\"\n [nodes]=\"getExpansionDetailTextRichContentNodes(getExpansionDetailEmbedEmptyText(node), 'pfx-expansion-node-embed__empty-text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n @if (getExpansionDetailEmbedAction(node, row, index); as embedAction) {\n <button\n type=\"button\"\n mat-stroked-button\n class=\"pfx-expansion-node-embed__action-btn\"\n [disabled]=\"isExpansionDetailEmbedActionDisabled(embedAction, row, index)\"\n (click)=\"onExpansionDetailEmbedAction(embedAction, row, index, $event)\"\n >\n <praxis-rich-content\n class=\"pfx-expansion-node-embed__action-host\"\n [nodes]=\"getExpansionDetailEmbedActionNodes(embedAction)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n </button>\n }\n </section>\n }\n }\n @case ('templateRef') {\n <section class=\"pfx-expansion-node pfx-expansion-node-embed\">\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-embed__header\"\n [nodes]=\"getExpansionDetailEmbedHeaderNodes(node)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-embed__meta\"\n [nodes]=\"getExpansionDetailEmbedMetaNodes(node)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-embed__empty\"\n [nodes]=\"getExpansionDetailTextRichContentNodes(getExpansionDetailEmbedEmptyText(node), 'pfx-expansion-node-embed__empty-text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n @if (getExpansionDetailEmbedAction(node, row, index); as embedAction) {\n <button\n type=\"button\"\n mat-stroked-button\n class=\"pfx-expansion-node-embed__action-btn\"\n [disabled]=\"isExpansionDetailEmbedActionDisabled(embedAction, row, index)\"\n (click)=\"onExpansionDetailEmbedAction(embedAction, row, index, $event)\"\n >\n <praxis-rich-content\n class=\"pfx-expansion-node-embed__action-host\"\n [nodes]=\"getExpansionDetailEmbedActionNodes(embedAction)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n </button>\n }\n </section>\n }\n @case ('diagramEmbed') {\n <section class=\"pfx-expansion-node pfx-expansion-node-embed\">\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-embed__header\"\n [nodes]=\"getExpansionDetailEmbedHeaderNodes(node)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-embed__meta\"\n [nodes]=\"getExpansionDetailEmbedMetaNodes(node)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n @if (getExpansionDetailDiagramSource(row, node); as diagramSource) {\n <div class=\"pfx-expansion-node-embed__diagram\">\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-embed__diagram-label\"\n [nodes]=\"getExpansionDetailTextRichContentNodes(getExpansionDetailDiagramSourceLabel(), 'pfx-expansion-node-embed__diagram-label-text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n <pre class=\"pfx-expansion-node-embed__diagram-source\">{{ diagramSource }}</pre>\n </div>\n } @else {\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-embed__empty\"\n [nodes]=\"getExpansionDetailTextRichContentNodes(getExpansionDetailEmbedEmptyText(node), 'pfx-expansion-node-embed__empty-text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n }\n @if (getExpansionDetailEmbedAction(node, row, index); as embedAction) {\n <button\n type=\"button\"\n mat-stroked-button\n class=\"pfx-expansion-node-embed__action-btn\"\n [disabled]=\"isExpansionDetailEmbedActionDisabled(embedAction, row, index)\"\n (click)=\"onExpansionDetailEmbedAction(embedAction, row, index, $event)\"\n >\n <praxis-rich-content\n class=\"pfx-expansion-node-embed__action-host\"\n [nodes]=\"getExpansionDetailEmbedActionNodes(embedAction)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n </button>\n }\n </section>\n }\n @case ('action') {\n <div class=\"pfx-expansion-node pfx-expansion-node-action\">\n <button\n type=\"button\"\n mat-stroked-button\n [disabled]=\"isExpansionDetailActionDisabled(node)\"\n (click)=\"onExpansionDetailAction(node, row, $event)\"\n >\n <praxis-rich-content\n class=\"pfx-expansion-node-action__content\"\n [nodes]=\"getExpansionDetailActionRichContentNodes(node)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n </button>\n @if (getExpansionDetailActionStatusText(node); as actionStatusText) {\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-action__status\"\n [nodes]=\"getExpansionDetailTextRichContentNodes(actionStatusText, 'pfx-expansion-node-action__status-text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n }\n </div>\n }\n @case ('actionBar') {\n <section class=\"pfx-expansion-node pfx-expansion-node-action-bar\">\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-action-bar__title\"\n [nodes]=\"getExpansionDetailTextRichContentNodes(getExpansionDetailActionBarTitle(node), 'pfx-expansion-node-action-bar__title-text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n @let actionBarActions = getExpansionDetailActionBarActions(node, row, index);\n @if (actionBarActions.length) {\n <div class=\"pfx-expansion-node-action-bar__actions\">\n @for (action of actionBarActions; track action.actionId) {\n <button\n type=\"button\"\n mat-stroked-button\n class=\"pfx-expansion-node-action-bar__action-btn\"\n [disabled]=\"isExpansionDetailActionBarActionDisabled(action, row, index)\"\n (click)=\"onExpansionDetailActionBarAction(action, row, index, $event)\"\n >\n <praxis-rich-content\n class=\"pfx-expansion-node-action-bar__action-host\"\n [nodes]=\"getExpansionDetailActionBarActionNodes(action)\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n </button>\n }\n </div>\n } @else {\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-placeholder\"\n [nodes]=\"getExpansionDetailTextRichContentNodes(getExpansionDetailActionBarEmptyText(node), 'pfx-expansion-node-placeholder__text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n }\n </section>\n }\n @case ('tab') {\n <div class=\"pfx-expansion-node pfx-expansion-node-placeholder\">\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-placeholder__content\"\n [nodes]=\"getExpansionDetailTextRichContentNodes('Node', 'pfx-expansion-node-placeholder__text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n <code>tab</code>\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-placeholder__content\"\n [nodes]=\"getExpansionDetailTextRichContentNodes('fora de contexto de tabs.', 'pfx-expansion-node-placeholder__text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n </div>\n }\n @default {\n <div class=\"pfx-expansion-node pfx-expansion-node-placeholder\">\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-placeholder__content\"\n [nodes]=\"getExpansionDetailTextRichContentNodes('Node n\u00E3o suportado:', 'pfx-expansion-node-placeholder__text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n <code>{{ getExpansionDetailNodeType(node) }}</code>\n </div>\n }\n }\n }\n </ng-template>\n </section>\n </td>\n </ng-container>\n <tr\n mat-row\n *matRowDef=\"let row; columns: expansionDetailRowColumns; when: isExpansionDetailRow\"\n class=\"pfx-expansion-detail-row\"\n ></tr>\n }\n }\n </table>\n }\n\n <!-- Virtual rows path (header preserved above) -->\n @if (shouldRenderDataSurface() && !schemaError && !dataError && isVirtualized()) {\n <cdk-virtual-scroll-viewport\n class=\"ptable-viewport\"\n [itemSize]=\"getVirtItemHeight()\"\n [minBufferPx]=\"getVirtBufferSize() * getVirtItemHeight()\"\n [maxBufferPx]=\"getVirtBufferSize() * getVirtItemHeight() * 2\"\n [style.minHeight]=\"getVirtMinHeightHostStyle()\"\n >\n <table\n class=\"mat-mdc-table\"\n [ngClass]=\"getTableElevationClassName()\"\n [class.table-stack-top]=\"hasTopToolbarStack()\"\n [style.width]=\"getVirtualTableWidthStyle()\"\n >\n <tbody>\n <tr class=\"mat-mdc-row\"\n *cdkVirtualFor=\"let row of dataSource.data; let i = index; trackBy: trackByRow\"\n [class.pfx-row-selected]=\"selection.isSelected(row)\"\n [class.pfx-row-click-selectable]=\"isRowClickSelectable()\"\n [attr.aria-selected]=\"config.behavior?.selection?.enabled ? (selection.isSelected(row) ? 'true' : 'false') : null\"\n [ngClass]=\"getRowClasses(row)\"\n [ngStyle]=\"getRowNgStyle(row)\"\n [matTooltip]=\"getRowTooltip(row) || null\"\n [matTooltipDisabled]=\"!getRowTooltip(row)\"\n [matTooltipPosition]=\"getRowTooltipPosition(row)\"\n [matTooltipShowDelay]=\"getRowTooltipShowDelay(row)\"\n (click)=\"onRowClicked(row, i, $event)\"\n (dblclick)=\"onRowDoubleClicked(row, i)\">\n <!-- Selection column -->\n @if (isSelectionColumnEnabled()) { <td class=\"mat-mdc-cell\">\n <mat-checkbox\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleRow(row)\"\n [checked]=\"selection.isSelected(row)\">\n </mat-checkbox>\n </td> }\n <!-- Data columns -->\n @for (column of visibleColumns; track column.field) {\n <td class=\"mat-mdc-cell\"\n [style.text-align]=\"getColumnTextAlignStyle(column)\"\n [style.width]=\"getColumnWidthStyle(column)\"\n [attr.style]=\"getColumnCellAttrStyle(column)\"\n [ngClass]=\"getCellClasses(row, column)\"\n [ngStyle]=\"getCellNgStyle(row, column)\"\n [matTooltip]=\"getCellTooltip(row, column) || ''\"\n [matTooltipPosition]=\"getCellTooltipPosition(row, column)\"\n [matTooltipDisabled]=\"!getCellTooltip(row, column)\"\n [attr.title]=\"getCellTooltip(row, column) || null\">\n <div\n class=\"pfx-cell-content\"\n [ngClass]=\"getCellContentClasses(row, column)\"\n [ngStyle]=\"getCellContentNgStyle(row, column)\"\n >\n @switch (getEffectiveRendererType(row, column)) {\n @case ('icon') {\n <span class=\"pfx-icon-renderer\"\n [style.color]=\"getIconColor(row, column) || null\"\n [ngStyle]=\"getIconStyle(row, column)\"\n [attr.aria-label]=\"getIconAriaLabel(row, column) || null\">\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-icon-renderer__content\"\n [nodes]=\"getIconRichContentNodes(row, column)\"\n ></praxis-rich-content>\n </span>\n }\n @case ('image') {\n <span class=\"pfx-cell-image\">\n <praxis-rich-content\n rootClassName=\"pfx-cell-image__content\"\n [nodes]=\"getImageRichContentNodes(row, column)\"\n ></praxis-rich-content>\n </span>\n }\n @case ('badge') {\n @if (shouldRenderBadge(row, column)) {\n <span class=\"pfx-badge\" [ngClass]=\"getBadgeClasses(row, column)\">\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-badge__content\"\n [nodes]=\"getBadgeRichContentNodes(row, column)\"\n ></praxis-rich-content>\n </span>\n }\n }\n @case ('chip') {\n @if (shouldRenderChip(row, column)) {\n <span class=\"pfx-chip\" [ngClass]=\"getChipClasses(row, column)\">\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-chip__content\"\n [nodes]=\"getChipRichContentNodes(row, column)\"\n ></praxis-rich-content>\n </span>\n }\n }\n @case ('progress') {\n <div class=\"pfx-progress\">\n <praxis-rich-content\n rootClassName=\"pfx-progress__content\"\n [context]=\"getProgressRichContentContext(row, column)\"\n [nodes]=\"getProgressRichContentNodes(row, column)\"\n ></praxis-rich-content>\n </div>\n }\n @case ('microVisualization') {\n <span class=\"pfx-micro-viz-cell\" [innerHTML]=\"getMicroVisualizationHtml(row, column)\"></span>\n }\n @case ('avatar') {\n <span\n class=\"pfx-avatar-renderer\"\n [ngStyle]=\"getAvatarStyle(row, column)\"\n [class.shape-rounded]=\"getAvatarShape(row, column) === 'rounded'\"\n [class.shape-circle]=\"getAvatarShape(row, column) === 'circle'\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-avatar-renderer__content\"\n [nodes]=\"getAvatarRichContentNodes(row, column)\"\n ></praxis-rich-content>\n </span>\n }\n @case ('link') {\n <a\n class=\"pfx-link\"\n [attr.href]=\"getLinkHref(row, column) || null\"\n [attr.target]=\"getLinkTarget(row, column) || null\"\n [attr.rel]=\"getLinkRel(row, column) || null\"\n (click)=\"$event.stopPropagation()\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-link__content\"\n [nodes]=\"getLinkRichContentNodes(row, column)\"\n ></praxis-rich-content>\n </a>\n }\n @case ('button') {\n @switch (getButtonVariant(row, column)) {\n @case ('outlined') {\n <button\n mat-stroked-button\n [color]=\"getButtonColor(row, column) || null\"\n [disabled]=\"isButtonDisabled(row, column)\"\n [attr.aria-label]=\"getButtonAriaLabel(row, column) || getButtonLabel(row, column)\"\n (click)=\"onButtonClick(row, column, $event)\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-button-renderer__content\"\n [nodes]=\"getButtonRichContentNodes(row, column)\"\n ></praxis-rich-content>\n </button>\n }\n @case ('text') {\n <button\n mat-button\n [color]=\"getButtonColor(row, column) || null\"\n [disabled]=\"isButtonDisabled(row, column)\"\n [attr.aria-label]=\"getButtonAriaLabel(row, column) || getButtonLabel(row, column)\"\n (click)=\"onButtonClick(row, column, $event)\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-button-renderer__content\"\n [nodes]=\"getButtonRichContentNodes(row, column)\"\n ></praxis-rich-content>\n </button>\n }\n @default {\n <button\n mat-flat-button\n [color]=\"getButtonColor(row, column) || null\"\n [disabled]=\"isButtonDisabled(row, column)\"\n [attr.aria-label]=\"getButtonAriaLabel(row, column) || getButtonLabel(row, column)\"\n (click)=\"onButtonClick(row, column, $event)\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-button-renderer__content\"\n [nodes]=\"getButtonRichContentNodes(row, column)\"\n ></praxis-rich-content>\n </button>\n }\n }\n }\n @case ('menu') {\n <button\n mat-icon-button\n [matMenuTriggerFor]=\"menuRef\"\n (click)=\"$event.stopPropagation()\"\n [attr.aria-label]=\"getMenuAriaLabel(row, column) || 'Menu'\"\n >\n <praxis-rich-content\n rootClassName=\"pfx-menu-trigger__content\"\n [nodes]=\"getMenuTriggerRichContentNodes()\"\n ></praxis-rich-content>\n </button>\n <mat-menu #menuRef=\"matMenu\">\n @for (it of getMenuItems(row, column); track it.id) {\n <button\n mat-menu-item\n (click)=\"onMenuItemClick(it, row, $event)\"\n [disabled]=\"!it.__visible\"\n >\n <praxis-rich-content\n rootClassName=\"pfx-menu-item__content\"\n [nodes]=\"getMenuItemRichContentNodes(it)\"\n ></praxis-rich-content>\n </button>\n }\n </mat-menu>\n }\n @default {\n {{ getCellValue(row, column) }}\n }\n }\n </div>\n </td>\n }\n\n <!-- Actions column -->\n @if (config.actions?.row?.enabled) {\n <td class=\"mat-mdc-cell praxis-actions-cell\" [class.dense]=\"dense\" [style.width]=\"getRowActionsWidthStyle()\">\n <div\n class=\"praxis-actions-cell__content\"\n [class.praxis-actions-cell__content--discovering]=\"isRowDiscoveryPending(row)\"\n [attr.aria-busy]=\"isRowDiscoveryPending(row) ? 'true' : null\"\n >\n @if (config.actions?.row?.display === 'icons' || !config.actions?.row?.display) {\n @for (a of getInlineRowActions(row); track trackAction($index, a)) {\n <span\n class=\"praxis-row-action-anchor\"\n [class.praxis-row-action-anchor--workflow]=\"isWorkflowRowAction(a)\"\n [class.praxis-row-action-anchor--blocked]=\"isBlockedWorkflowRowAction(a, row)\"\n [matTooltip]=\"getActionTooltip(a, row)\"\n [matTooltipDisabled]=\"!getActionTooltip(a, row)\"\n matTooltipPosition=\"above\"\n matTooltipClass=\"praxis-tooltip\"\n >\n <button mat-icon-button class=\"praxis-icon-btn\"\n [class.praxis-icon-btn--workflow]=\"isWorkflowRowAction(a)\"\n [class.praxis-icon-btn--blocked]=\"isBlockedWorkflowRowAction(a, row)\"\n [disabled]=\"isActionDisabled(a, row)\"\n (click)=\"onRowAction(getActionId(a), row, $event, getRowActionRuntimeOptions(a, row))\"\n [attr.aria-label]=\"a.label || getActionId(a)\"\n [color]=\"a.color || null\">\n <praxis-rich-content\n layout=\"inline\"\n rootClassName=\"praxis-row-action__content\"\n [nodes]=\"getRowActionIconRichContentNodes(a)\"\n ></praxis-rich-content>\n </button>\n </span>\n }\n }\n @if (config.actions?.row?.display === 'buttons') {\n @for (a of getInlineRowActions(row); track trackAction($index, a)) {\n <span\n class=\"praxis-row-action-anchor\"\n [class.praxis-row-action-anchor--workflow]=\"isWorkflowRowAction(a)\"\n [class.praxis-row-action-anchor--blocked]=\"isBlockedWorkflowRowAction(a, row)\"\n [matTooltip]=\"getActionTooltip(a, row)\"\n [matTooltipDisabled]=\"!getActionTooltip(a, row)\"\n matTooltipPosition=\"above\"\n matTooltipClass=\"praxis-tooltip\"\n >\n <button mat-flat-button class=\"praxis-row-btn\"\n [class.praxis-row-btn--workflow]=\"isWorkflowRowAction(a)\"\n [class.praxis-row-btn--blocked]=\"isBlockedWorkflowRowAction(a, row)\"\n [disabled]=\"isActionDisabled(a, row)\"\n (click)=\"onRowAction(getActionId(a), row, $event, getRowActionRuntimeOptions(a, row))\"\n [attr.aria-label]=\"a.label || getActionId(a)\"\n [color]=\"a.color || null\">\n <praxis-rich-content\n layout=\"inline\"\n rootClassName=\"praxis-row-action__content\"\n [nodes]=\"getRowActionRichContentNodes(a)\"\n ></praxis-rich-content>\n </button>\n </span>\n }\n }\n @if (hasOverflowRowActions(row)) {\n <button mat-icon-button class=\"praxis-icon-btn praxis-more-btn\"\n [matMenuTriggerFor]=\"rowMoreMenuV\"\n (menuOpened)=\"onRowOverflowMenuOpened(row)\"\n [color]=\"getRowMenuButtonColor() || null\"\n [attr.aria-label]=\"getRowMenuTooltip(row)\"\n [matTooltip]=\"getRowMenuTooltip(row)\"\n matTooltipPosition=\"above\">\n <mat-icon [praxisIcon]=\"getRowMenuIcon()\"></mat-icon>\n </button>\n }\n <mat-menu #rowMoreMenuV=\"matMenu\" xPosition=\"before\">\n @if (hasRowOverflowMenuLoadingState(row)) {\n <button mat-menu-item disabled>\n <mat-icon>hourglass_empty</mat-icon>\n <praxis-rich-content\n rootClassName=\"praxis-row-overflow-menu__label\"\n [nodes]=\"getTableChromeTextRichContentNodes(getRowOverflowMenuLoadingLabel(), 'praxis-row-overflow-menu__label-text')\"\n ></praxis-rich-content>\n </button>\n }\n @for (a of getOverflowRowActions(row); track trackAction($index, a)) {\n <button mat-menu-item (click)=\"onRowAction(getActionId(a), row, $event, getRowActionRuntimeOptions(a, row))\" [disabled]=\"isActionDisabled(a, row)\">\n <mat-icon [color]=\"a.color || null\" [praxisIcon]=\"a.icon\"></mat-icon>\n <praxis-rich-content\n rootClassName=\"praxis-row-overflow-menu__label\"\n [nodes]=\"getTableChromeTextRichContentNodes(a.label || getActionId(a), 'praxis-row-overflow-menu__label-text')\"\n ></praxis-rich-content>\n </button>\n }\n @if (hasRowOverflowMenuEmptyState(row)) {\n <button mat-menu-item disabled>\n <mat-icon>info</mat-icon>\n <praxis-rich-content\n rootClassName=\"praxis-row-overflow-menu__label\"\n [nodes]=\"getTableChromeTextRichContentNodes(getRowOverflowMenuEmptyLabel(row), 'praxis-row-overflow-menu__label-text')\"\n ></praxis-rich-content>\n </button>\n }\n </mat-menu>\n </div>\n </td>\n }\n </tr>\n </tbody>\n </table>\n </cdk-virtual-scroll-viewport>\n }\n\n</div>\n@if (shouldShowLoadingSurface()) {\n <div class=\"ptable-loading-state\" role=\"status\" aria-live=\"polite\">\n <div class=\"ptable-loading-state__hero\" aria-hidden=\"true\">\n <span class=\"ptable-loading-state__line ptable-loading-state__line--wide\"></span>\n <span class=\"ptable-loading-state__line ptable-loading-state__line--short\"></span>\n <div class=\"ptable-loading-state__rows\">\n @for (placeholder of [1, 2, 3]; track placeholder) {\n <div class=\"ptable-loading-state__row\">\n <span class=\"ptable-loading-state__cell ptable-loading-state__cell--short\"></span>\n <span class=\"ptable-loading-state__cell\"></span>\n <span class=\"ptable-loading-state__cell ptable-loading-state__cell--wide\"></span>\n </div>\n }\n </div>\n </div>\n <div class=\"ptable-loading-state__message\">\n {{ getLoadingSurfaceMessage() }}\n </div>\n </div>\n}\n@if (shouldShowNoDataState()) {\n <div class=\"ptable-no-data-state\" role=\"status\" aria-live=\"polite\">\n <praxis-empty-state-card\n [icon]=\"getNoDataStateIcon()\"\n [title]=\"getNoDataStateTitle()\"\n [description]=\"getNoDataStateDescription()\"\n [primaryAction]=\"getNoDataStatePrimaryAction()\"\n [secondaryActions]=\"getNoDataStateSecondaryActions()\"\n [inline]=\"true\"\n ></praxis-empty-state-card>\n </div>\n}\n@if (\n shouldRenderDataSurface()\n && !schemaError\n && !dataError\n && shouldRenderFloatingBulkActions()\n && getFloatingBulkActions().length\n && !shouldHideFloatingBulkActions()\n ) {\n <div [class]=\"'praxis-floating-bulk-actions ' + getFloatingBulkPositionClass()\">\n @for (action of getFloatingBulkActions(); track getActionId(action)) {\n <button\n mat-mini-fab\n [color]=\"action.color || 'primary'\"\n [disabled]=\"isFloatingBulkActionDisabled(action)\"\n (click)=\"onToolbarAction({ action: getActionId(action), actionConfig: action })\"\n [attr.aria-label]=\"action.label || getActionId(action)\"\n [matTooltip]=\"action.label || getActionId(action)\"\n matTooltipPosition=\"left\"\n >\n <praxis-rich-content\n rootClassName=\"praxis-floating-bulk-actions__content\"\n [nodes]=\"getFloatingBulkActionRichContentNodes(action)\"\n ></praxis-rich-content>\n </button>\n }\n </div>\n}\n<!-- Barra de a\u00C3\u00A7\u00C3\u00B5es no rodap\u00C3\u00A9 (opcional) -->\n@if (shouldRenderDataSurface() && !schemaError && !dataError && showToolbar && shouldRenderFooterToolbar()) {\n <praxis-table-toolbar\n [config]=\"config\"\n [backgroundColor]=\"getToolbarActionsBackgroundColor()\"\n [style.--pfx-filter-h]=\"getToolbarLayoutHeightHostStyle()\"\n [class.footer-flat]=\"hasBottomPaginator()\"\n class=\"praxis-toolbar-footer\"\n placement=\"footer\"\n [showMain]=\"shouldShowFooterToolbarMain()\"\n [showEndActions]=\"shouldShowFooterToolbarEndActions()\"\n [showActionsGroup]=\"shouldShowToolbarActionsBottom()\"\n [showMobileActions]=\"shouldShowToolbarActionsBottom()\"\n [evaluationContext]=\"getToolbarEvaluationContext()\"\n [columnVisibilityController]=\"toolbarColumnVisibilityController\"\n [exportBusy]=\"exportBusy\"\n (toolbarAction)=\"onToolbarAction($event)\"\n (exportAction)=\"onExportAction($event)\"\n >\n @if (shouldShowFooterToolbarMain() && shouldRenderAdvancedFilter()) {\n <praxis-filter\n advancedFilter\n [resourcePath]=\"getAdvancedFilterResourcePath()\"\n [filterId]=\"tableId\"\n [formId]=\"tableId\"\n [persistenceKey]=\"getAdvancedFilterPersistenceKey()\"\n [fieldMetadata]=\"getAdvancedFilterFieldMetadata()\"\n [enableCustomization]=\"enableCustomization\"\n [value]=\"advancedFilterValue\"\n [alwaysVisibleFields]=\"getAdvancedFilterAlwaysVisibleFields()\"\n [alwaysVisibleFieldMetadataOverrides]=\"getAdvancedFilterAlwaysVisibleFieldMetadataOverrides()\"\n [selectedFieldIds]=\"config.behavior?.filtering?.advancedFilters?.settings?.selectedFieldIds ?? []\"\n [allowSaveTags]=\"config.behavior?.filtering?.advancedFilters?.settings?.allowSaveTags\"\n [changeDebounceMs]=\"config.behavior?.filtering?.advancedFilters?.settings?.changeDebounceMs ?? 300\"\n [i18n]=\"getFilterI18n()\"\n [mode]=\"'filter'\"\n [showFilterSettings]=\"enableCustomization\"\n (change)=\"onAdvancedFilterChange($event)\"\n (requestSearch)=\"onAdvancedFilterSubmit($event)\"\n (clear)=\"onAdvancedFilterClear()\"\n ></praxis-filter>\n }\n @if (shouldShowFooterToolbarMain() && shouldRenderAdvancedFilter()) {\n <ng-content select=\"[advancedFilter]\"></ng-content>\n }\n @if (shouldShowFooterToolbarMain() && shouldRenderAdvancedFilter()) {\n <ng-content select=\"[toolbar]\"></ng-content>\n }\n @if (shouldShowFooterToolbarMain() && shouldRenderAdvancedFilter()) {\n @if (shouldShowAiAssistantEntrypoint()) {\n <button\n end-actions\n mat-icon-button\n color=\"primary\"\n type=\"button\"\n class=\"praxis-table-ai-trigger praxis-table-toolbar-action--ai\"\n [class.praxis-table-ai-trigger--minimized]=\"hasMinimizedAiAssistantSession()\"\n [attr.data-testid]=\"aiAssistantTriggerTestId('footer')\"\n (click)=\"openAiAssistant()\"\n [attr.aria-label]=\"aiAssistantTriggerLabel()\"\n [matBadge]=\"aiAssistantTriggerBadge()\"\n [matBadgeHidden]=\"!hasMinimizedAiAssistantSession()\"\n matBadgeColor=\"accent\"\n matBadgeSize=\"small\"\n matBadgePosition=\"above after\"\n [matTooltip]=\"aiAssistantTriggerTooltip()\"\n matTooltipPosition=\"below\"\n >\n <mat-icon>{{ aiAssistantTriggerIcon() }}</mat-icon>\n </button>\n }\n }\n @if (shouldShowFooterToolbarMain() && shouldRenderAdvancedFilter() && enableCustomization) {\n <button\n end-actions\n mat-icon-button\n color=\"primary\"\n data-role=\"table-settings\"\n class=\"praxis-table-toolbar-action--configuration\"\n data-testid=\"table-settings-trigger\"\n (click)=\"openTableSettings()\"\n [attr.aria-label]=\"getTableSettingsLabel()\"\n [matBadge]=\"schemaOutdated ? '!' : ''\"\n [matBadgeHidden]=\"!schemaOutdated\"\n matBadgeColor=\"warn\"\n matBadgeSize=\"small\"\n matBadgePosition=\"above after\"\n [matTooltip]=\"getTableSettingsTooltip()\"\n matTooltipPosition=\"below\"\n >\n <mat-icon>settings</mat-icon>\n </button>\n }\n </praxis-table-toolbar>\n}\n@if (shouldRenderDataSurface() && !schemaError && !dataError && getPaginationEnabled() && (config.behavior?.pagination?.position === 'bottom' || config.behavior?.pagination?.position === 'both' || !config.behavior?.pagination?.position)) {\n <mat-paginator\n [length]=\"getPaginationLength()\"\n [pageSize]=\"getPaginationPageSize()\"\n [pageSizeOptions]=\"getPaginationPageSizeOptions()\"\n [selectConfig]=\"paginatorSelectConfig\"\n [showFirstLastButtons]=\"getPaginationShowFirstLast()\"\n (page)=\"onPageChange($event)\"\n [class.compact]=\"config.behavior?.pagination?.style === 'compact'\"\n [class.footer-stack]=\"shouldShowToolbarActionsBottom()\"\n >\n </mat-paginator>\n}\n", styles: ["@charset \"UTF-8\";table{width:100%}.praxis-visually-hidden-status{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}.praxis-column-reorder-status{margin:8px 0;padding:10px 12px;border-radius:8px;border:1px solid var(--p-table-border-color);background:var(--p-table-row-hover-bg);color:var(--p-table-header-fg);font-size:12px;line-height:1.4;box-shadow:0 4px 12px #00000014;animation:pfx-column-reorder-status-in var(--p-table-drag-status-enter-duration, .18s) var(--p-table-motion-easing, cubic-bezier(0, 0, .2, 1))}@keyframes pfx-column-reorder-status-in{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}.praxis-actions-cell{height:100%;padding-inline:12px;white-space:nowrap}.pfx-expansion-col-header,.pfx-expansion-col-cell{width:52px;min-width:52px;text-align:center}.pfx-expansion-toggle:focus-visible{outline:2px solid var(--md-sys-color-primary);outline-offset:2px}.pfx-expansion-detail-row{background:var(--md-sys-color-surface-container-low)}.pfx-expansion-detail-cell{padding:0!important;border-bottom:1px solid var(--p-table-border-color)}.pfx-expansion-detail-panel{padding:12px 16px;border-left:3px solid var(--md-sys-color-primary)}.pfx-expansion-detail-panel.pfx-expansion-motion-none{animation:none;transition:none}.pfx-expansion-detail-panel.pfx-expansion-motion-subtle-slide{animation:pfx-expansion-subtle-slide-in var(--pfx-expansion-motion-duration, .16s) var(--pfx-expansion-motion-easing, cubic-bezier(.2, 0, 0, 1))}.pfx-expansion-detail-panel.pfx-expansion-motion-accordion{animation:pfx-expansion-accordion-in var(--pfx-expansion-motion-duration, .18s) var(--pfx-expansion-motion-easing, cubic-bezier(.2, 0, 0, 1));transform-origin:top center}.pfx-expansion-detail-panel.pfx-expansion-motion-fade-scale{animation:pfx-expansion-fade-scale-in var(--pfx-expansion-motion-duration, .16s) var(--pfx-expansion-motion-easing, cubic-bezier(.2, 0, 0, 1));transform-origin:top center}@keyframes pfx-expansion-subtle-slide-in{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}@keyframes pfx-expansion-accordion-in{0%{opacity:0;transform:scaleY(.96)}to{opacity:1;transform:scaleY(1)}}@keyframes pfx-expansion-fade-scale-in{0%{opacity:0;transform:translateY(-2px) scale(.985)}to{opacity:1;transform:translateY(0) scale(1)}}.pfx-expansion-detail-schema{margin:0;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:12px;line-height:1.4;white-space:pre-wrap;word-break:break-word;color:var(--md-sys-color-on-surface-variant)}.pfx-expansion-detail-message{font-size:13px;color:var(--md-sys-color-on-surface-variant)}.pfx-expansion-detail-message--error{color:var(--md-sys-color-error)}.pfx-expansion-detail-stack{display:grid;gap:10px}.pfx-expansion-detail-tabs{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:10px}.pfx-expansion-detail-tab-btn{border:1px solid var(--p-table-border-color);background:var(--md-sys-color-surface);color:var(--md-sys-color-on-surface);border-radius:999px;padding:6px 12px;font-size:12px;line-height:1.2;cursor:pointer}.pfx-expansion-detail-tab-btn__content{display:inline-flex;align-items:center;gap:6px;min-width:0}.pfx-expansion-detail-tab-btn__icon .prx-rich-icon{font-size:16px;line-height:1}.pfx-expansion-detail-tab-btn__title{white-space:nowrap}.pfx-expansion-detail-tab-btn__badge .prx-rich-badge{padding:0 8px;min-height:18px;background:color-mix(in srgb,currentColor 12%,transparent);color:inherit}.pfx-expansion-detail-tab-btn.is-active{border-color:var(--md-sys-color-primary);color:var(--md-sys-color-primary);font-weight:600}.pfx-expansion-detail-tab-btn:focus-visible{outline:2px solid var(--md-sys-color-primary);outline-offset:2px}.pfx-expansion-detail-tab-panel{display:grid;gap:10px}.pfx-expansion-node{border:1px solid var(--p-table-border-color);border-radius:8px;padding:10px 12px;background:var(--md-sys-color-surface)}.pfx-expansion-node-card__header{margin-bottom:8px}.pfx-expansion-node-card__title{margin:0;font-size:14px;line-height:1.3}.pfx-expansion-node-card__subtitle{margin:4px 0 0;font-size:12px;color:var(--md-sys-color-on-surface-variant)}.pfx-expansion-node-card__content{display:grid;gap:10px}.pfx-expansion-node-value{display:flex;align-items:baseline;gap:8px}.pfx-expansion-node-value__label{color:var(--md-sys-color-on-surface-variant);font-size:12px}.pfx-expansion-node-value__content{font-size:14px}.pfx-expansion-node-list__title{margin:0 0 6px;font-size:13px}.pfx-expansion-node-list ul{margin:0;padding-left:18px}.pfx-expansion-node-rich-list__title{margin:0 0 8px;font-size:13px}.pfx-expansion-node-rich-list__items{display:grid;gap:12px}.pfx-expansion-node-rich-list__item{display:grid;gap:10px;padding:12px;border:1px solid var(--md-sys-color-outline-variant, #d7dbe5);border-radius:14px;background:var(--md-sys-color-surface-container-lowest, #fff)}.pfx-expansion-node-rich-list__item--row{grid-template-columns:minmax(0,1fr) auto;align-items:center}.pfx-expansion-node-rich-list__item--stack{grid-template-columns:minmax(0,1fr)}.pfx-expansion-node-rich-list__item--card-list{grid-template-columns:minmax(0,1fr);box-shadow:0 4px 14px #0f172a0a}.pfx-expansion-node-rich-list__item-host{min-width:0}.pfx-expansion-node-rich-list__item-actions{display:flex;flex-wrap:wrap;gap:8px;align-items:center}.pfx-expansion-node-rich-list__item-action-btn{min-width:0}.pfx-expansion-node-rich-list__item-action-host{display:inline-flex;align-items:center}.pfx-expansion-node-action-bar__title{margin:0 0 12px}.pfx-expansion-node-action-bar__actions{display:flex;flex-wrap:wrap;gap:8px;align-items:center}.pfx-expansion-node-action-bar__action-btn{min-width:0}.pfx-expansion-node-action-bar__action-host{display:inline-flex;align-items:center}.pfx-expansion-node-card-grid__header{margin:0 0 12px}.pfx-expansion-node-card-grid__cards{display:grid;gap:12px;grid-template-columns:var(--pfx-expansion-card-grid-columns, repeat(auto-fit, minmax(var(--pfx-expansion-card-grid-min-width, 220px), 1fr)))}.pfx-expansion-node-card-grid__card-host{min-width:0}.pfx-expansion-node-card-grid__card-host [data-rich-node-type=card]{height:100%}.pfx-expansion-node-richtext :where(p,ul,ol,h1,h2,h3,h4,h5,h6){margin-top:0;margin-bottom:8px}.pfx-expansion-node-placeholder{font-size:12px;color:var(--md-sys-color-on-surface-variant)}:host.density-compact{--p-table-header-height-default: 32px;--p-table-row-height-default: 30px;--p-header-padding-default: 4px 8px;--p-cell-padding-default: 3px 8px;--p-header-font-size-default: 11.5px;--p-cell-font-size-default: 12px;--p-actions-btn-size-default: 28px;--p-actions-icon-size-default: 15px;--p-actions-more-btn-size-default: 28px;--p-actions-more-icon-size-default: 15px;--p-table-paginator-container-min-height-default: 32px;--p-table-paginator-container-padding-default: 2px 8px;--p-table-paginator-container-gap-default: 6px;--p-table-paginator-select-width-default: 64px;--p-table-paginator-select-height-default: 28px;--p-table-paginator-select-padding-inline-default: 8px 6px;--p-table-paginator-action-size-default: 28px}:host.density-comfortable{--p-table-header-height-default: 40px;--p-table-row-height-default: 44px;--p-header-padding-default: 10px 14px;--p-cell-padding-default: 10px 14px;--p-header-font-size-default: inherit;--p-cell-font-size-default: inherit;--p-actions-btn-size-default: 36px;--p-actions-icon-size-default: 18px;--p-actions-more-btn-size-default: 36px;--p-actions-more-icon-size-default: 18px;--p-table-paginator-container-min-height-default: 44px;--p-table-paginator-container-padding-default: 6px 10px;--p-table-paginator-container-gap-default: 10px;--p-table-paginator-select-width-default: 78px;--p-table-paginator-select-height-default: 36px;--p-table-paginator-select-padding-inline-default: 12px 10px;--p-table-paginator-action-size-default: 36px}:host.density-spacious{--p-table-header-height-default: 52px;--p-table-row-height-default: 56px;--p-header-padding-default: 16px 20px;--p-cell-padding-default: 16px 20px;--p-header-font-size-default: inherit;--p-cell-font-size-default: inherit;--p-actions-btn-size-default: 44px;--p-actions-icon-size-default: 24px;--p-actions-more-btn-size-default: 44px;--p-actions-more-icon-size-default: 24px;--p-table-paginator-container-min-height-default: 52px;--p-table-paginator-container-padding-default: 8px 14px;--p-table-paginator-container-gap-default: 12px;--p-table-paginator-select-width-default: 86px;--p-table-paginator-select-height-default: 40px;--p-table-paginator-select-padding-inline-default: 14px 12px;--p-table-paginator-action-size-default: 40px}@media(pointer:coarse){:host.density-compact{--p-table-row-height-default: 44px;--p-table-header-height-default: 44px;--p-table-paginator-container-min-height-default: 44px;--p-table-paginator-action-size-default: 40px}}:host.density-compact .praxis-actions-cell{padding-inline:8px}:host.density-spacious .praxis-actions-cell{padding-inline:16px}.praxis-actions-cell__content{display:flex;align-items:center;justify-content:flex-end;gap:6px;width:100%;transition:opacity .12s ease}.praxis-actions-cell.dense .praxis-actions-cell__content{gap:6px}.praxis-actions-cell__content--discovering{opacity:.78}.praxis-row-action-anchor{display:inline-flex;align-items:center}.praxis-row-action-anchor--workflow{position:relative}.praxis-row-action-anchor--workflow:after{content:\"\";position:absolute;right:4px;top:4px;width:6px;height:6px;border-radius:999px;background:var(--md-sys-color-secondary);opacity:.9;pointer-events:none}.praxis-row-action-anchor--blocked:after{background:var(--md-sys-color-error)}.praxis-icon-btn{width:var(--p-actions-btn-size, var(--p-actions-btn-size-default, 40px));height:var(--p-actions-btn-size, var(--p-actions-btn-size-default, 40px));border:0;background:transparent;padding:0;display:inline-flex;align-items:center;justify-content:center;border-radius:9999px;cursor:pointer;--mat-icon-button-state-layer-size: var(--p-actions-btn-size, var(--p-actions-btn-size-default, 40px))}.praxis-icon-btn:hover{background:var(--md-sys-color-surface-variant)}.praxis-icon-btn:focus-visible{outline:2px solid var(--md-sys-color-primary);outline-offset:2px}.praxis-icon-btn mat-icon,.praxis-icon-btn .mat-icon{font-size:var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px));width:var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px));height:var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px));line-height:var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px))}.praxis-icon-btn praxis-rich-content{display:inline-flex;align-items:center;justify-content:center;width:var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px));height:var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px));line-height:var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px))}:host ::ng-deep .praxis-icon-btn .praxis-row-action__content,:host ::ng-deep .praxis-icon-btn .praxis-row-action__icon{display:inline-flex;align-items:center;justify-content:center;width:var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px));height:var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px));line-height:var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px))}:host ::ng-deep .praxis-icon-btn .praxis-row-action__icon .prx-rich-icon{font-size:var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px));width:var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px));height:var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px));line-height:var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px))}.praxis-icon-btn--workflow{background:color-mix(in srgb,var(--md-sys-color-secondary-container) 36%,transparent)}.praxis-icon-btn--blocked{background:color-mix(in srgb,var(--md-sys-color-error-container) 42%,transparent)}.praxis-more-btn{width:var(--p-actions-more-btn-size, var(--p-actions-more-btn-size-default, var(--p-actions-btn-size, var(--p-actions-btn-size-default, 40px))));height:var(--p-actions-more-btn-size, var(--p-actions-more-btn-size-default, var(--p-actions-btn-size, var(--p-actions-btn-size-default, 40px))));--mat-icon-button-state-layer-size: var(--p-actions-more-btn-size, var(--p-actions-more-btn-size-default, var(--p-actions-btn-size, var(--p-actions-btn-size-default, 40px))));background-image:var(--p-actions-more-btn-gradient, none);background-size:100% 100%;background-repeat:no-repeat}.praxis-more-btn mat-icon,.praxis-more-btn .mat-icon{font-size:var(--p-actions-more-icon-size, var(--p-actions-more-icon-size-default, var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px))));width:var(--p-actions-more-icon-size, var(--p-actions-more-icon-size-default, var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px))));height:var(--p-actions-more-icon-size, var(--p-actions-more-icon-size-default, var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px))));line-height:var(--p-actions-more-icon-size, var(--p-actions-more-icon-size-default, var(--p-actions-icon-size, var(--p-actions-icon-size-default, 22px))));color:var(--p-actions-more-icon-color);background-image:var(--p-actions-more-icon-gradient, none);-webkit-background-clip:text;background-clip:text}.praxis-row-btn--workflow{box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--md-sys-color-secondary) 28%,transparent)}.praxis-row-btn--blocked{box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--md-sys-color-error) 28%,transparent)}.praxis-icon-btn.destructive mat-icon{color:var(--md-sys-color-error)}.mat-mdc-tooltip.praxis-tooltip{margin-top:-8px;margin-bottom:8px}.spacer{flex:1 1 auto}.praxis-table-header{display:flex;flex-wrap:wrap;align-items:flex-start;gap:6px;margin:10px 0 8px;width:100%;clear:both;position:relative}.praxis-table-header.stacked{margin:0}.praxis-table-header>praxis-table-toolbar{flex:1 0 100%}.praxis-floating-bulk-actions{position:fixed;z-index:var(--praxis-layer-floating-local, 200);display:inline-flex;align-items:center;gap:8px;padding:8px;border-radius:999px;background:var(--md-sys-color-surface-container-highest);box-shadow:0 8px 20px #00000029}.praxis-floating-bulk-actions.pos-bottom-right{right:20px;bottom:20px}.praxis-floating-bulk-actions.pos-bottom-left{left:20px;bottom:20px}.praxis-floating-bulk-actions.pos-top-right{right:20px;top:20px}.praxis-floating-bulk-actions.pos-top-left{left:20px;top:20px}@media(max-width:768px){.praxis-floating-bulk-actions{gap:6px;padding:6px}.praxis-floating-bulk-actions.pos-bottom-right{right:12px;left:auto;bottom:12px}.praxis-floating-bulk-actions.pos-bottom-left{left:12px;right:auto;bottom:12px}.praxis-floating-bulk-actions.pos-top-right{right:12px;left:auto;top:12px}.praxis-floating-bulk-actions.pos-top-left{left:12px;right:auto;top:12px}}:host{display:block;width:100%;min-width:0;max-width:100%;--pfx-toolbar-pad-y: 6px;--pfx-toolbar-pad-x: 12px;--p-table-bg: var(--md-sys-color-surface-container-highest);--p-table-text-color: var(--md-sys-color-on-surface);--p-table-header-bg: var(--md-sys-color-surface-container-highest);--p-table-header-fg: var(--md-sys-color-on-surface);--p-table-border-color: var(--md-sys-color-outline-variant);--p-table-row-even-bg: var(--md-sys-color-surface-container);--p-table-row-hover-bg: var(--md-sys-color-surface-container-high);--p-table-row-selected-bg: var(--md-sys-color-primary-container);--p-table-row-selected-fg: var(--md-sys-color-on-primary-container);--p-table-row-selected-font-weight: 600;--p-table-row-selected-indicator: linear-gradient( 180deg, var(--md-sys-color-primary), var(--md-sys-color-secondary) );--p-table-badge-soft-primary-bg: var(--md-sys-color-primary-container);--p-table-badge-soft-primary-fg: var(--md-sys-color-on-primary-container);--p-table-badge-soft-accent-bg: var(--md-sys-color-secondary-container);--p-table-badge-soft-accent-fg: var(--md-sys-color-on-secondary-container);--p-table-badge-soft-warn-bg: var(--md-sys-color-error-container);--p-table-badge-soft-warn-fg: var(--md-sys-color-on-error-container);--p-table-state-success-bg: var(--md-sys-color-tertiary-container);--p-table-state-success-fg: var(--md-sys-color-on-tertiary-container);--p-table-state-warning-bg: var(--md-sys-color-secondary-container);--p-table-state-warning-fg: var(--md-sys-color-on-secondary-container);--p-table-state-danger-bg: var(--md-sys-color-error-container);--p-table-state-danger-fg: var(--md-sys-color-on-error-container);--p-table-state-highlight-bg: var(--md-sys-color-primary-container);--p-table-state-highlight-fg: var(--md-sys-color-on-primary-container);--p-table-reorder-transition-duration: .16s;--p-table-drag-preview-scale: 1.01;--p-table-drag-status-enter-duration: .18s;--p-table-drag-preview-shadow: 0 14px 32px rgba(0, 0, 0, .28), 0 0 0 1px var(--p-table-border-color);--p-table-column-resize-hit-area: 10px;--p-table-column-resize-line-width: 1px;--p-table-column-resize-separator-color: color-mix( in srgb, var(--p-table-border-color) 78%, transparent );--p-table-column-resize-separator-hover-color: var(--md-sys-color-primary);--p-table-column-resize-active-color: var(--md-sys-color-primary)}:host ::ng-deep .mat-mdc-table{background:var(--p-table-bg);color:var(--p-table-text-color);border-radius:12px 12px 0 0;width:100%;box-shadow:var(--p-table-surface-shadow);transition:box-shadow var(--p-table-selection-transition-duration, .18s) var(--p-table-motion-easing, cubic-bezier(0, 0, .2, 1))}:host ::ng-deep .mat-mdc-table:hover{box-shadow:var(--p-table-surface-shadow-hover, var(--p-table-surface-shadow))}:host ::ng-deep .mat-mdc-table.pfx-column-resize-enabled{table-layout:fixed}:host ::ng-deep .mat-mdc-table.table-stack-top{border-top-left-radius:0;border-top-right-radius:0}:host ::ng-deep .praxis-toolbar-footer{border:0 solid var(--p-table-border-color);border-top:0;border-radius:0;background:var(--p-table-bg)}:host ::ng-deep .mat-mdc-paginator.footer-stack{border-top-left-radius:0;border-top-right-radius:0;border-top:0}:host ::ng-deep .mat-mdc-paginator.footer-stack .mat-mdc-paginator-container{padding:var(--p-table-paginator-footer-stack-padding, 6px 10px)}:host ::ng-deep .mat-mdc-paginator{--p-table-paginator-bg-default: color-mix( in srgb, var(--p-table-bg) 94%, var(--md-sys-color-surface, white) 6% );--p-table-paginator-border-color-default: color-mix(in srgb, var(--p-table-border-color) 82%, transparent);--p-table-paginator-select-bg-default: color-mix(in srgb, var(--p-table-bg) 88%, var(--p-table-text-color) 12%);--p-table-paginator-select-border-color-default: color-mix( in srgb, var(--p-table-border-color) 74%, transparent );--p-table-paginator-select-border-color-hover-default: color-mix( in srgb, var(--md-sys-color-primary) 36%, var(--p-table-border-color) );--p-table-paginator-select-border-color-focus-default: color-mix( in srgb, var(--md-sys-color-primary) 72%, var(--p-table-border-color) );--p-table-paginator-select-focus-ring-default: color-mix(in srgb, var(--md-sys-color-primary) 18%, transparent);--p-table-paginator-select-radius-default: 999px;--p-table-paginator-select-shadow-default: inset 0 1px 0 color-mix(in srgb, var(--md-sys-color-on-surface) 8%, transparent);--p-table-paginator-select-text-color-default: var(--p-table-text-color);--p-table-paginator-select-icon-color-default: color-mix(in srgb, var(--p-table-text-color) 72%, transparent);--p-table-paginator-range-text-color-default: color-mix(in srgb, var(--p-table-text-color) 78%, transparent);border-top:1px solid var(--p-table-paginator-border-color, var(--p-table-paginator-border-color-default));background:var(--p-table-paginator-bg, var(--p-table-paginator-bg-default))}:host ::ng-deep .mat-mdc-paginator .mat-mdc-paginator-container{min-height:var(--p-table-paginator-container-min-height, var(--p-table-paginator-container-min-height-default, 44px));padding:var(--p-table-paginator-container-padding, var(--p-table-paginator-container-padding-default, 6px 10px));gap:var(--p-table-paginator-container-gap, var(--p-table-paginator-container-gap-default, 10px))}:host ::ng-deep .mat-mdc-paginator.compact{--p-table-paginator-container-min-height-default: 30px;--p-table-paginator-container-padding-default: 2px 8px;--p-table-paginator-container-gap-default: 6px;--p-table-paginator-select-width-default: 62px;--p-table-paginator-select-height-default: 28px;--p-table-paginator-select-padding-inline-default: 8px 6px;--p-table-paginator-action-size-default: 28px}:host ::ng-deep .mat-mdc-paginator .mat-mdc-icon-button{width:var(--p-table-paginator-action-size, var(--p-table-paginator-action-size-default, 36px));height:var(--p-table-paginator-action-size, var(--p-table-paginator-action-size-default, 36px));display:inline-grid;place-items:center;padding:0;line-height:0;--mdc-icon-button-state-layer-size: var(--p-table-paginator-action-size, var(--p-table-paginator-action-size-default, 36px));--mat-icon-button-state-layer-size: var(--p-table-paginator-action-size, var(--p-table-paginator-action-size-default, 36px))}:host ::ng-deep .mat-mdc-paginator .mat-mdc-paginator-icon{display:block;flex:0 0 auto;margin:0}.praxis-table-ai-trigger{transition:background-color .16s ease,box-shadow .16s ease,color .16s ease}.praxis-table-ai-trigger--minimized{background:color-mix(in srgb,var(--md-sys-color-primary-container, rgba(59, 130, 246, .22)) 72%,transparent);color:var(--md-sys-color-on-primary-container, var(--md-sys-color-primary, #2563eb));box-shadow:0 0 0 1px color-mix(in srgb,var(--md-sys-color-primary, #2563eb) 34%,transparent),0 8px 20px color-mix(in srgb,var(--md-sys-color-primary, #2563eb) 16%,transparent)}.praxis-table-ai-trigger--minimized:hover,.praxis-table-ai-trigger--minimized:focus-visible{background:color-mix(in srgb,var(--md-sys-color-primary-container, rgba(59, 130, 246, .22)) 86%,transparent)}:host ::ng-deep .mat-mdc-paginator .mat-mdc-paginator-page-size-select{margin-left:4px;width:var(--p-table-paginator-select-width, var(--p-table-paginator-select-width-default, 78px))}:host ::ng-deep .mat-mdc-paginator .mat-mdc-paginator-page-size-select .mat-mdc-text-field-wrapper{--mdc-outlined-text-field-container-color: var( --p-table-paginator-select-bg, var(--p-table-paginator-select-bg-default) );--mdc-outlined-text-field-input-text-color: var( --p-table-paginator-select-text-color, var(--p-table-paginator-select-text-color-default) );min-height:var(--p-table-paginator-select-height, var(--p-table-paginator-select-height-default, 36px));height:var(--p-table-paginator-select-height, var(--p-table-paginator-select-height-default, 36px));padding-inline:var(--p-table-paginator-select-padding-inline, var(--p-table-paginator-select-padding-inline-default, 12px 10px));border:1px solid var(--p-table-paginator-select-border-color, var(--p-table-paginator-select-border-color-default));border-radius:var(--p-table-paginator-select-radius, var(--p-table-paginator-select-radius-default));background:var(--p-table-paginator-select-bg, var(--p-table-paginator-select-bg-default))!important;background-color:var(--p-table-paginator-select-bg, var(--p-table-paginator-select-bg-default))!important;color:var(--p-table-paginator-select-text-color, var(--p-table-paginator-select-text-color-default))!important;box-shadow:var(--p-table-paginator-select-shadow, var(--p-table-paginator-select-shadow-default))}:host ::ng-deep .mat-mdc-paginator .mat-mdc-paginator-page-size-select .mat-mdc-text-field-wrapper:hover{border-color:var(--p-table-paginator-select-border-color-hover, var(--p-table-paginator-select-border-color-hover-default))}:host ::ng-deep .mat-mdc-paginator .mat-mdc-paginator-page-size-select.mat-focused .mat-mdc-text-field-wrapper{border-color:var(--p-table-paginator-select-border-color-focus, var(--p-table-paginator-select-border-color-focus-default));box-shadow:0 0 0 3px var(--p-table-paginator-select-focus-ring, var(--p-table-paginator-select-focus-ring-default)),var(--p-table-paginator-select-shadow, var(--p-table-paginator-select-shadow-default))}:host ::ng-deep .mat-mdc-paginator .mat-mdc-paginator-page-size-select .mat-mdc-form-field-flex{min-height:var(--p-table-paginator-select-height, var(--p-table-paginator-select-height-default, 36px));align-items:center}:host ::ng-deep .mat-mdc-paginator .mat-mdc-paginator-page-size-select .mat-mdc-form-field-infix{display:flex;align-items:center;min-height:var(--p-table-paginator-select-height, var(--p-table-paginator-select-height-default, 36px));padding-block:0;width:auto}:host ::ng-deep .mat-mdc-paginator .mat-mdc-paginator-page-size-select .mat-mdc-select-trigger{min-height:var(--p-table-paginator-select-height, var(--p-table-paginator-select-height-default, 36px));padding-right:2px;color:var(--p-table-paginator-select-text-color, var(--p-table-paginator-select-text-color-default))}:host ::ng-deep .mat-mdc-paginator .mat-mdc-paginator-page-size-select .mat-mdc-select-arrow{color:var(--p-table-paginator-select-icon-color, var(--p-table-paginator-select-icon-color-default))}:host ::ng-deep .mat-mdc-paginator .mat-mdc-paginator-page-size-select .mdc-notched-outline__leading,:host ::ng-deep .mat-mdc-paginator .mat-mdc-paginator-page-size-select .mdc-notched-outline__notch,:host ::ng-deep .mat-mdc-paginator .mat-mdc-paginator-page-size-select .mdc-notched-outline__trailing{border-color:transparent!important;border-width:0!important}:host ::ng-deep .mat-mdc-paginator .mat-mdc-paginator-page-size-select .mat-mdc-form-field-subscript-wrapper{display:none}:host ::ng-deep .mat-mdc-paginator .mat-mdc-paginator-range-label{font-size:12px;font-weight:600;color:var(--p-table-paginator-range-text-color, var(--p-table-paginator-range-text-color-default))}:host ::ng-deep .mat-mdc-paginator .mat-mdc-select-value-text{font-size:12px;font-weight:700;color:var(--p-table-paginator-select-text-color, var(--p-table-paginator-select-text-color-default))}::ng-deep .praxis-table-paginator-select-panel.mat-mdc-select-panel{--mat-select-panel-background-color: var(--md-sys-color-surface-container, #fff);background:var(--md-sys-color-surface-container, #fff)!important;background-color:var(--md-sys-color-surface-container, #fff)!important;border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant, #d7dbe5) 70%,transparent);box-shadow:0 12px 28px color-mix(in srgb,var(--md-sys-color-shadow, #000) 28%,transparent)}::ng-deep .praxis-table-paginator-select-panel .mat-mdc-option{--mat-option-label-text-color: var(--md-sys-color-on-surface, #111827);color:var(--md-sys-color-on-surface, #111827)!important}::ng-deep .praxis-table-paginator-select-panel .mat-mdc-option:hover:not(.mdc-list-item--disabled),::ng-deep .praxis-table-paginator-select-panel .mat-mdc-option.mat-mdc-option-active{--mat-option-hover-state-layer-color: color-mix( in srgb, var(--md-sys-color-primary, #2f7cff) 14%, transparent );background:color-mix(in srgb,var(--md-sys-color-primary, #2f7cff) 14%,transparent)!important;color:var(--md-sys-color-on-surface, #111827)!important}:host [data-role=table-settings].mat-mdc-icon-button{--mdc-icon-button-icon-color: var(--md-sys-color-primary);color:var(--md-sys-color-primary)}.pfx-link{color:var(--md-sys-color-primary);text-decoration:underline;cursor:pointer}.pfx-chip{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;border-radius:10px;font-size:12px;line-height:1;border:1px solid transparent;white-space:nowrap;--prx-rich-content-inline-gap: 6px}.pfx-chip-icon{font-size:14px;width:14px;height:14px}.pfx-chip--plain{background:transparent;border-color:transparent;color:var(--md-sys-color-on-surface)}.pfx-chip--outlined{background:transparent;border-color:var(--md-sys-color-outline-variant);color:var(--md-sys-color-on-surface)}.pfx-chip--filled-primary{background:var(--md-sys-color-primary);color:var(--md-sys-color-on-primary)}.pfx-chip--filled-accent{background:var(--md-sys-color-secondary);color:var(--md-sys-color-on-secondary)}.pfx-chip--filled-warn,.pfx-chip--filled-danger{background:var(--md-sys-color-error);color:var(--md-sys-color-on-error)}.pfx-chip--filled-success{background:var(--p-table-state-success-bg);color:var(--p-table-state-success-fg)}.pfx-chip--filled-info{background:var(--md-sys-color-tertiary);color:var(--md-sys-color-on-tertiary)}.pfx-chip--filled-basic{background:var(--md-sys-color-surface-container-highest);color:var(--md-sys-color-on-surface);border-color:var(--md-sys-color-outline-variant)}.pfx-chip--soft-primary{background:var(--p-table-badge-soft-primary-bg);color:var(--p-table-badge-soft-primary-fg)}.pfx-chip--soft-accent{background:var(--p-table-badge-soft-accent-bg);color:var(--p-table-badge-soft-accent-fg)}.pfx-chip--soft-warn{background:var(--p-table-badge-soft-warn-bg);color:var(--p-table-badge-soft-warn-fg)}.pfx-chip--soft-danger{background:color-mix(in srgb,var(--p-table-state-danger-bg) 72%,transparent);color:var(--p-table-state-danger-fg);border-color:color-mix(in srgb,var(--p-table-state-danger-fg) 18%,transparent)}.pfx-chip--soft-success{background:color-mix(in srgb,var(--p-table-state-success-bg) 72%,transparent);color:var(--p-table-state-success-fg);border-color:color-mix(in srgb,var(--p-table-state-success-fg) 18%,transparent)}.pfx-chip--soft-info{background:color-mix(in srgb,var(--md-sys-color-tertiary-container) 72%,transparent);color:var(--md-sys-color-on-tertiary-container);border-color:color-mix(in srgb,var(--md-sys-color-tertiary) 18%,transparent)}.pfx-chip--soft-basic{background:color-mix(in srgb,var(--md-sys-color-surface-container-highest) 82%,transparent);color:color-mix(in srgb,var(--md-sys-color-on-surface) 76%,transparent);border-color:color-mix(in srgb,var(--md-sys-color-outline-variant) 65%,transparent)}.pfx-progress{position:relative;width:100%;min-width:0;max-width:140px;display:inline-block;vertical-align:middle}.pfx-progress .pfx-progress__content{width:100%;min-width:0}.pfx-progress .prx-rich-progress{width:100%}.pfx-progress-bar{height:100%;background:var(--md-sys-color-primary);transition:width .2s ease}.pfx-progress-label{margin-left:8px;font-size:12px;opacity:.8;display:inline-block;vertical-align:middle}.pfx-micro-viz-cell{display:inline-block;width:min(100%,180px);min-width:112px;max-width:220px;vertical-align:middle}.pfx-micro-viz-cell .pfx-micro-viz{display:grid;gap:4px;width:100%;min-width:0;color:var(--md-sys-color-on-surface);font-size:12px;line-height:1.2}.pfx-micro-viz-cell .pfx-micro-viz__row{display:grid;grid-template-columns:minmax(42px,.8fr) minmax(52px,1fr) auto;align-items:center;gap:6px;min-width:0}.pfx-micro-viz-cell .pfx-micro-viz__label,.pfx-micro-viz-cell .pfx-micro-viz__value{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pfx-micro-viz-cell .pfx-micro-viz__track{position:relative;display:block;height:8px;min-width:0;border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-outline-variant) 62%,transparent);overflow:hidden}.pfx-micro-viz-cell .pfx-micro-viz__bar,.pfx-micro-viz-cell .pfx-micro-viz__segment{display:block;height:100%;border-radius:inherit;background:var(--md-sys-color-primary)}.pfx-micro-viz-cell .pfx-micro-viz__row[data-tone=success] .pfx-micro-viz__bar,.pfx-micro-viz-cell .pfx-micro-viz__segment[data-tone=success],.pfx-micro-viz-cell .pfx-micro-viz[data-tone=success] .pfx-micro-viz__bar{background:var(--p-table-state-success-fg, #168a4a)}.pfx-micro-viz-cell .pfx-micro-viz__row[data-tone=warning] .pfx-micro-viz__bar,.pfx-micro-viz-cell .pfx-micro-viz__segment[data-tone=warning],.pfx-micro-viz-cell .pfx-micro-viz[data-tone=warning] .pfx-micro-viz__bar{background:var(--p-table-state-warning-fg, #b45f06)}.pfx-micro-viz-cell .pfx-micro-viz__row[data-tone=danger] .pfx-micro-viz__bar,.pfx-micro-viz-cell .pfx-micro-viz__segment[data-tone=danger],.pfx-micro-viz-cell .pfx-micro-viz[data-tone=danger] .pfx-micro-viz__bar{background:var(--p-table-state-danger-fg, #b3261e)}.pfx-micro-viz-cell .pfx-micro-viz__segments{display:flex;width:100%;height:8px;overflow:hidden;border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-outline-variant) 62%,transparent)}.pfx-micro-viz-cell .pfx-micro-viz__meta{display:flex;justify-content:space-between;gap:8px;min-width:0;color:color-mix(in srgb,var(--md-sys-color-on-surface) 72%,transparent)}.pfx-micro-viz-cell .pfx-micro-viz__bullet .pfx-micro-viz__target{position:absolute;top:-2px;bottom:-2px;width:2px;border-radius:999px;background:var(--md-sys-color-on-surface)}.pfx-micro-viz-cell .pfx-micro-viz__delta[data-tone=success]{color:var(--p-table-state-success-fg, #168a4a)}.pfx-micro-viz-cell .pfx-micro-viz__delta[data-tone=warning]{color:var(--p-table-state-warning-fg, #b45f06)}.pfx-micro-viz-cell .pfx-micro-viz__delta[data-tone=danger]{color:var(--p-table-state-danger-fg, #b3261e)}.pfx-micro-viz-cell .pfx-micro-viz__fallback{display:inline-block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pfx-micro-viz-cell .pfx-micro-viz.pfx-micro-viz__radial,.pfx-micro-viz-cell .pfx-micro-viz.pfx-micro-viz__harvey,.pfx-micro-viz-cell .pfx-micro-viz.pfx-micro-viz__process{display:inline-flex}.pfx-micro-viz__radial{align-items:center;justify-content:center;position:relative}.pfx-micro-radial-svg{width:24px;height:24px;overflow:visible;flex-shrink:0;display:block}.pfx-micro-radial-svg__track{fill:none;stroke:var(--pfx-micro-track-color, var(--md-sys-color-surface-container-high, #e5e7eb));stroke-width:3}.pfx-micro-radial-svg__bar{fill:none;stroke:currentColor;stroke-width:3;stroke-linecap:round;transform:rotate(-90deg);transform-origin:50% 50%;transition:stroke-dasharray .35s ease}.pfx-micro-radial-svg__text{font-size:8px;font-weight:700;text-anchor:middle;fill:currentColor;font-family:var(--md-sys-typescale-body-medium-font-family, sans-serif)}.pfx-micro-viz__harvey{align-items:center;gap:0}.pfx-micro-harvey-svg{width:18px;height:18px;overflow:visible;flex-shrink:0}.pfx-micro-harvey-svg__track{fill:none;stroke:var(--pfx-micro-track-color, var(--md-sys-color-surface-container-high, #e5e7eb));stroke-width:2}.pfx-micro-harvey-svg__bar{fill:none;stroke:currentColor;stroke-width:16;transform:rotate(-90deg);transform-origin:50% 50%;transition:stroke-dasharray .35s ease}.pfx-micro-harvey-fraction{display:inline-flex;align-items:center;font-size:11px;font-variant-numeric:tabular-nums;margin-left:6px;font-family:var(--md-sys-typescale-body-medium-font-family, sans-serif)}.pfx-micro-harvey-fraction strong{color:currentColor;font-weight:700}.pfx-separator{opacity:.6;color:var(--md-sys-color-on-surface-variant, #4b5563);margin-inline:2px}.pfx-total{color:var(--md-sys-color-on-surface-variant, #4b5563)}.pfx-micro-viz__bullet{display:flex;flex-direction:column;gap:4px;width:100%}.pfx-micro-bullet__top{display:flex;justify-content:space-between;align-items:baseline;font-size:11px}.pfx-micro-bullet__label{color:var(--md-sys-color-on-surface-variant, #4b5563);font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pfx-micro-bullet__value{font-weight:700;color:currentColor;font-variant-numeric:tabular-nums;flex-shrink:0}.pfx-micro-bullet__target-val{font-weight:400;font-size:10px;color:var(--md-sys-color-on-surface-variant, #4b5563);margin-left:4px}.pfx-micro-bullet__track{position:relative;display:block;overflow:hidden;border-radius:var(--pfx-micro-track-radius, 999px);background:var(--pfx-micro-track-color, var(--md-sys-color-surface-container-high, #e5e7eb));block-size:10px;width:100%}.pfx-micro-bullet__range{position:absolute;inset-block:0;display:block;block-size:100%;opacity:.32}.pfx-micro-bullet__range[data-tone=success]{background:var(--p-table-state-success-fg, #168a4a)}.pfx-micro-bullet__range[data-tone=warning]{background:var(--p-table-state-warning-fg, #b45f06)}.pfx-micro-bullet__range[data-tone=danger],.pfx-micro-bullet__range[data-tone=critical]{background:var(--p-table-state-danger-fg, #b3261e)}.pfx-micro-bullet__range[data-tone=info]{background:var(--md-sys-color-primary, #2563eb)}.pfx-micro-bullet__actual{position:absolute;inset-block-start:3px;inset-inline-start:0;block-size:4px;border-radius:inherit}.pfx-micro-bullet__actual[data-tone=success]{background:var(--p-table-state-success-fg, #168a4a)}.pfx-micro-bullet__actual[data-tone=warning]{background:var(--p-table-state-warning-fg, #b45f06)}.pfx-micro-bullet__actual[data-tone=danger],.pfx-micro-bullet__actual[data-tone=critical]{background:var(--p-table-state-danger-fg, #b3261e)}.pfx-micro-bullet__actual[data-tone=info]{background:var(--md-sys-color-primary, #2563eb)}.pfx-micro-bullet__target{position:absolute;inset-block:0;inline-size:2px;background:var(--md-sys-color-on-surface, #111827)}.pfx-micro-bullet__bottom{display:flex;justify-content:space-between;font-size:9px;color:var(--md-sys-color-on-surface-variant, #4b5563)}.pfx-micro-viz-container{display:flex;align-items:center;gap:8px;width:100%}.pfx-micro-trend__label-col{display:flex;flex-direction:column;justify-content:center;font-size:11px;line-height:1.2;flex-shrink:0;min-width:24px;font-family:var(--md-sys-typescale-body-medium-font-family, sans-serif)}.pfx-micro-trend__label-col--start{align-items:flex-end;text-align:right}.pfx-micro-trend__label-col--end{align-items:flex-start;text-align:left}.pfx-micro-trend__value{font-weight:700;color:var(--md-sys-color-on-surface, #1f2937)}.pfx-micro-trend__label{color:var(--md-sys-color-on-surface-variant, #4b5563);font-size:9px}.pfx-micro-viz__line,.pfx-micro-viz__area,.pfx-micro-viz__column{display:block;width:100%;height:30px;overflow:visible;flex:1 1 auto}.pfx-micro-line__svg,.pfx-micro-area__svg,.pfx-micro-column__svg{width:100%;height:100%;display:block;overflow:visible}.pfx-micro-line__path,.pfx-micro-area__path{stroke:currentColor}.pfx-micro-area__fill{fill:currentColor}.pfx-micro-trend__marker{fill:currentColor;stroke:var(--md-sys-color-surface, #ffffff);stroke-width:1.5px}.pfx-micro-trend__marker[data-tone=success]{fill:var(--p-table-state-success-fg, #168a4a)}.pfx-micro-trend__marker[data-tone=warning]{fill:var(--p-table-state-warning-fg, #b45f06)}.pfx-micro-trend__marker[data-tone=danger],.pfx-micro-trend__marker[data-tone=critical]{fill:var(--p-table-state-danger-fg, #b3261e)}.pfx-micro-trend__marker[data-tone=info]{fill:var(--md-sys-color-primary, #2563eb)}.pfx-micro-viz__process{align-items:center;width:100%;min-width:120px;padding-block:4px;overflow-x:auto;-webkit-overflow-scrolling:touch}.pfx-micro-step{display:flex;align-items:center;flex:1 1 0%;min-width:0}.pfx-micro-step[data-state=future]{opacity:.38}.pfx-micro-step[data-state=disabled]{opacity:.28;pointer-events:none}.pfx-micro-step__node-wrapper{display:flex;flex-direction:column;align-items:center;position:relative;flex-shrink:0}.pfx-micro-step__node{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;border-radius:50%;font-size:11px;font-weight:700;background:var(--md-sys-color-surface-container-high, #e5e7eb);color:var(--md-sys-color-on-surface, #1f2937);border:2px solid transparent;transition:all .2s ease}.pfx-micro-step__node[data-tone=success]{background:var(--p-table-state-success-fg, #168a4a);color:#fff}.pfx-micro-step__node[data-tone=warning]{background:var(--p-table-state-warning-fg, #b45f06);color:#fff}.pfx-micro-step__node[data-tone=danger],.pfx-micro-step__node[data-tone=critical]{background:var(--p-table-state-danger-fg, #b3261e);color:#fff}.pfx-micro-step__node[data-tone=info]{background:var(--md-sys-color-primary, #2563eb);color:#fff}.pfx-micro-step__icon{font-size:12px}.pfx-micro-step__label{font-size:9px;margin-top:4px;text-align:center;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:72px;color:var(--md-sys-color-on-surface-variant, #4b5563)}.pfx-micro-step__connector{flex:1 1 auto;height:2px;background:var(--md-sys-color-surface-container-high, #e5e7eb);margin-inline:8px;min-width:16px}.pfx-micro-step__connector[data-tone=success]{background:var(--p-table-state-success-fg, #168a4a)}.pfx-micro-step__connector[data-tone=warning]{background:var(--p-table-state-warning-fg, #b45f06)}.pfx-micro-step__connector[data-tone=danger],.pfx-micro-step__connector[data-tone=critical]{background:var(--p-table-state-danger-fg, #b3261e)}.pfx-micro-step__connector[data-tone=info]{background:var(--md-sys-color-primary, #2563eb)}.pfx-micro-viz[data-tone=success]{color:var(--p-table-state-success-fg, #168a4a)}.pfx-micro-viz[data-tone=warning]{color:var(--p-table-state-warning-fg, #b45f06)}.pfx-micro-viz[data-tone=danger],.pfx-micro-viz[data-tone=critical]{color:var(--p-table-state-danger-fg, #b3261e)}.pfx-micro-viz[data-tone=info]{color:var(--md-sys-color-primary, #2563eb)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz[data-tone=success]{color:var(--p-table-state-success-fg, #168a4a)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz[data-tone=warning]{color:var(--p-table-state-warning-fg, #b45f06)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz[data-tone=danger],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz[data-tone=critical]{color:var(--p-table-state-danger-fg, #b3261e)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz[data-tone=info]{color:var(--md-sys-color-primary, #2563eb)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz.pfx-micro-viz__delta{display:inline-flex;align-items:center;justify-content:flex-end;gap:5px;width:auto;min-width:0;font-weight:700;font-variant-numeric:tabular-nums;white-space:nowrap}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__delta-symbol{display:inline-grid;width:12px;min-width:12px;height:12px;min-height:12px;place-items:center;border-radius:0;background:transparent;font-size:11px;line-height:1;transform:translateY(-.5px)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz.pfx-micro-viz__radial,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz.pfx-micro-viz__harvey{display:inline-flex;align-items:center;justify-content:center;width:auto;min-width:0;height:auto;gap:8px}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz.pfx-micro-viz__radial{justify-content:flex-start;gap:7px}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-radial-svg{display:block;width:24px;height:24px;overflow:visible;flex:0 0 auto}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-radial-svg__track{fill:none;stroke:var(--pfx-micro-track-color, var(--md-sys-color-surface-container-high, #e5e7eb));stroke-width:3.4}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-radial-svg__bar{fill:none;stroke:currentColor;stroke-width:3.4;stroke-linecap:round;transform:rotate(-90deg);transform-origin:50% 50%}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-radial-svg__text{font-family:var(--md-sys-typescale-body-medium-font-family, sans-serif);font-size:8.5px;font-weight:700;text-anchor:middle;fill:currentColor}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-radial-value{color:currentColor;font-family:var(--md-sys-typescale-body-medium-font-family, sans-serif);font-size:12px;font-weight:700;font-variant-numeric:tabular-nums;line-height:1;white-space:nowrap}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-harvey-svg{display:block;width:26px;height:26px;overflow:visible;flex:0 0 auto}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-harvey-svg__track{fill:none;stroke:var(--pfx-micro-track-color, var(--md-sys-color-surface-container-high, #e5e7eb));stroke-width:2.4}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-harvey-svg__bar{fill:none;stroke:currentColor;stroke-width:16;transform:rotate(-90deg);transform-origin:50% 50%}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-harvey-fraction{display:inline-flex;align-items:center;font-family:var(--md-sys-typescale-body-medium-font-family, sans-serif);font-size:12px;font-variant-numeric:tabular-nums;white-space:nowrap}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-harvey-fraction strong{color:currentColor;font-weight:700}:host ::ng-deep .pfx-micro-viz-cell .pfx-separator{margin-inline:2px;color:var(--md-sys-color-on-surface-variant, #4b5563);opacity:.6}:host ::ng-deep .pfx-micro-viz-cell .pfx-total{color:var(--md-sys-color-on-surface-variant, #4b5563)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz.pfx-micro-viz__process{display:inline-flex;align-items:center;justify-content:center;width:100%;min-width:112px;overflow:hidden}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz-container{display:flex;align-items:center;gap:8px;width:100%;min-width:0}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz.pfx-micro-viz__line,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz.pfx-micro-viz__area,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz.pfx-micro-viz__column{display:block;flex:1 1 auto;width:100%;min-width:0;height:30px;overflow:visible}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-line__svg,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-area__svg,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-column__svg{display:block;width:100%;height:100%;overflow:visible}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-line__path,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-area__path{stroke:currentColor}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-area__fill{fill:currentColor}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-column__bar,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-trend__marker{fill:currentColor}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-column__bar[data-tone=success],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-trend__marker[data-tone=success]{fill:var(--p-table-state-success-fg, #168a4a)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-column__bar[data-tone=warning],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-trend__marker[data-tone=warning]{fill:var(--p-table-state-warning-fg, #b45f06)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-column__bar[data-tone=danger],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-column__bar[data-tone=critical],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-trend__marker[data-tone=danger],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-trend__marker[data-tone=critical]{fill:var(--p-table-state-danger-fg, #b3261e)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-column__bar[data-tone=info],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-trend__marker[data-tone=info]{fill:var(--md-sys-color-primary, #2563eb)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step{display:flex;align-items:center;flex:0 1 auto;min-width:0}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__node-wrapper{display:inline-flex;align-items:center;min-width:0}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__node{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;border-radius:50%;background:var(--md-sys-color-surface-container-high, #e5e7eb);color:var(--md-sys-color-on-surface, #1f2937);font-size:12px;font-weight:700;line-height:1;flex:0 0 auto}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__icon{font-size:15px;line-height:1}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__label{display:none}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__connector{flex:0 1 24px;min-width:12px;max-width:28px;height:2px;margin-inline:6px;background:var(--md-sys-color-surface-container-high, #e5e7eb)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__node[data-tone=success],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__connector[data-tone=success]{background:var(--p-table-state-success-fg, #168a4a)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__node[data-tone=warning],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__connector[data-tone=warning]{background:var(--p-table-state-warning-fg, #b45f06)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__node[data-tone=danger],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__node[data-tone=critical],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__connector[data-tone=danger],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__connector[data-tone=critical]{background:var(--p-table-state-danger-fg, #b3261e)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__node[data-tone=info],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__connector[data-tone=info]{background:var(--md-sys-color-primary, #2563eb)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__node[data-tone=success],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__node[data-tone=warning],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__node[data-tone=danger],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__node[data-tone=critical],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__node[data-tone=info]{color:var(--md-sys-color-on-primary, #ffffff)}.pfx-avatar{display:inline-flex;align-items:center;justify-content:center;background:var(--md-sys-color-surface-container);color:var(--md-sys-color-on-surface);border-radius:4px;overflow:hidden;font-weight:600}.pfx-avatar.shape-rounded{border-radius:8px}.pfx-avatar.shape-circle{border-radius:999px}.pfx-avatar--initials{text-transform:uppercase;font-size:12px}.pfx-cell-compose{display:inline-flex;align-items:center;gap:6px}.pfx-cell-compose.dir-col{flex-direction:column;align-items:stretch}.pfx-cell-compose.align-start{justify-content:flex-start}.pfx-cell-compose.align-center{justify-content:center}.pfx-cell-compose.align-end{justify-content:flex-end}.pfx-cell-compose.wrap{flex-wrap:wrap}.pfx-cell-compose.ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.px-scroll-viewport{width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;overscroll-behavior-x:contain;background:var(--p-table-bg);border-radius:12px 12px 0 0}.px-scroll-viewport:has(.mat-mdc-table.table-stack-top){border-top-left-radius:0;border-top-right-radius:0}.px-scroll-viewport.scroll-none{overflow-x:visible}.px-scroll-viewport.scroll-auto ::ng-deep .mat-mdc-table{width:max-content;min-width:100%}.px-scroll-viewport.scroll-wrap ::ng-deep .mat-mdc-header-cell,.px-scroll-viewport.scroll-wrap ::ng-deep .mat-mdc-cell{white-space:normal;text-overflow:initial}.px-scroll-viewport.scroll-wrap ::ng-deep .mat-mdc-table{width:100%}:host ::ng-deep .mat-mdc-header-row{position:sticky;top:0;z-index:var(--praxis-layer-sticky-local, 100);height:var(--p-table-header-height, var(--p-table-header-height-default, var(--mat-table-header-container-height, 40px)));min-height:var(--p-table-header-height, var(--p-table-header-height-default, var(--mat-table-header-container-height, 40px)));background:var(--p-table-header-bg);color:var(--p-table-header-fg);box-shadow:var(--p-table-header-shadow, 0 1px 0 var(--p-table-border-color));border-bottom:1px solid var(--p-table-border-color)}:host ::ng-deep .mat-mdc-header-cell{color:var(--p-table-header-fg);font-weight:600}:host ::ng-deep .mat-sort-header-content,:host ::ng-deep .mat-mdc-header-row .mat-icon{color:inherit;font-weight:600}:host ::ng-deep .mat-mdc-header-cell.mat-sort-header-sorted .mat-sort-header-arrow,:host ::ng-deep .mat-mdc-header-cell:hover .mat-sort-header-arrow{color:var(--p-table-header-fg)!important}:host ::ng-deep .mat-mdc-header-cell.mat-sort-header-sorted .mat-sort-header-arrow .mat-sort-header-indicator,:host ::ng-deep .mat-mdc-header-cell.mat-sort-header-sorted .mat-sort-header-arrow .mat-sort-header-stem,:host ::ng-deep .mat-mdc-header-cell.mat-sort-header-sorted .mat-sort-header-arrow .mat-sort-header-pointer,:host ::ng-deep .mat-mdc-header-cell.mat-sort-header-sorted .mat-sort-header-arrow .mat-sort-header-pointer-left,:host ::ng-deep .mat-mdc-header-cell.mat-sort-header-sorted .mat-sort-header-arrow .mat-sort-header-pointer-right{border-color:var(--p-table-header-fg)!important;background:var(--p-table-header-fg)!important}:host ::ng-deep .mat-mdc-header-cell{height:var(--p-table-header-height, var(--p-table-header-height-default, var(--mat-table-header-container-height, 40px)));padding:var(--p-header-padding, var(--p-header-padding-default, 12px 16px))!important;font-size:var(--p-header-font-size, var(--p-header-font-size-default, inherit));font-weight:var(--p-header-font-weight, 600);letter-spacing:var(--p-header-letter-spacing, normal);text-transform:var(--p-header-text-transform, none);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;position:relative}:host ::ng-deep .mat-mdc-header-cell.praxis-header-align-left .mat-sort-header-container{justify-content:flex-start}:host ::ng-deep .mat-mdc-header-cell.praxis-header-align-center .mat-sort-header-container{justify-content:center}:host ::ng-deep .mat-mdc-header-cell.praxis-header-align-right .mat-sort-header-container{justify-content:flex-end}:host ::ng-deep .mat-mdc-header-cell.praxis-header-align-left .praxis-header-label-text{text-align:left}:host ::ng-deep .mat-mdc-header-cell.praxis-header-align-center .praxis-header-label-text{text-align:center}:host ::ng-deep .mat-mdc-header-cell.praxis-header-align-right .praxis-header-label-text{text-align:right}:host ::ng-deep .pfx-column-drag-enabled .mat-mdc-header-cell.praxis-header-draggable .mat-sort-header-container{display:flex;align-items:center;width:100%;gap:4px}:host ::ng-deep .pfx-column-drag-enabled .mat-mdc-header-cell.praxis-header-draggable{-webkit-user-select:none;user-select:none}:host ::ng-deep .mat-mdc-header-cell .praxis-header-sort-trigger{display:block;width:100%;min-width:0}:host ::ng-deep .mat-mdc-header-cell.praxis-header-resizable{overflow:visible}:host ::ng-deep .mat-mdc-header-cell .praxis-column-resize-handle{position:absolute;z-index:2;inset-block:0;inset-inline-end:0;width:var(--p-table-column-resize-hit-area);cursor:col-resize;touch-action:none;-webkit-user-select:none;user-select:none}:host ::ng-deep .mat-mdc-header-cell .praxis-column-resize-handle:after{content:\"\";position:absolute;inset-block:6px;inset-inline-start:calc((var(--p-table-column-resize-hit-area) - var(--p-table-column-resize-line-width)) / 2);width:var(--p-table-column-resize-line-width);background:var(--p-table-column-resize-separator-color);opacity:.76;transition:background-color .12s ease,opacity .12s ease,transform .12s ease,inset-block .12s ease}:host ::ng-deep .mat-mdc-header-cell .praxis-column-resize-handle:focus-visible{outline:2px solid var(--p-table-column-resize-separator-hover-color);outline-offset:-2px}:host ::ng-deep .mat-mdc-header-cell.praxis-header-resizable:hover .praxis-column-resize-handle:after,:host ::ng-deep .mat-mdc-header-cell.praxis-header-resizable:focus-within .praxis-column-resize-handle:after,:host ::ng-deep .mat-mdc-header-cell .praxis-column-resize-handle:hover:after,:host ::ng-deep .mat-mdc-header-cell .praxis-column-resize-handle:focus-visible:after{background:var(--p-table-column-resize-separator-hover-color);opacity:1}:host ::ng-deep .mat-mdc-header-cell.praxis-header-resizing .praxis-column-resize-handle:after{background:var(--p-table-column-resize-active-color);inset-block:0;opacity:1;transform:scaleX(2)}:host ::ng-deep .pfx-column-resizing,:host ::ng-deep .pfx-column-resizing .mat-mdc-header-cell{cursor:col-resize}:host ::ng-deep .pfx-column-drag-enabled .mat-mdc-header-cell.praxis-header-draggable.cdk-drag-dragging{cursor:grabbing}:host ::ng-deep .pfx-column-drag-enabled .mat-mdc-header-cell.praxis-header-draggable .mat-sort-header-content{display:inline-flex;align-items:center;gap:4px;flex:1 1 auto;min-width:0;max-width:100%;overflow:hidden}:host ::ng-deep .pfx-column-drag-enabled .mat-mdc-header-cell .praxis-header-label{display:inline-flex;align-items:center;gap:4px;flex:1 1 auto;min-width:0}:host ::ng-deep .pfx-column-drag-enabled .mat-mdc-header-cell .praxis-header-label-text{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}:host ::ng-deep .pfx-column-drag-indicator .cdk-drop-list-dragging .mat-mdc-header-cell:not(.cdk-drag-placeholder){transition:transform var(--p-table-reorder-transition-duration, .18s) var(--p-table-motion-easing, cubic-bezier(0, 0, .2, 1))}:host ::ng-deep .pfx-column-drag-indicator .mat-mdc-header-cell.cdk-drag-animating{transition:transform var(--p-table-reorder-transition-duration, .16s) var(--p-table-motion-easing, cubic-bezier(0, 0, .2, 1))}.pfx-column-drag-preview{box-sizing:border-box;display:flex;align-items:center;border-radius:10px;border:1px solid var(--p-table-border-color);background:linear-gradient(135deg,var(--p-table-header-bg) 0%,var(--p-table-row-hover-bg) 100%);color:var(--p-table-header-fg);box-shadow:var(--p-table-drag-preview-shadow);transform:scale(var(--p-table-drag-preview-scale, 1.01));pointer-events:none;z-index:var(--praxis-layer-authoring-hover, 300)}.pfx-column-drag-preview-custom{height:100%;padding:var(--p-header-padding, var(--p-header-padding-default, 12px 16px))}.pfx-column-drag-preview .mat-sort-header-arrow,.pfx-column-drag-preview .mat-sort-header-indicator,.pfx-column-drag-preview .mat-sort-header-stem,.pfx-column-drag-preview .mat-sort-header-pointer,.pfx-column-drag-preview .mat-sort-header-pointer-left,.pfx-column-drag-preview .mat-sort-header-pointer-right{display:none!important}.pfx-column-drag-preview .mat-sort-header-container{display:flex;align-items:center;width:100%;min-height:100%;padding-right:0!important}.pfx-column-drag-preview .praxis-header-sort-trigger{display:block;width:100%;min-width:0}.pfx-column-drag-preview .mat-sort-header-content,.pfx-column-drag-preview .praxis-header-label{display:inline-flex;align-items:center;flex:1 1 auto;min-width:0;width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pfx-column-drag-preview.praxis-header-align-left .mat-sort-header-container,.pfx-column-drag-preview.praxis-header-align-left,.pfx-column-drag-preview.praxis-header-align-left .mat-sort-header-content,.pfx-column-drag-preview.praxis-header-align-left .praxis-header-label{justify-content:flex-start}.pfx-column-drag-preview.praxis-header-align-center .mat-sort-header-container,.pfx-column-drag-preview.praxis-header-align-center,.pfx-column-drag-preview.praxis-header-align-center .mat-sort-header-content,.pfx-column-drag-preview.praxis-header-align-center .praxis-header-label{justify-content:center}.pfx-column-drag-preview.praxis-header-align-right .mat-sort-header-container,.pfx-column-drag-preview.praxis-header-align-right,.pfx-column-drag-preview.praxis-header-align-right .mat-sort-header-content,.pfx-column-drag-preview.praxis-header-align-right .praxis-header-label{justify-content:flex-end}.pfx-column-drag-preview.praxis-header-align-right .mat-sort-header-content{flex:0 1 auto;width:auto;margin-inline-start:auto}.pfx-column-drag-preview.praxis-header-align-right .praxis-header-label{width:auto}.pfx-column-drag-preview.praxis-header-align-left .praxis-header-label-text{text-align:left}.pfx-column-drag-preview.praxis-header-align-center .praxis-header-label-text{text-align:center}.pfx-column-drag-preview.praxis-header-align-right .praxis-header-label-text{text-align:right}:host ::ng-deep .pfx-column-drag-indicator .cdk-drag-placeholder{opacity:1;border:1px dashed var(--p-table-border-color);background:var(--p-table-row-hover-bg)}:host ::ng-deep .pfx-column-drag-indicator .cdk-drag-placeholder *{opacity:0}:host ::ng-deep .pfx-column-drag-indicator .mat-mdc-header-cell.cdk-drag-dragging{opacity:.58}@media(prefers-reduced-motion:reduce){:host ::ng-deep .pfx-column-drag-indicator .cdk-drop-list-dragging .mat-mdc-header-cell:not(.cdk-drag-placeholder){transition:none}.pfx-column-drag-preview{transition:none;transform:none}.praxis-column-reorder-status{animation:none}.pfx-expansion-detail-panel{animation:none!important;transition:none!important;transform:none!important}:host ::ng-deep .mat-mdc-row{transition:none}:host ::ng-deep .mat-mdc-table{transition:none}}.praxis-actions-header{text-align:right}.praxis-actions-header.align-start{text-align:left}.praxis-actions-header.align-center{text-align:center}.praxis-actions-header.align-end{text-align:right}.praxis-actions-header .praxis-actions-header__content{display:inline-flex;align-items:center;gap:var(--p-actions-header-gap, 6px);justify-content:center;max-width:100%;min-width:0;white-space:nowrap;color:var(--p-actions-header-color, inherit)}.praxis-actions-header .praxis-actions-header__content .mat-icon{font-size:18px;width:18px;height:18px;line-height:18px}.praxis-actions-header .praxis-actions-header__label{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@media(max-width:640px){.praxis-actions-header .praxis-actions-header__label{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap}}:host ::ng-deep .mat-mdc-header-cell .mat-sort-header-container{box-sizing:border-box;padding-inline-end:0;position:static}:host ::ng-deep .pfx-column-drag-enabled .mat-mdc-header-cell.praxis-header-draggable .mat-sort-header-container{padding-inline-end:0}:host ::ng-deep .mat-mdc-header-cell.praxis-header-resizable:not(.praxis-header-align-right) .mat-sort-header-container{padding-inline-end:calc(var(--p-table-column-resize-hit-area) + 8px)}:host ::ng-deep .mat-mdc-header-cell.praxis-header-resizable.praxis-header-align-center .mat-sort-header-container{padding-inline-start:calc(var(--p-table-column-resize-hit-area) + 8px)}:host ::ng-deep .mat-mdc-header-cell.praxis-header-resizable.praxis-header-align-right .mat-sort-header-container{padding-inline-end:0}:host ::ng-deep .mat-mdc-header-cell.praxis-header-resizable:not(.praxis-header-align-right) .mat-sort-header-content{box-sizing:border-box;padding-inline-end:18px}:host ::ng-deep .mat-mdc-header-cell.praxis-header-resizable.praxis-header-align-center .mat-sort-header-content{padding-inline-start:0;padding-inline-end:0}:host ::ng-deep .mat-mdc-header-cell.praxis-header-resizable.praxis-header-align-right .mat-sort-header-content{box-sizing:border-box;flex:0 1 auto;width:auto;padding-inline-start:0;padding-inline-end:0}:host ::ng-deep .mat-mdc-header-cell.praxis-header-resizable.praxis-header-align-right .praxis-header-label{width:auto}:host ::ng-deep .mat-mdc-header-cell .mat-sort-header-arrow{position:absolute;inset-inline-end:var(--p-table-sort-arrow-overlay-inset, 2px);top:50%;margin:0;transform:translateY(-50%)}:host ::ng-deep .mat-mdc-header-cell.praxis-header-resizable:not(.praxis-header-align-right) .mat-sort-header-arrow{inset-inline-end:calc(var(--p-table-column-resize-hit-area) + 2px)}:host ::ng-deep .mat-mdc-header-cell.praxis-header-align-right .mat-sort-header-arrow{position:static;order:-1;flex:0 0 auto;margin-inline:0 4px;transform:none}:host ::ng-deep .mat-mdc-cell{color:var(--p-table-text-color);height:var(--p-table-row-height, var(--p-table-row-height-default, 44px));padding:var(--p-cell-padding, var(--p-cell-padding-default, 10px 14px));font-size:var(--p-cell-font-size, var(--p-cell-font-size-default, inherit));line-height:1.25;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}:host ::ng-deep .mat-mdc-cell .pfx-cell-content,:host ::ng-deep .mat-cell .pfx-cell-content{display:inline-flex;align-items:center;gap:6px;width:100%;min-width:0;overflow:hidden}:host ::ng-deep .pfx-cell-content.pfx-cell-anim{animation-duration:var(--pfx-cell-anim-duration, .8s);animation-delay:var(--pfx-cell-anim-delay, 0ms);animation-fill-mode:both;animation-timing-function:ease-in-out}:host ::ng-deep .pfx-cell-content.pfx-cell-anim.pfx-cell-anim--once{animation-iteration-count:1}:host ::ng-deep .pfx-cell-content.pfx-cell-anim.pfx-cell-anim--loop{animation-iteration-count:infinite}:host ::ng-deep .pfx-cell-content.pfx-cell-anim.pfx-cell-anim--count{animation-iteration-count:var(--pfx-cell-anim-iteration-count, 1)}:host ::ng-deep .pfx-cell-content.pfx-cell-anim.pfx-cell-anim--on-hover{animation-play-state:paused}:host ::ng-deep .mat-mdc-cell:hover .pfx-cell-content.pfx-cell-anim.pfx-cell-anim--on-hover,:host ::ng-deep .mat-cell:hover .pfx-cell-content.pfx-cell-anim.pfx-cell-anim--on-hover{animation-play-state:running}:host ::ng-deep .pfx-cell-content.pfx-cell-anim.pfx-cell-anim--pulse{animation-name:pfx-cell-pulse}:host ::ng-deep .pfx-cell-content.pfx-cell-anim.pfx-cell-anim--blink{animation-name:pfx-cell-blink}:host ::ng-deep .pfx-cell-content.pfx-cell-anim.pfx-cell-anim--grow{animation-name:pfx-cell-grow}:host ::ng-deep .pfx-cell-content.pfx-cell-anim.pfx-cell-anim--fade{animation-name:pfx-cell-fade}:host ::ng-deep .pfx-cell-content.pfx-cell-anim.pfx-cell-anim--slide-in{animation-name:pfx-cell-slide-in}:host ::ng-deep .pfx-cell-content.pfx-cell-anim.pfx-cell-anim--border-pulse{animation-name:pfx-cell-border-pulse}@keyframes pfx-cell-pulse{0%{transform:scale(1)}50%{transform:scale(var(--pfx-cell-anim-scale-peak, 1.015))}to{transform:scale(1)}}@keyframes pfx-cell-blink{0%,49%{opacity:1}50%,to{opacity:var(--pfx-cell-anim-min-opacity, .35)}}@keyframes pfx-cell-grow{0%{transform:scale(.985)}to{transform:scale(1)}}@keyframes pfx-cell-fade{0%{opacity:0}to{opacity:1}}@keyframes pfx-cell-slide-in{0%{opacity:0;transform:translateY(var(--pfx-cell-anim-slide-distance, 4px))}to{opacity:1;transform:translateY(0)}}@keyframes pfx-cell-border-pulse{0%,to{box-shadow:inset 0 0 rgba(var(--pfx-cell-anim-border-rgb, 25, 118, 210),0)}50%{box-shadow:inset 0 0 0 2px rgba(var(--pfx-cell-anim-border-rgb, 25, 118, 210),var(--pfx-cell-anim-border-strength, .3))}}:host ::ng-deep .mat-mdc-row.pfx-row-anim{animation-duration:var(--pfx-row-anim-duration, .8s);animation-delay:var(--pfx-row-anim-delay, 0ms);animation-fill-mode:both;animation-timing-function:ease-in-out}:host ::ng-deep .mat-mdc-row.pfx-row-anim.pfx-row-anim--once{animation-iteration-count:1}:host ::ng-deep .mat-mdc-row.pfx-row-anim.pfx-row-anim--loop{animation-iteration-count:infinite}:host ::ng-deep .mat-mdc-row.pfx-row-anim.pfx-row-anim--count{animation-iteration-count:var(--pfx-row-anim-iteration-count, 1)}:host ::ng-deep .mat-mdc-row.pfx-row-anim.pfx-row-anim--on-hover{animation-play-state:paused}:host ::ng-deep .mat-mdc-row.pfx-row-anim.pfx-row-anim--on-hover:hover{animation-play-state:running}:host ::ng-deep .mat-mdc-row.pfx-row-anim.pfx-row-anim--pulse{animation-name:pfx-row-pulse}:host ::ng-deep .mat-mdc-row.pfx-row-anim.pfx-row-anim--blink{animation-name:pfx-row-blink}:host ::ng-deep .mat-mdc-row.pfx-row-anim.pfx-row-anim--grow{animation-name:pfx-row-grow}:host ::ng-deep .mat-mdc-row.pfx-row-anim.pfx-row-anim--fade{animation-name:pfx-row-fade}:host ::ng-deep .mat-mdc-row.pfx-row-anim.pfx-row-anim--slide-in{animation-name:pfx-row-slide-in}:host ::ng-deep .mat-mdc-row.pfx-row-anim.pfx-row-anim--border-pulse{animation-name:pfx-row-border-pulse}@keyframes pfx-row-pulse{0%{transform:scale(1)}50%{transform:scale(var(--pfx-row-anim-scale-peak, 1.015))}to{transform:scale(1)}}@keyframes pfx-row-blink{0%,49%{opacity:1}50%,to{opacity:var(--pfx-row-anim-min-opacity, .35)}}@keyframes pfx-row-grow{0%{transform:scale(.985)}to{transform:scale(1)}}@keyframes pfx-row-fade{0%{opacity:0}to{opacity:1}}@keyframes pfx-row-slide-in{0%{opacity:0;transform:translateY(var(--pfx-row-anim-slide-distance, 4px))}to{opacity:1;transform:translateY(0)}}@keyframes pfx-row-border-pulse{0%,to{box-shadow:inset 0 0 rgba(var(--pfx-row-anim-border-rgb, 25, 118, 210),0)}50%{box-shadow:inset 0 0 0 2px rgba(var(--pfx-row-anim-border-rgb, 25, 118, 210),var(--pfx-row-anim-border-strength, .3))}}@media(prefers-reduced-motion:reduce){:host ::ng-deep .pfx-cell-content.pfx-cell-anim,:host ::ng-deep .mat-mdc-row.pfx-row-anim{animation:none!important}}:host ::ng-deep .mat-mdc-row:hover{background:var(--p-table-row-hover-bg)}:host ::ng-deep .mat-mdc-row{height:var(--p-table-row-height, var(--p-table-row-height-default, 44px));min-height:var(--p-table-row-height, var(--p-table-row-height-default, 44px));transition:background-color var(--p-table-hover-transition-duration, .18s) var(--p-table-motion-easing, cubic-bezier(0, 0, .2, 1)),box-shadow var(--p-table-selection-transition-duration, .18s) var(--p-table-motion-easing, cubic-bezier(0, 0, .2, 1))}:host ::ng-deep .mat-mdc-row.pfx-row-click-selectable{cursor:pointer}:host ::ng-deep .mat-mdc-row:nth-child(2n){background:var(--p-table-row-even-bg)}:host ::ng-deep .mat-mdc-row:nth-child(2n):hover{background:var(--p-table-row-hover-bg)}:host ::ng-deep .mat-mdc-row.pfx-row-selected,:host ::ng-deep .mat-mdc-row.pfx-row-selected:hover{background:var(--p-table-row-selected-bg)}:host ::ng-deep .mat-mdc-row.pfx-row-selected .mat-mdc-cell{background:var(--p-table-row-selected-bg);color:var(--p-table-row-selected-fg);font-weight:var(--p-table-row-selected-font-weight)}:host ::ng-deep .mat-mdc-row.pfx-row-selected .mat-mdc-cell:first-child{position:relative}:host ::ng-deep .mat-mdc-row.pfx-row-selected .mat-mdc-cell:first-child:before{content:\"\";position:absolute;inset:0 auto 0 0;width:4px;border-radius:0 4px 4px 0;background:var(--p-table-row-selected-indicator);pointer-events:none}:host.row-borders ::ng-deep .mat-mdc-row .mat-mdc-cell{border-bottom:1px solid var(--p-table-border-color)}:host.row-borders ::ng-deep .mat-mdc-header-row .mat-mdc-header-cell{border-bottom:none}:host.col-borders ::ng-deep .mat-mdc-header-row .mat-mdc-header-cell,:host.col-borders ::ng-deep .mat-mdc-row .mat-mdc-cell{border-right:1px solid var(--p-table-border-color)}:host.col-borders ::ng-deep .mat-mdc-header-row .mat-mdc-header-cell:last-child,:host.col-borders ::ng-deep .mat-mdc-row .mat-mdc-cell:last-child{border-right:none}.ptable-error{display:flex;align-items:center;gap:12px;padding:12px;margin:8px 0;border:1px solid var(--md-sys-color-error);border-radius:8px}.ptable-error__content{flex:1}.ptable-error__title{font-weight:600}.ptable-info-banner{display:flex;gap:12px;align-items:center;padding:8px 12px;margin:8px 0;border-radius:8px;border:1px solid var(--md-sys-color-primary);background:var(--md-sys-color-primary-container);color:var(--md-sys-color-on-primary-container)}.ptable-info-banner .text{flex:1;font-weight:600}.ptable-info-banner .actions{display:flex;gap:8px}.pfx-cell-image{display:inline-block;vertical-align:middle;background:var(--md-sys-color-surface-variant);border:1px solid var(--md-sys-color-outline-variant)}.pfx-cell-image.shape-rounded{border-radius:8px}.pfx-cell-image.shape-circle{border-radius:9999px}.pfx-badge{display:inline-flex;align-items:center;gap:6px;line-height:1;padding:4px 8px;border-radius:9999px;font-size:12px;font-weight:600;border:1px solid transparent;white-space:nowrap;--prx-rich-content-inline-gap: 6px}.pfx-badge .pfx-badge-icon{font-size:16px;width:16px;height:16px}.pfx-badge--plain{background:transparent;border-color:transparent;color:inherit}.pfx-badge--filled-primary{background:var(--md-sys-color-primary);color:var(--md-sys-color-on-primary)}.pfx-badge--filled-accent{background:var(--md-sys-color-secondary);color:var(--md-sys-color-on-secondary)}.pfx-badge--filled-warn,.pfx-badge--filled-danger{background:var(--md-sys-color-error);color:var(--md-sys-color-on-error)}.pfx-badge--filled-success{background:var(--p-table-state-success-bg);color:var(--p-table-state-success-fg)}.pfx-badge--filled-info{background:var(--md-sys-color-tertiary);color:var(--md-sys-color-on-tertiary)}.pfx-badge--filled-basic{background:var(--md-sys-color-surface-container-highest);color:var(--md-sys-color-on-surface);border-color:var(--md-sys-color-outline-variant)}.pfx-badge--outlined{background:transparent;border-color:var(--md-sys-color-outline-variant);color:inherit}.pfx-badge--soft-primary{background:var(--p-table-badge-soft-primary-bg);color:var(--p-table-badge-soft-primary-fg)}.pfx-badge--soft-accent{background:var(--p-table-badge-soft-accent-bg);color:var(--p-table-badge-soft-accent-fg)}.pfx-badge--soft-warn{background:var(--p-table-badge-soft-warn-bg);color:var(--p-table-badge-soft-warn-fg)}.pfx-badge--soft-danger{background:color-mix(in srgb,var(--p-table-state-danger-bg) 72%,transparent);color:var(--p-table-state-danger-fg);border-color:color-mix(in srgb,var(--p-table-state-danger-fg) 18%,transparent)}.pfx-badge--soft-success{background:color-mix(in srgb,var(--p-table-state-success-bg) 72%,transparent);color:var(--p-table-state-success-fg);border-color:color-mix(in srgb,var(--p-table-state-success-fg) 18%,transparent)}.pfx-badge--soft-info{background:color-mix(in srgb,var(--md-sys-color-tertiary-container) 72%,transparent);color:var(--md-sys-color-on-tertiary-container);border-color:color-mix(in srgb,var(--md-sys-color-tertiary) 18%,transparent)}.pfx-badge--soft-basic{background:color-mix(in srgb,var(--md-sys-color-surface-container-highest) 82%,transparent);color:color-mix(in srgb,var(--md-sys-color-on-surface) 76%,transparent);border-color:color-mix(in srgb,var(--md-sys-color-outline-variant) 65%,transparent)}.pfx-icon-renderer,:host ::ng-deep .pfx-icon-renderer__content{--prx-rich-content-inline-gap: var(--p-table-icon-value-gap, .04rem)}.pfx-icon-renderer__prefix,.pfx-icon-renderer__suffix,:host ::ng-deep .pfx-icon-renderer__prefix,:host ::ng-deep .pfx-icon-renderer__suffix{color:var(--p-table-icon-value-affix-color, currentColor);font-size:var(--p-table-icon-value-affix-font-size, .95em);font-weight:var(--p-table-icon-value-affix-font-weight, 500);line-height:1;opacity:var(--p-table-icon-value-affix-opacity, .72)}.pfx-icon-renderer__label,:host ::ng-deep .pfx-icon-renderer__label{color:var(--p-table-icon-value-color, currentColor);font-weight:var(--p-table-icon-value-font-weight, inherit);font-variant-numeric:tabular-nums;line-height:1}.row--success,.row--success td,td.row--success{background-color:var(--p-table-state-success-bg)!important;color:var(--p-table-state-success-fg)!important}.row--warning,.row--warning td,td.row--warning{background-color:var(--p-table-state-warning-bg)!important;color:var(--p-table-state-warning-fg)!important}.row--danger,.row--danger td,td.row--danger{background-color:var(--p-table-state-danger-bg)!important;color:var(--p-table-state-danger-fg)!important}.row--highlight,.row--highlight td,td.row--highlight{background-color:var(--p-table-state-highlight-bg)!important;color:var(--p-table-state-highlight-fg)!important;font-weight:600}.row--muted,.row--muted td,td.row--muted{opacity:.7;filter:saturate(.6)}.pfx-expansion-node-embed{display:flex;flex-direction:column;gap:12px;padding:16px;border:1px solid var(--md-sys-color-outline-variant);border-radius:16px;background:var(--md-sys-color-surface-container-low, var(--md-sys-color-surface))}.ptable-loading-state{padding:8px 12px 4px;display:grid;gap:10px}.ptable-loading-state__hero{display:grid;gap:10px;padding:14px;border-radius:8px;border:1px solid rgba(18,99,180,.08);background:linear-gradient(180deg,#ffffffa6,#ffffff47),linear-gradient(0deg,#1263b408,#1263b400)}.ptable-loading-state__rows{display:grid;gap:8px}.ptable-loading-state__row{display:grid;grid-template-columns:96px minmax(0,1fr) minmax(140px,1.2fr);gap:8px}.ptable-loading-state__line,.ptable-loading-state__cell{display:block;height:12px;border-radius:999px;background:linear-gradient(90deg,#1263b414,#1263b42e,#1263b414);background-size:200% 100%;animation:ptable-loading-wave 1.2s ease-in-out infinite}.ptable-loading-state__line--wide{width:180px}.ptable-loading-state__line--short{width:96px}.ptable-loading-state__cell--short{width:100%;max-width:84px}.ptable-loading-state__cell--wide{width:100%}.ptable-loading-state__message{font-size:.85rem;color:var(--md-sys-color-on-surface-variant, #5a5d67);padding-inline:4px}.pfx-expansion-node-embed__header,.pfx-expansion-node-embed__meta,.pfx-expansion-node-embed__empty,.pfx-expansion-node-embed__diagram-label{display:block}.pfx-expansion-node-embed--inline{min-width:0}.pfx-expansion-node-embed--chart praxis-chart{display:block;min-height:280px}.ptable-no-data-state{padding:8px 12px 4px}.ptable-no-data-state ::ng-deep .empty-card{margin:0;border-radius:8px}@keyframes ptable-loading-wave{0%{background-position:100% 0}to{background-position:-100% 0}}.pfx-expansion-node-embed__diagram{display:flex;flex-direction:column;gap:8px}.pfx-expansion-node-embed__diagram-source{margin:0;padding:12px;overflow:auto;border-radius:12px;border:1px solid var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface-container-highest, var(--md-sys-color-surface));color:var(--md-sys-color-on-surface);font-family:Consolas,Courier New,monospace;font-size:12px;line-height:1.4;white-space:pre-wrap}.pfx-expansion-node-embed__action-btn{align-self:flex-start}.pfx-expansion-node-embed__action-host{display:inline-flex}.praxis-table-columns-menu{max-height:320px;overflow-y:auto;padding:8px 0}.praxis-table-column-menu-item{display:flex!important;align-items:center;width:100%;box-sizing:border-box;padding:6px 16px;min-height:40px}.praxis-table-column-menu-item mat-checkbox{width:100%}\n"] }]
|
|
55307
55812
|
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i3$3.SettingsPanelService }, { type: i1.GenericCrudService }, { type: TableDefaultsProvider }, { type: FilterConfigService }, { type: DataFormattingService }, { type: i6$2.PraxisDialog }, { type: i2$2.MatSnackBar }, { type: undefined, decorators: [{
|
|
55308
55813
|
type: Inject,
|
|
55309
55814
|
args: [ASYNC_CONFIG_STORAGE]
|
|
@@ -56914,6 +57419,10 @@ const rendererSchema = {
|
|
|
56914
57419
|
properties: {
|
|
56915
57420
|
name: { type: 'string' },
|
|
56916
57421
|
nameField: { type: 'string' },
|
|
57422
|
+
text: { type: 'string' },
|
|
57423
|
+
textField: { type: 'string' },
|
|
57424
|
+
prefix: { type: 'string' },
|
|
57425
|
+
suffix: { type: 'string' },
|
|
56917
57426
|
color: { type: 'string' },
|
|
56918
57427
|
size: { type: 'number' },
|
|
56919
57428
|
ariaLabel: { type: 'string' }
|
|
@@ -61105,9 +61614,13 @@ const TABLE_AI_CAPABILITIES = {
|
|
|
61105
61614
|
{ path: 'columns[].renderer.link.hrefField', category: 'renderer', valueKind: 'string', description: 'Campo para href do link.', dependsOn: 'columns[].renderer.link' },
|
|
61106
61615
|
{ path: 'columns[].renderer.link.target', category: 'renderer', valueKind: 'enum', allowedValues: ENUMS.rendererLinkTarget, description: 'Target do link.', dependsOn: 'columns[].renderer.link' },
|
|
61107
61616
|
{ path: 'columns[].renderer.link.rel', category: 'renderer', valueKind: 'string', description: 'Atributo rel do link.', dependsOn: 'columns[].renderer.link' },
|
|
61108
|
-
{ path: 'columns[].renderer.icon', category: 'renderer', valueKind: 'object', description: 'Icone material/SVG com cor
|
|
61617
|
+
{ path: 'columns[].renderer.icon', category: 'renderer', valueKind: 'object', description: 'Icone material/SVG com cor, tamanho e texto opcional ao lado do valor.', dependsOn: 'columns[].renderer.type', example: '{ name: "tag", textField: "codigo", prefix: "#", color: "success", size: 18 }', intentExamples: ['mostrar ícone de status', 'icone verde para ativo', 'mostrar codigo com # e icone'] },
|
|
61109
61618
|
{ path: 'columns[].renderer.icon.name', category: 'renderer', valueKind: 'string', description: 'Nome fixo do icone.', dependsOn: 'columns[].renderer.icon' },
|
|
61110
61619
|
{ path: 'columns[].renderer.icon.nameField', category: 'renderer', valueKind: 'string', description: 'Campo com nome do icone.', dependsOn: 'columns[].renderer.icon' },
|
|
61620
|
+
{ path: 'columns[].renderer.icon.text', category: 'renderer', valueKind: 'string', description: 'Texto fixo renderizado junto ao icone.', dependsOn: 'columns[].renderer.icon' },
|
|
61621
|
+
{ path: 'columns[].renderer.icon.textField', category: 'renderer', valueKind: 'string', description: 'Campo de linha usado como texto renderizado junto ao icone.', dependsOn: 'columns[].renderer.icon' },
|
|
61622
|
+
{ path: 'columns[].renderer.icon.prefix', category: 'renderer', valueKind: 'string', description: 'Prefixo visual aplicado somente ao texto exibido pelo renderer de icone.', dependsOn: 'columns[].renderer.icon' },
|
|
61623
|
+
{ path: 'columns[].renderer.icon.suffix', category: 'renderer', valueKind: 'string', description: 'Sufixo visual aplicado somente ao texto exibido pelo renderer de icone.', dependsOn: 'columns[].renderer.icon' },
|
|
61111
61624
|
{ path: 'columns[].renderer.icon.color', category: 'renderer', valueKind: 'string', description: 'Cor do icone.', dependsOn: 'columns[].renderer.icon' },
|
|
61112
61625
|
{ path: 'columns[].renderer.icon.size', category: 'renderer', valueKind: 'number', description: 'Tamanho em px.', dependsOn: 'columns[].renderer.icon' },
|
|
61113
61626
|
{ path: 'columns[].renderer.icon.ariaLabel', category: 'renderer', valueKind: 'string', description: 'Label acessivel do icone.', dependsOn: 'columns[].renderer.icon' },
|
|
@@ -61220,6 +61733,10 @@ const TABLE_AI_CAPABILITIES = {
|
|
|
61220
61733
|
{ path: 'columns[].conditionalRenderers[].renderer.icon', category: 'conditional', valueKind: 'object', description: 'Configuracao de icone condicional.', dependsOn: 'columns[].conditionalRenderers[].renderer.type' },
|
|
61221
61734
|
{ path: 'columns[].conditionalRenderers[].renderer.icon.name', category: 'conditional', valueKind: 'string', description: 'Nome fixo do icone.', dependsOn: 'columns[].conditionalRenderers[].renderer.icon' },
|
|
61222
61735
|
{ path: 'columns[].conditionalRenderers[].renderer.icon.nameField', category: 'conditional', valueKind: 'string', description: 'Campo com nome do icone.', dependsOn: 'columns[].conditionalRenderers[].renderer.icon' },
|
|
61736
|
+
{ path: 'columns[].conditionalRenderers[].renderer.icon.text', category: 'conditional', valueKind: 'string', description: 'Texto fixo renderizado junto ao icone condicional.', dependsOn: 'columns[].conditionalRenderers[].renderer.icon' },
|
|
61737
|
+
{ path: 'columns[].conditionalRenderers[].renderer.icon.textField', category: 'conditional', valueKind: 'string', description: 'Campo de linha usado como texto renderizado junto ao icone condicional.', dependsOn: 'columns[].conditionalRenderers[].renderer.icon' },
|
|
61738
|
+
{ path: 'columns[].conditionalRenderers[].renderer.icon.prefix', category: 'conditional', valueKind: 'string', description: 'Prefixo visual aplicado somente ao texto exibido pelo renderer de icone condicional.', dependsOn: 'columns[].conditionalRenderers[].renderer.icon' },
|
|
61739
|
+
{ path: 'columns[].conditionalRenderers[].renderer.icon.suffix', category: 'conditional', valueKind: 'string', description: 'Sufixo visual aplicado somente ao texto exibido pelo renderer de icone condicional.', dependsOn: 'columns[].conditionalRenderers[].renderer.icon' },
|
|
61223
61740
|
{ path: 'columns[].conditionalRenderers[].renderer.icon.color', category: 'conditional', valueKind: 'string', description: 'Cor do icone.', dependsOn: 'columns[].conditionalRenderers[].renderer.icon' },
|
|
61224
61741
|
{ path: 'columns[].conditionalRenderers[].renderer.icon.size', category: 'conditional', valueKind: 'number', description: 'Tamanho em px.', dependsOn: 'columns[].conditionalRenderers[].renderer.icon' },
|
|
61225
61742
|
{ path: 'columns[].conditionalRenderers[].renderer.icon.ariaLabel', category: 'conditional', valueKind: 'string', description: 'Label acessivel do icone.', dependsOn: 'columns[].conditionalRenderers[].renderer.icon' },
|
|
@@ -61507,6 +62024,7 @@ const TABLE_AI_CAPABILITIES = {
|
|
|
61507
62024
|
{ path: 'toolbar.position', category: 'toolbar', valueKind: 'enum', allowedValues: ENUMS.toolbarPosition, description: 'Posiciona a toolbar.', example: '"top"' },
|
|
61508
62025
|
{ path: 'toolbar.actionsPosition', category: 'toolbar', valueKind: 'enum', allowedValues: ENUMS.toolbarPosition, description: 'Posiciona a barra de ações (top/bottom/both).', intentExamples: ['ações no topo', 'barra de ações embaixo', 'ações em ambas'], example: '"bottom"' },
|
|
61509
62026
|
{ path: 'toolbar.actionsBackgroundColor', category: 'toolbar', valueKind: 'string', description: 'Cor de fundo da barra de ações (token/hex).', intentExamples: ['fundo das ações igual ao header', 'cor da barra de ações do tema', 'background das ações com surface'], example: '"var(--md-sys-color-surface-container)"' },
|
|
62027
|
+
{ path: 'toolbar.appearance.preset', category: 'toolbar', valueKind: 'string', description: 'Preset visual publico registrado para a toolbar. Use "table-integrated" para compor toolbar e tabela como um unico bloco operacional, sem CSS de host mirando classes internas.', intentExamples: ['toolbar integrada à tabela', 'colar barra de filtros na tabela', 'um bloco visual para toolbar e grid'], example: '"table-integrated"', safetyNotes: 'Preset governa somente aparência; ações CRUD continuam materializadas por HATEOAS/capabilities e surface.open.' },
|
|
61510
62028
|
{ path: 'toolbar.appearance.variant', category: 'toolbar', valueKind: 'enum', allowedValues: ENUMS.toolbarAppearanceVariant, description: 'Variante visual canônica da toolbar.', intentExamples: ['toolbar elevada', 'toolbar integrada', 'barra sem borda'], example: '"outlined"' },
|
|
61511
62029
|
{ path: 'toolbar.appearance.density', category: 'toolbar', valueKind: 'enum', allowedValues: ENUMS.toolbarAppearanceDensity, description: 'Densidade visual da toolbar e de seus botões.', intentExamples: ['toolbar compacta', 'ações mais espaçosas'], example: '"compact"' },
|
|
61512
62030
|
{ path: 'toolbar.appearance.shape', category: 'toolbar', valueKind: 'enum', allowedValues: ENUMS.toolbarAppearanceShape, description: 'Forma canônica do container e dos botões da toolbar.', intentExamples: ['barra em pílula', 'botões menos arredondados'], example: '"rounded"' },
|
|
@@ -64066,4 +64584,4 @@ function isSupportedJsonLogicComputedOperator(operator) {
|
|
|
64066
64584
|
* Generated bundle index. Do not edit.
|
|
64067
64585
|
*/
|
|
64068
64586
|
|
|
64069
|
-
export {
|
|
64587
|
+
export { getActionId as $, AnalyticsTableConfigAdapterService as A, BOOLEAN_PRESETS as B, CURRENCY_PRESETS as C, DATE_PRESETS as D, TABLE_COMPONENT_EDIT_PLAN_JSON_SCHEMA as E, FORMULA_TEMPLATES as F, TABLE_COMPONENT_EDIT_PLAN_KIND as G, TABLE_COMPONENT_EDIT_PLAN_OPERATION_IDS as H, TABLE_COMPONENT_EDIT_PLAN_VERSION as I, JsonConfigEditorComponent as J, TASK_PRESETS as K, TableDefaultsProvider as L, MessagesLocalizationEditorComponent as M, NUMBER_PRESETS as N, TableRulesEditorComponent as O, PERCENTAGE_PRESETS as P, ToolbarActionsEditorComponent as Q, VisualFormulaBuilderComponent as R, STRING_PRESETS as S, TABLE_AI_CAPABILITIES as T, buildTableApplyPlan as U, ValueMappingEditorComponent as V, coerceTableComponentEditPlan as W, coerceTableComponentEditPlans as X, compileTableComponentEditPlan as Y, compileTableComponentEditPlans as Z, createTableAuthoringDocument as _, AnalyticsTableContractService as a, getEnum as a0, getTableCapabilities as a1, getTableComponentEditPlanCapabilities as a2, isTableRendererSupportedByRichContentP0 as a3, mapTableRendererToRichContentP0 as a4, normalizeTableAuthoringDocument as a5, parseLegacyOrTableDocument as a6, providePraxisFilterMetadata as a7, providePraxisTableMetadata as a8, providePraxisTableToolbarAppearance as a9, serializeTableAuthoringDocument as aa, toCanonicalTableConfig as ab, validateTableAuthoringDocument as ac, AnalyticsTableStatsApiService as b, BehaviorConfigEditorComponent as c, ColumnsConfigEditorComponent as d, DataFormatterComponent as e, DataFormattingService as f, FilterConfigService as g, FilterSettingsComponent as h, FormulaGeneratorService as i, PRAXIS_FILTER_COMPONENT_METADATA as j, PRAXIS_TABLE_AUTHORING_MANIFEST as k, PRAXIS_TABLE_COMPONENT_METADATA as l, PRAXIS_TABLE_TOOLBAR_APPEARANCE_PRESETS as m, PRAXIS_TABLE_TOOLBAR_DEFAULT_APPEARANCE as n, PRAXIS_TABLE_TOOLBAR_TOKEN_PRESETS as o, PraxisFilter as p, PraxisFilterWidgetConfigEditor as q, PraxisTable as r, PraxisTableConfigEditor as s, PraxisTableInlineAuthoringEditorComponent as t, PraxisTableToolbar as u, PraxisTableWidgetConfigEditor as v, TABLE_COMPONENT_AI_CAPABILITIES as w, TABLE_COMPONENT_EDIT_PLAN_ALLOWED_CHANGE_KINDS as x, TABLE_COMPONENT_EDIT_PLAN_BATCH_KIND as y, TABLE_COMPONENT_EDIT_PLAN_EXPECTED_PATHS as z };
|