@praxisui/table 9.0.4-rc.2 → 9.0.4-rc.21
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 -1
- package/ai/component-registry.json +44 -8
- package/fesm2022/{praxisui-table-praxisui-table-D2KDWKwk.mjs → praxisui-table-praxisui-table-CMgJAkPF.mjs} +516 -64
- package/fesm2022/{praxisui-table-table-agentic-authoring-turn-flow-CnaGUWDc.mjs → praxisui-table-table-agentic-authoring-turn-flow-DLYUywGS.mjs} +1 -1
- package/fesm2022/{praxisui-table-table-ai.adapter-BR1_LnWy.mjs → praxisui-table-table-ai.adapter-CirqFPPM.mjs} +1 -1
- package/fesm2022/praxisui-table.mjs +1 -1
- package/package.json +10 -10
- package/types/praxisui-table.d.ts +33 -0
|
@@ -34,9 +34,9 @@ import { FormsModule, ReactiveFormsModule, Validators, FormGroup, FormControl }
|
|
|
34
34
|
import { SelectionModel } from '@angular/cdk/collections';
|
|
35
35
|
import * as i13 from '@angular/cdk/drag-drop';
|
|
36
36
|
import { moveItemInArray, DragDropModule } from '@angular/cdk/drag-drop';
|
|
37
|
-
import { Subject, debounceTime, takeUntil, firstValueFrom, of, BehaviorSubject, Subscription
|
|
37
|
+
import { take, Subject, debounceTime, takeUntil, firstValueFrom, of, BehaviorSubject, Subscription } from 'rxjs';
|
|
38
38
|
import * as i1 from '@praxisui/core';
|
|
39
|
-
import { LoggerService, createCorporateLoggerConfig, ConsoleLoggerSink, PraxisJsonLogicService, PraxisIconDirective, PraxisIconButtonComponent, PraxisI18nService, getPraxisTableCellVisualizationGuidance, getPraxisTableCellVisualizationConstraint, isTableConfigV2, normalizePraxisPresentationVisualization, renderPraxisPresentationVisualizationHtml, 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, PRAXIS_TABLE_DETAIL_RESOURCE_RESOLVER, PraxisCollectionExportService, SchemaNormalizerService, translateResourceAvailabilityReason, ResourceDiscoveryService, ResourceSurfaceOpenAdapterService, CrudOperationResolutionService, ResourceQuickConnectComponent, assertPraxisCollectionExportArtifact, PRAXIS_LOADING_CTX, resolveColumnTypeFromFieldDefinition, isPraxisPresentationVisualizationTableSafe, resolveTextMaskFormatFromFieldDefinition, translateResourceDiscoveryText, supportsImplicitValuePresentation, resolveValuePresentation, resolveResourceIdentityContract, materializeResourceIdentity, translateUnavailableWorkflowMessage, CONNECTION_STORAGE, PRAXIS_LOADING_RENDERER, EmptyStateCardComponent, RESOURCE_DISCOVERY_I18N_CONFIG } from '@praxisui/core';
|
|
39
|
+
import { LoggerService, createCorporateLoggerConfig, ConsoleLoggerSink, PraxisJsonLogicService, PraxisIconDirective, PraxisIconButtonComponent, PraxisI18nService, getPraxisTableCellVisualizationGuidance, getPraxisTableCellVisualizationConstraint, isTableConfigV2, normalizePraxisPresentationVisualization, renderPraxisPresentationVisualizationHtml, 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, PRAXIS_TABLE_DETAIL_RESOURCE_RESOLVER, PraxisCollectionExportService, SchemaNormalizerService, translateResourceAvailabilityReason, ResourceDiscoveryService, ResourceSurfaceOpenAdapterService, ResourceActionOpenAdapterService, CrudOperationResolutionService, ResourceQuickConnectComponent, assertPraxisCollectionExportArtifact, PRAXIS_LOADING_CTX, resolveColumnTypeFromFieldDefinition, isPraxisPresentationVisualizationTableSafe, resolveTextMaskFormatFromFieldDefinition, translateResourceDiscoveryText, supportsImplicitValuePresentation, resolveValuePresentation, resolveResourceIdentityContract, materializeResourceIdentity, 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';
|
|
@@ -67,7 +67,7 @@ import * as i10 from '@angular/material/chips';
|
|
|
67
67
|
import { MatChipsModule } from '@angular/material/chips';
|
|
68
68
|
import * as i1$2 from '@angular/material/dialog';
|
|
69
69
|
import { MatDialogModule } from '@angular/material/dialog';
|
|
70
|
-
import { distinctUntilChanged, debounceTime as debounceTime$1, take, map, startWith, takeUntil as takeUntil$1 } from 'rxjs/operators';
|
|
70
|
+
import { distinctUntilChanged, debounceTime as debounceTime$1, take as take$1, map, startWith, takeUntil as takeUntil$1 } from 'rxjs/operators';
|
|
71
71
|
import * as i15$1 from '@angular/material/datepicker';
|
|
72
72
|
import { MatDatepickerModule } from '@angular/material/datepicker';
|
|
73
73
|
import { MatNativeDateModule } from '@angular/material/core';
|
|
@@ -133,6 +133,9 @@ const PRAXIS_TABLE_RUNTIME_I18N_CONFIG = {
|
|
|
133
133
|
'table.chrome.actions.disabled.maxSelection': 'A seleção atual excede o limite permitido para esta ação.',
|
|
134
134
|
'table.chrome.actions.disabled.singleSelection': 'Selecione somente um registro para executar esta ação.',
|
|
135
135
|
'table.chrome.actions.disabled.generic': 'Ação indisponível no contexto atual.',
|
|
136
|
+
'table.chrome.actions.workflow.failed': 'Não foi possível concluir a ação.',
|
|
137
|
+
'table.chrome.actions.workflow.partialFailure': '{count} item(ns) exigem revisão.',
|
|
138
|
+
'table.chrome.actions.workflow.contractInvalid': 'A ação não pode ser executada porque seu contrato está incompleto.',
|
|
136
139
|
'table.analytics.comparison.current': 'Atual',
|
|
137
140
|
'table.analytics.comparison.previous': 'Anterior',
|
|
138
141
|
'table.analytics.comparison.delta': 'Variação',
|
|
@@ -281,6 +284,9 @@ const PRAXIS_TABLE_RUNTIME_I18N_CONFIG = {
|
|
|
281
284
|
'table.chrome.actions.disabled.maxSelection': 'The current selection exceeds the allowed limit for this action.',
|
|
282
285
|
'table.chrome.actions.disabled.singleSelection': 'Select exactly one record to run this action.',
|
|
283
286
|
'table.chrome.actions.disabled.generic': 'Action unavailable in the current context.',
|
|
287
|
+
'table.chrome.actions.workflow.failed': 'The action could not be completed.',
|
|
288
|
+
'table.chrome.actions.workflow.partialFailure': '{count} item(s) require review.',
|
|
289
|
+
'table.chrome.actions.workflow.contractInvalid': 'The action cannot run because its contract is incomplete.',
|
|
284
290
|
'table.analytics.comparison.current': 'Current',
|
|
285
291
|
'table.analytics.comparison.previous': 'Previous',
|
|
286
292
|
'table.analytics.comparison.delta': 'Change',
|
|
@@ -424,12 +430,12 @@ function translateTableRuntimeText(i18n, key, fallback, params, locale) {
|
|
|
424
430
|
if (explicitLocale) {
|
|
425
431
|
return interpolateTableRuntimeText(runtimeFallback, params);
|
|
426
432
|
}
|
|
427
|
-
return i18n?.t(key, params, runtimeFallback, PRAXIS_TABLE_RUNTIME_I18N_NAMESPACE) || runtimeFallback;
|
|
433
|
+
return i18n?.t(key, params, runtimeFallback, PRAXIS_TABLE_RUNTIME_I18N_NAMESPACE) || interpolateTableRuntimeText(runtimeFallback, params);
|
|
428
434
|
}
|
|
429
435
|
function interpolateTableRuntimeText(template, params) {
|
|
430
436
|
if (!params)
|
|
431
437
|
return template;
|
|
432
|
-
return Object.entries(params).reduce((current, [key, value]) => current.
|
|
438
|
+
return Object.entries(params).reduce((current, [key, value]) => current.split(`{${key}}`).join(String(value ?? '')), template);
|
|
433
439
|
}
|
|
434
440
|
|
|
435
441
|
function normalize(str) {
|
|
@@ -604,6 +610,7 @@ class PraxisTableToolbar {
|
|
|
604
610
|
i18n;
|
|
605
611
|
defaultAppearance;
|
|
606
612
|
tokenPresets;
|
|
613
|
+
activeOverflowMenuTrigger;
|
|
607
614
|
config;
|
|
608
615
|
appearance = null;
|
|
609
616
|
backgroundColor = null;
|
|
@@ -952,7 +959,6 @@ class PraxisTableToolbar {
|
|
|
952
959
|
emitToolbarAction(event, action, actionConfig) {
|
|
953
960
|
if (this.isActionDisabled(actionConfig))
|
|
954
961
|
return;
|
|
955
|
-
event.target?.blur?.();
|
|
956
962
|
this.toolbarAction.emit({
|
|
957
963
|
action,
|
|
958
964
|
...(actionConfig !== undefined
|
|
@@ -960,6 +966,20 @@ class PraxisTableToolbar {
|
|
|
960
966
|
: {}),
|
|
961
967
|
});
|
|
962
968
|
}
|
|
969
|
+
emitOverflowToolbarAction(event, action, actionConfig) {
|
|
970
|
+
event.stopPropagation();
|
|
971
|
+
const menuTrigger = this.activeOverflowMenuTrigger;
|
|
972
|
+
if (!menuTrigger) {
|
|
973
|
+
this.emitToolbarAction(event, action, actionConfig);
|
|
974
|
+
return;
|
|
975
|
+
}
|
|
976
|
+
menuTrigger.menuClosed.pipe(take(1)).subscribe(() => {
|
|
977
|
+
menuTrigger.focus('program');
|
|
978
|
+
this.activeOverflowMenuTrigger = undefined;
|
|
979
|
+
this.emitToolbarAction(event, action, actionConfig);
|
|
980
|
+
});
|
|
981
|
+
menuTrigger.closeMenu();
|
|
982
|
+
}
|
|
963
983
|
getStartActions() {
|
|
964
984
|
const items = this.getVisibleToolbarActions().filter((action) => action.position === 'start');
|
|
965
985
|
return this.sortActions(items);
|
|
@@ -2045,10 +2065,12 @@ class PraxisTableToolbar {
|
|
|
2045
2065
|
<div class="mobile-actions">
|
|
2046
2066
|
@if (getOverflowActions().length) {
|
|
2047
2067
|
<button
|
|
2068
|
+
#overflowMenuTrigger="matMenuTrigger"
|
|
2048
2069
|
praxisIconButton="more_vert"
|
|
2049
2070
|
size="compact"
|
|
2050
2071
|
class="overflow-trigger"
|
|
2051
2072
|
[matMenuTriggerFor]="overflowMenu"
|
|
2073
|
+
(menuOpened)="activeOverflowMenuTrigger = overflowMenuTrigger"
|
|
2052
2074
|
[attr.aria-label]="getMoreActionsLabel()"
|
|
2053
2075
|
[matTooltip]="getMoreActionsLabel()"
|
|
2054
2076
|
matTooltipPosition="below"
|
|
@@ -2060,7 +2082,7 @@ class PraxisTableToolbar {
|
|
|
2060
2082
|
mat-menu-item
|
|
2061
2083
|
[disabled]="isActionDisabled(action)"
|
|
2062
2084
|
[matTooltip]="getActionTooltip(action)"
|
|
2063
|
-
(click)="
|
|
2085
|
+
(click)="emitOverflowToolbarAction($event, getActionId(action), action)"
|
|
2064
2086
|
>
|
|
2065
2087
|
@if (action.icon) { <mat-icon [praxisIcon]="action.icon"></mat-icon> }
|
|
2066
2088
|
{{ action.label }}
|
|
@@ -2629,10 +2651,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
2629
2651
|
<div class="mobile-actions">
|
|
2630
2652
|
@if (getOverflowActions().length) {
|
|
2631
2653
|
<button
|
|
2654
|
+
#overflowMenuTrigger="matMenuTrigger"
|
|
2632
2655
|
praxisIconButton="more_vert"
|
|
2633
2656
|
size="compact"
|
|
2634
2657
|
class="overflow-trigger"
|
|
2635
2658
|
[matMenuTriggerFor]="overflowMenu"
|
|
2659
|
+
(menuOpened)="activeOverflowMenuTrigger = overflowMenuTrigger"
|
|
2636
2660
|
[attr.aria-label]="getMoreActionsLabel()"
|
|
2637
2661
|
[matTooltip]="getMoreActionsLabel()"
|
|
2638
2662
|
matTooltipPosition="below"
|
|
@@ -2644,7 +2668,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
2644
2668
|
mat-menu-item
|
|
2645
2669
|
[disabled]="isActionDisabled(action)"
|
|
2646
2670
|
[matTooltip]="getActionTooltip(action)"
|
|
2647
|
-
(click)="
|
|
2671
|
+
(click)="emitOverflowToolbarAction($event, getActionId(action), action)"
|
|
2648
2672
|
>
|
|
2649
2673
|
@if (action.icon) { <mat-icon [praxisIcon]="action.icon"></mat-icon> }
|
|
2650
2674
|
{{ action.label }}
|
|
@@ -27515,7 +27539,7 @@ class FilterSettingsComponent {
|
|
|
27515
27539
|
return;
|
|
27516
27540
|
try {
|
|
27517
27541
|
this.filterConfigService.clear(key);
|
|
27518
|
-
this.storage.clearConfig(`filter-dto:${key}`).pipe(take(1)).subscribe();
|
|
27542
|
+
this.storage.clearConfig(`filter-dto:${key}`).pipe(take$1(1)).subscribe();
|
|
27519
27543
|
void this.clearPersistedSchemaStateByConfigKey(key);
|
|
27520
27544
|
this.reset(); // Reset form to initial/default values
|
|
27521
27545
|
this.form.markAsPristine();
|
|
@@ -27635,38 +27659,38 @@ class FilterSettingsComponent {
|
|
|
27635
27659
|
async clearPersistedSchemaStateByConfigKey(configKey) {
|
|
27636
27660
|
const scopeKey = this.schemaMetaScopeKey(configKey);
|
|
27637
27661
|
const indexKey = this.schemaMetaIndexKey(configKey);
|
|
27638
|
-
const schemaIds = await firstValueFrom(this.storage.loadConfig(indexKey).pipe(take(1)))
|
|
27662
|
+
const schemaIds = await firstValueFrom(this.storage.loadConfig(indexKey).pipe(take$1(1)))
|
|
27639
27663
|
.then((raw) => Array.from(new Set((Array.isArray(raw) ? raw : [])
|
|
27640
27664
|
.map((item) => String(item || '').trim())
|
|
27641
27665
|
.filter((item) => !!item))))
|
|
27642
27666
|
.catch(() => []);
|
|
27643
27667
|
const hashes = new Set();
|
|
27644
|
-
const legacyMeta = await firstValueFrom(this.storage.loadConfig(scopeKey).pipe(take(1))).catch(() => null);
|
|
27668
|
+
const legacyMeta = await firstValueFrom(this.storage.loadConfig(scopeKey).pipe(take$1(1))).catch(() => null);
|
|
27645
27669
|
const legacyHash = String(legacyMeta?.serverHash || '').trim();
|
|
27646
27670
|
if (legacyHash)
|
|
27647
27671
|
hashes.add(legacyHash);
|
|
27648
27672
|
for (const schemaId of schemaIds) {
|
|
27649
27673
|
const key = this.schemaMetaKeyForSchemaId(configKey, schemaId);
|
|
27650
|
-
const meta = await firstValueFrom(this.storage.loadConfig(key).pipe(take(1))).catch(() => null);
|
|
27674
|
+
const meta = await firstValueFrom(this.storage.loadConfig(key).pipe(take$1(1))).catch(() => null);
|
|
27651
27675
|
const hash = String(meta?.serverHash || '').trim();
|
|
27652
27676
|
if (hash)
|
|
27653
27677
|
hashes.add(hash);
|
|
27654
|
-
this.storage.clearConfig(key).pipe(take(1)).subscribe();
|
|
27678
|
+
this.storage.clearConfig(key).pipe(take$1(1)).subscribe();
|
|
27655
27679
|
}
|
|
27656
|
-
this.storage.clearConfig(indexKey).pipe(take(1)).subscribe();
|
|
27657
|
-
this.storage.clearConfig(scopeKey).pipe(take(1)).subscribe();
|
|
27680
|
+
this.storage.clearConfig(indexKey).pipe(take$1(1)).subscribe();
|
|
27681
|
+
this.storage.clearConfig(scopeKey).pipe(take$1(1)).subscribe();
|
|
27658
27682
|
hashes.forEach((hash) => {
|
|
27659
27683
|
this.storage
|
|
27660
27684
|
.clearConfig(this.filterSchemaIgnoreKey(configKey, hash))
|
|
27661
|
-
.pipe(take(1))
|
|
27685
|
+
.pipe(take$1(1))
|
|
27662
27686
|
.subscribe();
|
|
27663
27687
|
this.storage
|
|
27664
27688
|
.clearConfig(this.filterSchemaSnoozeKey(configKey, hash))
|
|
27665
|
-
.pipe(take(1))
|
|
27689
|
+
.pipe(take$1(1))
|
|
27666
27690
|
.subscribe();
|
|
27667
27691
|
this.storage
|
|
27668
27692
|
.clearConfig(this.filterSchemaNotifiedKey(configKey, hash))
|
|
27669
|
-
.pipe(take(1))
|
|
27693
|
+
.pipe(take$1(1))
|
|
27670
27694
|
.subscribe();
|
|
27671
27695
|
});
|
|
27672
27696
|
}
|
|
@@ -27695,7 +27719,7 @@ class FilterSettingsComponent {
|
|
|
27695
27719
|
const key = this.tagsKey();
|
|
27696
27720
|
if (!key)
|
|
27697
27721
|
return;
|
|
27698
|
-
this.storage.saveConfig(key, this.tags).pipe(take(1)).subscribe();
|
|
27722
|
+
this.storage.saveConfig(key, this.tags).pipe(take$1(1)).subscribe();
|
|
27699
27723
|
this.exportJson = JSON.stringify(this.tags, null, 2);
|
|
27700
27724
|
this.tagsLoaded = true;
|
|
27701
27725
|
}
|
|
@@ -29131,7 +29155,7 @@ class FilterSettingsComponent {
|
|
|
29131
29155
|
const dtoKey = this.configKey ? `filter-dto:${this.configKey}` : null;
|
|
29132
29156
|
try {
|
|
29133
29157
|
if (dtoKey)
|
|
29134
|
-
this.storage.clearConfig(dtoKey).pipe(take(1)).subscribe();
|
|
29158
|
+
this.storage.clearConfig(dtoKey).pipe(take$1(1)).subscribe();
|
|
29135
29159
|
this.snackBar.open('Filtros salvos limpos', undefined, { duration: 2000 });
|
|
29136
29160
|
}
|
|
29137
29161
|
catch {
|
|
@@ -29622,13 +29646,13 @@ class CrudIntegrationEditorComponent {
|
|
|
29622
29646
|
route: actionValue.route || undefined,
|
|
29623
29647
|
};
|
|
29624
29648
|
}
|
|
29625
|
-
this.storage.saveConfig(key, { defaults, actions }).pipe(take(1)).subscribe();
|
|
29649
|
+
this.storage.saveConfig(key, { defaults, actions }).pipe(take$1(1)).subscribe();
|
|
29626
29650
|
}
|
|
29627
29651
|
resetAllOverrides() {
|
|
29628
29652
|
const key = this.getStorageKey();
|
|
29629
29653
|
if (key) {
|
|
29630
29654
|
try {
|
|
29631
|
-
this.storage.clearConfig(key).pipe(take(1)).subscribe();
|
|
29655
|
+
this.storage.clearConfig(key).pipe(take$1(1)).subscribe();
|
|
29632
29656
|
}
|
|
29633
29657
|
catch { }
|
|
29634
29658
|
}
|
|
@@ -36991,13 +37015,13 @@ class PraxisFilter {
|
|
|
36991
37015
|
overlayBackdrop: cfg.overlayBackdrop,
|
|
36992
37016
|
};
|
|
36993
37017
|
};
|
|
36994
|
-
ref.applied$.pipe(take(1)).subscribe((cfg) => {
|
|
37018
|
+
ref.applied$.pipe(take$1(1)).subscribe((cfg) => {
|
|
36995
37019
|
const safe = validateConfig(cfg);
|
|
36996
37020
|
applyChanges(safe);
|
|
36997
37021
|
persistConfig(safe, 'Configurações aplicadas');
|
|
36998
37022
|
ref.close('save');
|
|
36999
37023
|
});
|
|
37000
|
-
ref.saved$.pipe(take(1)).subscribe((cfg) => {
|
|
37024
|
+
ref.saved$.pipe(take$1(1)).subscribe((cfg) => {
|
|
37001
37025
|
const safe = validateConfig(cfg);
|
|
37002
37026
|
applyChanges(safe);
|
|
37003
37027
|
persistConfig(safe, 'Configurações salvas');
|
|
@@ -37055,7 +37079,7 @@ class PraxisFilter {
|
|
|
37055
37079
|
if (this.confirmTagDelete) {
|
|
37056
37080
|
try {
|
|
37057
37081
|
const ref = this.snackBar.open(this.i18nLabels.shortcutRemoved, this.i18nLabels.undo, { duration: 4000 });
|
|
37058
|
-
ref.onAction().pipe(take(1)).subscribe(() => {
|
|
37082
|
+
ref.onAction().pipe(take$1(1)).subscribe(() => {
|
|
37059
37083
|
const reinsertIndex = Math.min(index, this.savedTags.length);
|
|
37060
37084
|
this.savedTags.splice(reinsertIndex, 0, removed);
|
|
37061
37085
|
this.persistTags();
|
|
@@ -37234,7 +37258,7 @@ class PraxisFilter {
|
|
|
37234
37258
|
this.schemaMetaIndexLoadPromise = undefined;
|
|
37235
37259
|
}
|
|
37236
37260
|
try {
|
|
37237
|
-
this.configStorage.clearConfig(key).pipe(take(1)).subscribe();
|
|
37261
|
+
this.configStorage.clearConfig(key).pipe(take$1(1)).subscribe();
|
|
37238
37262
|
}
|
|
37239
37263
|
catch {
|
|
37240
37264
|
// ignore storage clear failures
|
|
@@ -37285,7 +37309,7 @@ class PraxisFilter {
|
|
|
37285
37309
|
return;
|
|
37286
37310
|
}
|
|
37287
37311
|
this.storedSchemaMetaCache.set(key, next);
|
|
37288
|
-
this.configStorage.saveConfig(key, next).pipe(take(1)).subscribe();
|
|
37312
|
+
this.configStorage.saveConfig(key, next).pipe(take$1(1)).subscribe();
|
|
37289
37313
|
if (schemaId)
|
|
37290
37314
|
this.rememberSchemaMetaContext(schemaId);
|
|
37291
37315
|
}
|
|
@@ -37535,6 +37559,7 @@ class PraxisFilter {
|
|
|
37535
37559
|
return undefined;
|
|
37536
37560
|
}
|
|
37537
37561
|
})())) {
|
|
37562
|
+
this.restartSchemaLoadForCurrentContext(requestVersion);
|
|
37538
37563
|
return;
|
|
37539
37564
|
}
|
|
37540
37565
|
if (this.schemaError)
|
|
@@ -37552,6 +37577,7 @@ class PraxisFilter {
|
|
|
37552
37577
|
return undefined;
|
|
37553
37578
|
}
|
|
37554
37579
|
})())) {
|
|
37580
|
+
this.restartSchemaLoadForCurrentContext(requestVersion);
|
|
37555
37581
|
return;
|
|
37556
37582
|
}
|
|
37557
37583
|
this.setSchemaLoading(false);
|
|
@@ -37579,6 +37605,7 @@ class PraxisFilter {
|
|
|
37579
37605
|
return undefined;
|
|
37580
37606
|
}
|
|
37581
37607
|
})())) {
|
|
37608
|
+
this.restartSchemaLoadForCurrentContext(requestVersion);
|
|
37582
37609
|
return;
|
|
37583
37610
|
}
|
|
37584
37611
|
this.setSchemaLoading(false);
|
|
@@ -37587,6 +37614,21 @@ class PraxisFilter {
|
|
|
37587
37614
|
});
|
|
37588
37615
|
});
|
|
37589
37616
|
}
|
|
37617
|
+
/**
|
|
37618
|
+
* A Dynamic Page may finish binding resource identity while an earlier schema
|
|
37619
|
+
* request is still in flight. Discarding that response must also release the
|
|
37620
|
+
* loading state and start a request for the effective context; otherwise the
|
|
37621
|
+
* advanced-filter affordance remains permanently busy.
|
|
37622
|
+
*/
|
|
37623
|
+
restartSchemaLoadForCurrentContext(requestVersion) {
|
|
37624
|
+
if (requestVersion !== this.schemaLoadVersion)
|
|
37625
|
+
return;
|
|
37626
|
+
this.setSchemaLoading(false);
|
|
37627
|
+
this.schemaMetas = undefined;
|
|
37628
|
+
this.advancedConfig = undefined;
|
|
37629
|
+
this.advancedForm = undefined;
|
|
37630
|
+
this.loadSchema();
|
|
37631
|
+
}
|
|
37590
37632
|
retrySchemaLoad() {
|
|
37591
37633
|
if (this.usesProvidedFieldMetadata()) {
|
|
37592
37634
|
this.applyProvidedFieldMetadata();
|
|
@@ -39178,10 +39220,10 @@ class PraxisFilter {
|
|
|
39178
39220
|
return;
|
|
39179
39221
|
try {
|
|
39180
39222
|
if (!until) {
|
|
39181
|
-
this.configStorage.clearConfig(key).pipe(take(1)).subscribe();
|
|
39223
|
+
this.configStorage.clearConfig(key).pipe(take$1(1)).subscribe();
|
|
39182
39224
|
}
|
|
39183
39225
|
else {
|
|
39184
|
-
this.configStorage.saveConfig(key, until.toISOString()).pipe(take(1)).subscribe();
|
|
39226
|
+
this.configStorage.saveConfig(key, until.toISOString()).pipe(take$1(1)).subscribe();
|
|
39185
39227
|
}
|
|
39186
39228
|
}
|
|
39187
39229
|
catch { }
|
|
@@ -39194,9 +39236,9 @@ class PraxisFilter {
|
|
|
39194
39236
|
return;
|
|
39195
39237
|
try {
|
|
39196
39238
|
if (!val)
|
|
39197
|
-
this.configStorage.clearConfig(key).pipe(take(1)).subscribe();
|
|
39239
|
+
this.configStorage.clearConfig(key).pipe(take$1(1)).subscribe();
|
|
39198
39240
|
else
|
|
39199
|
-
this.configStorage.saveConfig(key, true).pipe(take(1)).subscribe();
|
|
39241
|
+
this.configStorage.saveConfig(key, true).pipe(take$1(1)).subscribe();
|
|
39200
39242
|
}
|
|
39201
39243
|
catch { }
|
|
39202
39244
|
}
|
|
@@ -39207,7 +39249,7 @@ class PraxisFilter {
|
|
|
39207
39249
|
if (!key)
|
|
39208
39250
|
return;
|
|
39209
39251
|
try {
|
|
39210
|
-
this.configStorage.saveConfig(key, true).pipe(take(1)).subscribe();
|
|
39252
|
+
this.configStorage.saveConfig(key, true).pipe(take$1(1)).subscribe();
|
|
39211
39253
|
}
|
|
39212
39254
|
catch { }
|
|
39213
39255
|
}
|
|
@@ -39747,20 +39789,20 @@ class PraxisFilter {
|
|
|
39747
39789
|
persist() {
|
|
39748
39790
|
const key = this.filterDtoKey();
|
|
39749
39791
|
if (key) {
|
|
39750
|
-
this.configStorage.saveConfig(key, this.dto).pipe(take(1)).subscribe();
|
|
39792
|
+
this.configStorage.saveConfig(key, this.dto).pipe(take$1(1)).subscribe();
|
|
39751
39793
|
}
|
|
39752
39794
|
}
|
|
39753
39795
|
clearPersisted() {
|
|
39754
39796
|
const key = this.filterDtoKey();
|
|
39755
39797
|
if (key) {
|
|
39756
|
-
this.configStorage.clearConfig(key).pipe(take(1)).subscribe();
|
|
39798
|
+
this.configStorage.clearConfig(key).pipe(take$1(1)).subscribe();
|
|
39757
39799
|
}
|
|
39758
39800
|
}
|
|
39759
39801
|
persistTags() {
|
|
39760
39802
|
if (this.allowSaveTags) {
|
|
39761
39803
|
const key = this.filterTagsKey();
|
|
39762
39804
|
if (key) {
|
|
39763
|
-
this.configStorage.saveConfig(key, this.savedTags).pipe(take(1)).subscribe();
|
|
39805
|
+
this.configStorage.saveConfig(key, this.savedTags).pipe(take$1(1)).subscribe();
|
|
39764
39806
|
}
|
|
39765
39807
|
}
|
|
39766
39808
|
}
|
|
@@ -41390,6 +41432,8 @@ class PraxisTable {
|
|
|
41390
41432
|
route;
|
|
41391
41433
|
logger;
|
|
41392
41434
|
analyticsStatsApi;
|
|
41435
|
+
activeRowOverflowMenuTrigger;
|
|
41436
|
+
openingRowActions = new WeakMap();
|
|
41393
41437
|
static CELL_ANIMATION_CHANGE_CACHE_LIMIT = 4000;
|
|
41394
41438
|
static AI_SELECTION_ROW_LIMIT = 5;
|
|
41395
41439
|
static AI_SELECTION_ID_LIMIT = 20;
|
|
@@ -41399,6 +41443,7 @@ class PraxisTable {
|
|
|
41399
41443
|
static ROW_DISCOVERY_CACHE_LIMIT = 500;
|
|
41400
41444
|
static ROW_DISCOVERY_MAX_CONCURRENT_REQUESTS = 2;
|
|
41401
41445
|
_resourceDiscovery;
|
|
41446
|
+
_resourceActionOpenAdapter;
|
|
41402
41447
|
_resourceSurfaceOpenAdapter;
|
|
41403
41448
|
_crudOperationResolver;
|
|
41404
41449
|
runtimeObservationRegistry = inject(PraxisRuntimeComponentObservationRegistryService, { optional: true });
|
|
@@ -41590,6 +41635,16 @@ class PraxisTable {
|
|
|
41590
41635
|
hasTopToolbarStack() {
|
|
41591
41636
|
return this.showToolbar && this.shouldShowToolbarTopPlacement();
|
|
41592
41637
|
}
|
|
41638
|
+
hasBottomTableStack() {
|
|
41639
|
+
if (this.shouldRenderFooterToolbar()) {
|
|
41640
|
+
return true;
|
|
41641
|
+
}
|
|
41642
|
+
if (!this.getPaginationEnabled()) {
|
|
41643
|
+
return false;
|
|
41644
|
+
}
|
|
41645
|
+
const position = this.config?.behavior?.pagination?.position;
|
|
41646
|
+
return position === 'bottom' || position === 'both' || !position;
|
|
41647
|
+
}
|
|
41593
41648
|
shouldShowFooterToolbarMain() {
|
|
41594
41649
|
return this.shouldShowToolbarBottomPlacement();
|
|
41595
41650
|
}
|
|
@@ -42130,6 +42185,15 @@ class PraxisTable {
|
|
|
42130
42185
|
}
|
|
42131
42186
|
return `filter:${tableKey}:remote`;
|
|
42132
42187
|
}
|
|
42188
|
+
getAdvancedFilterFormId() {
|
|
42189
|
+
const tableKey = (this.tableId || 'table').trim() || 'table';
|
|
42190
|
+
return `${tableKey}:advanced-filter`;
|
|
42191
|
+
}
|
|
42192
|
+
getAdvancedFilterOpenMode() {
|
|
42193
|
+
return this.config?.behavior?.filtering?.advancedFilters?.settings?.advancedOpenMode === 'drawer'
|
|
42194
|
+
? 'drawer'
|
|
42195
|
+
: 'modal';
|
|
42196
|
+
}
|
|
42133
42197
|
getAdvancedFilterAlwaysVisibleFields() {
|
|
42134
42198
|
const configured = this.config?.behavior?.filtering?.advancedFilters?.settings?.alwaysVisibleFields;
|
|
42135
42199
|
const runtimePromoted = this.getRuntimePromotedAdvancedFilterFields();
|
|
@@ -42334,7 +42398,7 @@ class PraxisTable {
|
|
|
42334
42398
|
return;
|
|
42335
42399
|
}
|
|
42336
42400
|
try {
|
|
42337
|
-
const fields = await firstValueFrom(this.crudService.getFilterSchema({ cache: true }).pipe(take
|
|
42401
|
+
const fields = await firstValueFrom(this.crudService.getFilterSchema({ cache: true }).pipe(take(1)));
|
|
42338
42402
|
this.setFilterSchemaFieldsSnapshot(fields);
|
|
42339
42403
|
}
|
|
42340
42404
|
catch (error) {
|
|
@@ -42445,7 +42509,7 @@ class PraxisTable {
|
|
|
42445
42509
|
try {
|
|
42446
42510
|
if (href && !hasFreshCapabilitySnapshot) {
|
|
42447
42511
|
const snapshot = await firstValueFrom(this.resourceDiscovery.getCapabilities(rowLinks, this.buildRowDiscoveryOptions())
|
|
42448
|
-
.pipe(take
|
|
42512
|
+
.pipe(take(1)));
|
|
42449
42513
|
this.clearRowCapabilityError(href);
|
|
42450
42514
|
this.rememberRowCapabilitySnapshot(href, snapshot);
|
|
42451
42515
|
if (row && typeof row === 'object') {
|
|
@@ -42467,7 +42531,7 @@ class PraxisTable {
|
|
|
42467
42531
|
}
|
|
42468
42532
|
try {
|
|
42469
42533
|
const catalog = await firstValueFrom(this.resourceDiscovery.getSurfaces(rowLinks, this.buildRowDiscoveryOptions())
|
|
42470
|
-
.pipe(take
|
|
42534
|
+
.pipe(take(1)));
|
|
42471
42535
|
this.clearRowCapabilityError(surfaceHref);
|
|
42472
42536
|
this.rememberRowCapabilitySnapshot(surfaceHref, this.buildCapabilitySnapshotFromSurfaceCatalog(catalog));
|
|
42473
42537
|
if (row && typeof row === 'object') {
|
|
@@ -43194,6 +43258,7 @@ class PraxisTable {
|
|
|
43194
43258
|
if (this.collectionCapabilities) {
|
|
43195
43259
|
this.collectionCapabilities = null;
|
|
43196
43260
|
this.materializeCollectionCreateToolbarAction();
|
|
43261
|
+
this.materializeCollectionWorkflowToolbarActions();
|
|
43197
43262
|
}
|
|
43198
43263
|
return;
|
|
43199
43264
|
}
|
|
@@ -43212,6 +43277,7 @@ class PraxisTable {
|
|
|
43212
43277
|
this.collectionCapabilitiesResolvedHref = capabilitiesHref;
|
|
43213
43278
|
this.collectionCapabilities = snapshot;
|
|
43214
43279
|
this.materializeCollectionCreateToolbarAction();
|
|
43280
|
+
this.materializeCollectionWorkflowToolbarActions();
|
|
43215
43281
|
})
|
|
43216
43282
|
.catch(() => {
|
|
43217
43283
|
if (requestSeq !== this.collectionCapabilitiesRequestSeq) {
|
|
@@ -43223,6 +43289,7 @@ class PraxisTable {
|
|
|
43223
43289
|
this.collectionCapabilitiesResolvedHref = null;
|
|
43224
43290
|
if (hadCapabilities) {
|
|
43225
43291
|
this.materializeCollectionCreateToolbarAction();
|
|
43292
|
+
this.materializeCollectionWorkflowToolbarActions();
|
|
43226
43293
|
}
|
|
43227
43294
|
});
|
|
43228
43295
|
}
|
|
@@ -43287,6 +43354,50 @@ class PraxisTable {
|
|
|
43287
43354
|
this.setShowToolbar(true);
|
|
43288
43355
|
this.cdr.markForCheck();
|
|
43289
43356
|
}
|
|
43357
|
+
materializeCollectionWorkflowToolbarActions() {
|
|
43358
|
+
if (!this.config)
|
|
43359
|
+
return;
|
|
43360
|
+
const discovered = (this.collectionCapabilities?.actions || [])
|
|
43361
|
+
.filter((action) => action.scope === 'COLLECTION')
|
|
43362
|
+
.sort((left, right) => (left.order ?? 0) - (right.order ?? 0));
|
|
43363
|
+
const toolbar = this.ensureToolbarConfigForRuntime();
|
|
43364
|
+
const current = [...(toolbar.actions || [])];
|
|
43365
|
+
const discoveredIds = new Set(discovered.map((action) => this.normalizeActionId(action)));
|
|
43366
|
+
const retained = current.filter((action) => !action.__praxisDiscoveredAction
|
|
43367
|
+
|| discoveredIds.has(this.normalizeActionId(action.__praxisDiscoveredAction)));
|
|
43368
|
+
for (const action of discovered) {
|
|
43369
|
+
const actionId = this.normalizeActionId(action);
|
|
43370
|
+
const index = retained.findIndex((candidate) => this.normalizeActionId(candidate) === actionId);
|
|
43371
|
+
const materialized = {
|
|
43372
|
+
id: action.id,
|
|
43373
|
+
action: action.id,
|
|
43374
|
+
label: action.title || action.id,
|
|
43375
|
+
icon: 'bolt',
|
|
43376
|
+
type: 'button',
|
|
43377
|
+
appearance: action.execution?.interaction.risk === 'CRITICAL' ? 'outlined' : 'filled',
|
|
43378
|
+
color: action.availability?.allowed === false ? 'warn' : 'primary',
|
|
43379
|
+
position: 'start',
|
|
43380
|
+
tooltip: action.description || this.getUnavailableWorkflowMessage(action),
|
|
43381
|
+
disabled: action.availability?.allowed === false,
|
|
43382
|
+
__praxisDiscoveredAction: action,
|
|
43383
|
+
};
|
|
43384
|
+
if (index >= 0) {
|
|
43385
|
+
retained[index] = {
|
|
43386
|
+
...materialized,
|
|
43387
|
+
...retained[index],
|
|
43388
|
+
disabled: materialized.disabled,
|
|
43389
|
+
__praxisDiscoveredAction: action,
|
|
43390
|
+
};
|
|
43391
|
+
}
|
|
43392
|
+
else {
|
|
43393
|
+
retained.push(materialized);
|
|
43394
|
+
}
|
|
43395
|
+
}
|
|
43396
|
+
toolbar.actions = retained;
|
|
43397
|
+
toolbar.visible = toolbar.visible || discovered.length > 0;
|
|
43398
|
+
this.setShowToolbar(this.shouldExposeToolbar());
|
|
43399
|
+
this.cdr.markForCheck();
|
|
43400
|
+
}
|
|
43290
43401
|
ensureToolbarConfigForRuntime() {
|
|
43291
43402
|
if (!this.config.toolbar) {
|
|
43292
43403
|
this.config.toolbar = { visible: true, position: 'top' };
|
|
@@ -43549,6 +43660,9 @@ class PraxisTable {
|
|
|
43549
43660
|
get resourceSurfaceOpenAdapter() {
|
|
43550
43661
|
return this._resourceSurfaceOpenAdapter ??= this.injector.get(ResourceSurfaceOpenAdapterService);
|
|
43551
43662
|
}
|
|
43663
|
+
get resourceActionOpenAdapter() {
|
|
43664
|
+
return this._resourceActionOpenAdapter ??= this.injector.get(ResourceActionOpenAdapterService);
|
|
43665
|
+
}
|
|
43552
43666
|
get crudOperationResolver() {
|
|
43553
43667
|
return this._crudOperationResolver ??= this.injector.get(CrudOperationResolutionService);
|
|
43554
43668
|
}
|
|
@@ -43559,7 +43673,7 @@ class PraxisTable {
|
|
|
43559
43673
|
if (this.aiAdapter || this.aiAdapterLoadStarted)
|
|
43560
43674
|
return;
|
|
43561
43675
|
this.aiAdapterLoadStarted = true;
|
|
43562
|
-
import('./praxisui-table-table-ai.adapter-
|
|
43676
|
+
import('./praxisui-table-table-ai.adapter-CirqFPPM.mjs')
|
|
43563
43677
|
.then(({ TableAiAdapter }) => {
|
|
43564
43678
|
if (!this.isAiAssistantEnabled()) {
|
|
43565
43679
|
this.aiAssistantOpenAfterAdapterLoad = false;
|
|
@@ -44305,7 +44419,7 @@ class PraxisTable {
|
|
|
44305
44419
|
initializeAiAssistantController() {
|
|
44306
44420
|
if (!this.aiAdapter || this.aiAssistantController)
|
|
44307
44421
|
return;
|
|
44308
|
-
import('./praxisui-table-table-agentic-authoring-turn-flow-
|
|
44422
|
+
import('./praxisui-table-table-agentic-authoring-turn-flow-DLYUywGS.mjs')
|
|
44309
44423
|
.then(({ TableAgenticAuthoringTurnFlow }) => {
|
|
44310
44424
|
if (this.aiAssistantController || !this.aiAdapter)
|
|
44311
44425
|
return;
|
|
@@ -45356,7 +45470,7 @@ class PraxisTable {
|
|
|
45356
45470
|
const key = this.connectionKey();
|
|
45357
45471
|
if (!key)
|
|
45358
45472
|
return;
|
|
45359
|
-
this.connectionStorage.loadConnection(key).pipe(take
|
|
45473
|
+
this.connectionStorage.loadConnection(key).pipe(take(1)).subscribe((prev) => {
|
|
45360
45474
|
if (prev?.resourcePath === rp)
|
|
45361
45475
|
return;
|
|
45362
45476
|
this.connectionStorage.saveConnection(key, {
|
|
@@ -45364,7 +45478,7 @@ class PraxisTable {
|
|
|
45364
45478
|
version: 1,
|
|
45365
45479
|
updatedAt: new Date().toISOString(),
|
|
45366
45480
|
origin,
|
|
45367
|
-
}).pipe(take
|
|
45481
|
+
}).pipe(take(1)).subscribe();
|
|
45368
45482
|
});
|
|
45369
45483
|
}
|
|
45370
45484
|
inputsKey() {
|
|
@@ -45374,7 +45488,7 @@ class PraxisTable {
|
|
|
45374
45488
|
try {
|
|
45375
45489
|
const key = this.connectionKey();
|
|
45376
45490
|
if (key) {
|
|
45377
|
-
this.connectionStorage.clearConnection(key).pipe(take
|
|
45491
|
+
this.connectionStorage.clearConnection(key).pipe(take(1)).subscribe();
|
|
45378
45492
|
}
|
|
45379
45493
|
}
|
|
45380
45494
|
catch { }
|
|
@@ -45500,6 +45614,7 @@ class PraxisTable {
|
|
|
45500
45614
|
endpointKey: this.crudContext?.endpointKey,
|
|
45501
45615
|
title: surface.title || contextSurface.label,
|
|
45502
45616
|
subtitle: surface.description || contextSurface.description || undefined,
|
|
45617
|
+
icon: this.getDiscoveredSurfaceIcon(surface),
|
|
45503
45618
|
});
|
|
45504
45619
|
const surfaceOpenPayload = {
|
|
45505
45620
|
operationId: 'dynamicPage.surface.open',
|
|
@@ -48507,7 +48622,9 @@ class PraxisTable {
|
|
|
48507
48622
|
throttleKey: `praxis-table:row-action:click:${action}`,
|
|
48508
48623
|
});
|
|
48509
48624
|
event?.stopPropagation?.();
|
|
48510
|
-
|
|
48625
|
+
if (this.isRowActionOpening(action, row)) {
|
|
48626
|
+
return;
|
|
48627
|
+
}
|
|
48511
48628
|
const cfg = this.config.actions?.row?.actions.find((a) => this.getActionId(a) === action);
|
|
48512
48629
|
const cfgAutoDelete = cfg?.autoDelete;
|
|
48513
48630
|
const willAutoDelete = (action === 'delete' || cfg?.action === 'delete') && !!(this.autoDelete || cfgAutoDelete);
|
|
@@ -48533,9 +48650,23 @@ class PraxisTable {
|
|
|
48533
48650
|
action,
|
|
48534
48651
|
rowId: row?.id,
|
|
48535
48652
|
}, { actionId: action, throttleKey: `praxis-table:row-action:emit:${action}` });
|
|
48536
|
-
void this.
|
|
48653
|
+
void this.dispatchRowActionWithOpening(action, row, resolvedRuntimeOptions);
|
|
48537
48654
|
}
|
|
48538
48655
|
}
|
|
48656
|
+
onOverflowRowAction(action, row, event, runtimeOptions) {
|
|
48657
|
+
event?.stopPropagation?.();
|
|
48658
|
+
const menuTrigger = this.activeRowOverflowMenuTrigger;
|
|
48659
|
+
if (!menuTrigger) {
|
|
48660
|
+
this.onRowAction(action, row, event, runtimeOptions);
|
|
48661
|
+
return;
|
|
48662
|
+
}
|
|
48663
|
+
menuTrigger.menuClosed.pipe(take(1)).subscribe(() => {
|
|
48664
|
+
menuTrigger.focus('program');
|
|
48665
|
+
this.activeRowOverflowMenuTrigger = undefined;
|
|
48666
|
+
this.onRowAction(action, row, event, runtimeOptions);
|
|
48667
|
+
});
|
|
48668
|
+
menuTrigger.closeMenu();
|
|
48669
|
+
}
|
|
48539
48670
|
resolveRowActionRuntimeOptions(runtimeOptions, fallbackConfig) {
|
|
48540
48671
|
const hasRuntime = !!runtimeOptions;
|
|
48541
48672
|
const hasRuntimePayload = hasRuntime
|
|
@@ -48657,7 +48788,7 @@ class PraxisTable {
|
|
|
48657
48788
|
}
|
|
48658
48789
|
else {
|
|
48659
48790
|
this.debugLog('[PraxisTable] onRowAction: confirmed, emitting rowAction', { action, rowId: row?.id });
|
|
48660
|
-
void this.
|
|
48791
|
+
void this.dispatchRowActionWithOpening(action, row, runtimeOptions);
|
|
48661
48792
|
}
|
|
48662
48793
|
}
|
|
48663
48794
|
else {
|
|
@@ -48668,6 +48799,37 @@ class PraxisTable {
|
|
|
48668
48799
|
}
|
|
48669
48800
|
});
|
|
48670
48801
|
}
|
|
48802
|
+
isRowActionOpening(action, row) {
|
|
48803
|
+
if (!row || typeof row !== 'object') {
|
|
48804
|
+
return false;
|
|
48805
|
+
}
|
|
48806
|
+
const actionId = typeof action === 'string' ? action : getActionId(action);
|
|
48807
|
+
return this.getOpeningRowActions().get(row)?.has(actionId) === true;
|
|
48808
|
+
}
|
|
48809
|
+
async dispatchRowActionWithOpening(action, row, runtimeOptions) {
|
|
48810
|
+
if (!row || typeof row !== 'object') {
|
|
48811
|
+
await this.dispatchRowAction(action, row, runtimeOptions);
|
|
48812
|
+
return;
|
|
48813
|
+
}
|
|
48814
|
+
const openingRowActions = this.getOpeningRowActions();
|
|
48815
|
+
const pending = openingRowActions.get(row) ?? new Set();
|
|
48816
|
+
pending.add(action);
|
|
48817
|
+
openingRowActions.set(row, pending);
|
|
48818
|
+
this.cdr?.markForCheck?.();
|
|
48819
|
+
try {
|
|
48820
|
+
await this.dispatchRowAction(action, row, runtimeOptions);
|
|
48821
|
+
}
|
|
48822
|
+
finally {
|
|
48823
|
+
pending.delete(action);
|
|
48824
|
+
if (!pending.size) {
|
|
48825
|
+
openingRowActions.delete(row);
|
|
48826
|
+
}
|
|
48827
|
+
this.cdr?.markForCheck?.();
|
|
48828
|
+
}
|
|
48829
|
+
}
|
|
48830
|
+
getOpeningRowActions() {
|
|
48831
|
+
return this.openingRowActions ??= new WeakMap();
|
|
48832
|
+
}
|
|
48671
48833
|
executeDeleteAction(row, runtimeOptions) {
|
|
48672
48834
|
if (this.isLocalDataModeActive()) {
|
|
48673
48835
|
this.debugLog('Local mode: skipping backend delete and emitting rowAction', {
|
|
@@ -48758,8 +48920,17 @@ class PraxisTable {
|
|
|
48758
48920
|
});
|
|
48759
48921
|
}
|
|
48760
48922
|
async dispatchRowAction(action, row, runtimeOptions, extra) {
|
|
48761
|
-
const actionConfig = runtimeOptions?.actionConfig;
|
|
48923
|
+
const actionConfig = await this.groundRowActionConfigForDispatch(action, row, runtimeOptions?.actionConfig);
|
|
48924
|
+
if (this.isResourceActionCatalogItem(actionConfig)) {
|
|
48925
|
+
await this.openResourceWorkflowAction(actionConfig, row);
|
|
48926
|
+
return;
|
|
48927
|
+
}
|
|
48762
48928
|
const configuredRecordSurface = this.toRecordSurfaceActionConfig(actionConfig);
|
|
48929
|
+
if (this.crudContext
|
|
48930
|
+
&& (configuredRecordSurface || this.isResourceSurfaceCatalogItem(actionConfig))) {
|
|
48931
|
+
this.emitRowActionEvent(action, row, runtimeOptions, extra);
|
|
48932
|
+
return;
|
|
48933
|
+
}
|
|
48763
48934
|
if (configuredRecordSurface) {
|
|
48764
48935
|
await this.openResourceRecordSurface(configuredRecordSurface, this.buildRecordRelatedSurfaceContextFromResourceSurface(configuredRecordSurface), row, [row]);
|
|
48765
48936
|
return;
|
|
@@ -48785,6 +48956,112 @@ class PraxisTable {
|
|
|
48785
48956
|
}
|
|
48786
48957
|
this.emitRowActionEvent(action, row, runtimeOptions, extra);
|
|
48787
48958
|
}
|
|
48959
|
+
async groundRowActionConfigForDispatch(actionId, row, actionConfig) {
|
|
48960
|
+
if (this.isResourceActionCatalogItem(actionConfig)
|
|
48961
|
+
|| this.isResourceSurfaceCatalogItem(actionConfig)
|
|
48962
|
+
|| !this.hasRowContextualDiscoveryEntryPointRaw(row)) {
|
|
48963
|
+
return actionConfig;
|
|
48964
|
+
}
|
|
48965
|
+
const rowLinks = this.getRowLinks(row);
|
|
48966
|
+
if (!rowLinks) {
|
|
48967
|
+
return actionConfig;
|
|
48968
|
+
}
|
|
48969
|
+
this.ensureRowDiscovery(row, 'row-action');
|
|
48970
|
+
const pending = [];
|
|
48971
|
+
const actionsHref = this.resolveRowDiscoveryHref(rowLinks, 'actions');
|
|
48972
|
+
const capabilitiesHref = this.resolveRowDiscoveryHref(rowLinks, 'capabilities');
|
|
48973
|
+
if (actionsHref) {
|
|
48974
|
+
const request = this.rowActionInFlightByHref.get(actionsHref);
|
|
48975
|
+
if (request)
|
|
48976
|
+
pending.push(request);
|
|
48977
|
+
}
|
|
48978
|
+
if (capabilitiesHref) {
|
|
48979
|
+
const request = this.rowCapabilityInFlightByHref.get(capabilitiesHref);
|
|
48980
|
+
if (request)
|
|
48981
|
+
pending.push(request);
|
|
48982
|
+
}
|
|
48983
|
+
if (pending.length) {
|
|
48984
|
+
await Promise.allSettled(pending);
|
|
48985
|
+
}
|
|
48986
|
+
if (row && typeof row === 'object') {
|
|
48987
|
+
this.rowContextRuntimeByRef.delete(row);
|
|
48988
|
+
}
|
|
48989
|
+
const normalizedId = this.normalizeActionId({ id: actionId, action: actionId });
|
|
48990
|
+
const grounded = this.buildResolvedRowActions(row).find((candidate) => this.normalizeActionId(candidate) === normalizedId);
|
|
48991
|
+
return grounded?.__praxisDiscoveredAction
|
|
48992
|
+
|| grounded?.__praxisDiscoveredSurface
|
|
48993
|
+
|| grounded?.__praxisCrudOperation
|
|
48994
|
+
|| actionConfig;
|
|
48995
|
+
}
|
|
48996
|
+
isResourceActionCatalogItem(value) {
|
|
48997
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) {
|
|
48998
|
+
return false;
|
|
48999
|
+
}
|
|
49000
|
+
const candidate = value;
|
|
49001
|
+
return typeof candidate.id === 'string'
|
|
49002
|
+
&& candidate.kind == null
|
|
49003
|
+
&& (candidate.scope === 'ITEM' || candidate.scope === 'COLLECTION')
|
|
49004
|
+
&& typeof candidate.operationId === 'string'
|
|
49005
|
+
&& typeof candidate.path === 'string'
|
|
49006
|
+
&& typeof candidate.method === 'string';
|
|
49007
|
+
}
|
|
49008
|
+
async openResourceWorkflowAction(action, row) {
|
|
49009
|
+
const resourceId = this.getRowId(row);
|
|
49010
|
+
const versionField = String(action.execution?.preconditions.resourceVersionField ?? '').trim();
|
|
49011
|
+
const resourceVersion = versionField ? row?.[versionField] : undefined;
|
|
49012
|
+
const eventPayload = {
|
|
49013
|
+
action: action.id,
|
|
49014
|
+
row: this.cloneForEmit(row),
|
|
49015
|
+
actionConfig: this.cloneForEmit(action),
|
|
49016
|
+
resourceIdentity: this.materializeRecordIdentity(row),
|
|
49017
|
+
};
|
|
49018
|
+
try {
|
|
49019
|
+
const payload = this.resourceActionOpenAdapter.toPayload(action, {
|
|
49020
|
+
resourcePath: this.resourcePath,
|
|
49021
|
+
resourceId,
|
|
49022
|
+
resourceVersion,
|
|
49023
|
+
endpointKey: this.crudContext?.endpointKey,
|
|
49024
|
+
title: action.title,
|
|
49025
|
+
subtitle: action.description ?? undefined,
|
|
49026
|
+
presentation: 'drawer',
|
|
49027
|
+
});
|
|
49028
|
+
this.emitResourceEvent('surface-open', 'rowAction', eventPayload, null, resourceId, 'request');
|
|
49029
|
+
const result = await this.globalActions.execute('surface.open', payload, {
|
|
49030
|
+
sourceId: this.tableId || this.componentInstanceId || 'praxis-table',
|
|
49031
|
+
output: 'rowAction',
|
|
49032
|
+
payload: eventPayload,
|
|
49033
|
+
runtime: { row },
|
|
49034
|
+
meta: { actionId: action.id, actionConfig: action },
|
|
49035
|
+
});
|
|
49036
|
+
if (!result.success) {
|
|
49037
|
+
throw new Error(result.error || `Failed to execute workflow action "${action.id}".`);
|
|
49038
|
+
}
|
|
49039
|
+
this.bindWorkflowSurfaceOutcome(action, result.data, {
|
|
49040
|
+
sourceOutput: 'rowAction',
|
|
49041
|
+
resourceId,
|
|
49042
|
+
eventPayload,
|
|
49043
|
+
});
|
|
49044
|
+
}
|
|
49045
|
+
catch (error) {
|
|
49046
|
+
this.emitResourceEvent('surface-open', 'rowAction', { ...eventPayload, error }, null, resourceId, 'error');
|
|
49047
|
+
this.showActionFeedbackMessage('errors', action.id, {
|
|
49048
|
+
label: action.title,
|
|
49049
|
+
row,
|
|
49050
|
+
error,
|
|
49051
|
+
fallback: translateTableRuntimeText(this.i18n, 'table.chrome.actions.workflow.failed', 'Não foi possível concluir a ação.'),
|
|
49052
|
+
duration: 4000,
|
|
49053
|
+
});
|
|
49054
|
+
}
|
|
49055
|
+
}
|
|
49056
|
+
applyWorkflowActionRefresh(action) {
|
|
49057
|
+
const refresh = action.execution?.refresh;
|
|
49058
|
+
if (!refresh || refresh.collection || refresh.item) {
|
|
49059
|
+
this.fetchData();
|
|
49060
|
+
}
|
|
49061
|
+
if (refresh?.actions || refresh?.capabilities) {
|
|
49062
|
+
this.clearRowDiscoveryRuntime();
|
|
49063
|
+
}
|
|
49064
|
+
}
|
|
48788
49065
|
cloneForEmit(value) {
|
|
48789
49066
|
if (value === undefined || value === null)
|
|
48790
49067
|
return value;
|
|
@@ -48904,13 +49181,12 @@ class PraxisTable {
|
|
|
48904
49181
|
if (options.resourceEventKind && options.sourceOutput) {
|
|
48905
49182
|
this.emitResourceEvent(options.resourceEventKind, options.sourceOutput, payload, options.surface, options.resourceId, 'notification');
|
|
48906
49183
|
}
|
|
48907
|
-
this.showActionFeedbackMessage('
|
|
49184
|
+
this.showActionFeedbackMessage('progress', options.actionId, {
|
|
48908
49185
|
label: options.label,
|
|
48909
49186
|
selectedCount: options.selectedCount,
|
|
48910
49187
|
row: options.row,
|
|
48911
49188
|
rows: options.rows,
|
|
48912
|
-
|
|
48913
|
-
duration: 3000,
|
|
49189
|
+
duration: 1800,
|
|
48914
49190
|
});
|
|
48915
49191
|
}
|
|
48916
49192
|
catch (error) {
|
|
@@ -49141,6 +49417,9 @@ class PraxisTable {
|
|
|
49141
49417
|
if (await this.tryHandleCollectionCreateToolbarAction(action, event.actionConfig)) {
|
|
49142
49418
|
return;
|
|
49143
49419
|
}
|
|
49420
|
+
if (this.tryHandleCollectionWorkflowToolbarAction(action, event.actionConfig)) {
|
|
49421
|
+
return;
|
|
49422
|
+
}
|
|
49144
49423
|
const bulk = this.config.actions?.bulk?.actions.find((a) => this.getActionId(a) === action);
|
|
49145
49424
|
if (bulk) {
|
|
49146
49425
|
const rows = this.selection.selected.slice();
|
|
@@ -49358,10 +49637,179 @@ class PraxisTable {
|
|
|
49358
49637
|
this.snackBar.open(message, undefined, { duration: 3000 });
|
|
49359
49638
|
return false;
|
|
49360
49639
|
}
|
|
49640
|
+
tryHandleCollectionWorkflowToolbarAction(actionId, actionConfig) {
|
|
49641
|
+
const discovered = actionConfig?.__praxisDiscoveredAction
|
|
49642
|
+
|| this.collectionCapabilities?.actions?.find((candidate) => candidate.scope === 'COLLECTION' && this.normalizeActionId(candidate) === actionId.toLowerCase());
|
|
49643
|
+
if (!discovered || discovered.scope !== 'COLLECTION')
|
|
49644
|
+
return false;
|
|
49645
|
+
const rows = this.selection.selected.slice();
|
|
49646
|
+
const maxItems = discovered.execution?.selection.maxItems ?? null;
|
|
49647
|
+
if (!rows.length || (maxItems != null && rows.length > maxItems)) {
|
|
49648
|
+
const message = !rows.length
|
|
49649
|
+
? translateTableRuntimeText(this.i18n, 'table.chrome.actions.disabled.noSelection', 'Selecione ao menos um registro para executar esta ação.')
|
|
49650
|
+
: translateTableRuntimeText(this.i18n, 'table.chrome.actions.disabled.maxSelection', 'A seleção atual excede o limite permitido para esta ação.', { max: maxItems });
|
|
49651
|
+
this.snackBar.open(message, undefined, { duration: 3500 });
|
|
49652
|
+
return true;
|
|
49653
|
+
}
|
|
49654
|
+
const execute = () => void this.openCollectionWorkflowAction(discovered, rows);
|
|
49655
|
+
if (discovered.execution?.interaction.confirmationRequired) {
|
|
49656
|
+
this.showBulkConfirmDialog(discovered.id, discovered, rows.length, execute);
|
|
49657
|
+
}
|
|
49658
|
+
else {
|
|
49659
|
+
execute();
|
|
49660
|
+
}
|
|
49661
|
+
return true;
|
|
49662
|
+
}
|
|
49663
|
+
async openCollectionWorkflowAction(action, rows) {
|
|
49664
|
+
const idsField = String(action.execution?.selection.idsField ?? '').trim();
|
|
49665
|
+
const versionsField = String(action.execution?.selection.versionsField ?? '').trim();
|
|
49666
|
+
const versionSourceField = String(action.execution?.preconditions.resourceVersionField ?? '').trim();
|
|
49667
|
+
const ids = rows.map((row) => this.getRowId(row));
|
|
49668
|
+
if (!idsField || ids.some((id) => id == null)) {
|
|
49669
|
+
this.showCollectionWorkflowContractError(action, 'A ação não publicou idsField válido ou há linhas sem identidade.');
|
|
49670
|
+
return;
|
|
49671
|
+
}
|
|
49672
|
+
const initialValue = { [idsField]: ids };
|
|
49673
|
+
if (action.execution?.preconditions.resourceVersionTransport === 'SELECTION_MAP') {
|
|
49674
|
+
if (!versionsField || !versionSourceField) {
|
|
49675
|
+
this.showCollectionWorkflowContractError(action, 'A ação não publicou os campos canônicos do mapa de versões.');
|
|
49676
|
+
return;
|
|
49677
|
+
}
|
|
49678
|
+
const expectedVersions = {};
|
|
49679
|
+
for (let index = 0; index < rows.length; index += 1) {
|
|
49680
|
+
const version = rows[index]?.[versionSourceField];
|
|
49681
|
+
if (version == null || !String(version).trim()) {
|
|
49682
|
+
this.showCollectionWorkflowContractError(action, `A linha ${String(ids[index])} não contém o token de versão exigido.`);
|
|
49683
|
+
return;
|
|
49684
|
+
}
|
|
49685
|
+
expectedVersions[String(ids[index])] = version;
|
|
49686
|
+
}
|
|
49687
|
+
initialValue[versionsField] = expectedVersions;
|
|
49688
|
+
}
|
|
49689
|
+
try {
|
|
49690
|
+
const payload = this.resourceActionOpenAdapter.toPayload(action, {
|
|
49691
|
+
resourcePath: this.resolveCollectionResourcePath(),
|
|
49692
|
+
endpointKey: this.crudContext?.endpointKey,
|
|
49693
|
+
title: action.title,
|
|
49694
|
+
subtitle: action.description ?? undefined,
|
|
49695
|
+
presentation: 'drawer',
|
|
49696
|
+
initialValue,
|
|
49697
|
+
});
|
|
49698
|
+
const result = await this.globalActions.execute('surface.open', payload, {
|
|
49699
|
+
sourceId: this.tableId || this.componentInstanceId || 'praxis-table',
|
|
49700
|
+
output: 'bulkAction',
|
|
49701
|
+
payload: { action: action.id, rows: this.cloneForEmit(rows) },
|
|
49702
|
+
runtime: { selection: rows, selectedRows: rows, selectedIds: ids },
|
|
49703
|
+
meta: { actionId: action.id, actionConfig: action },
|
|
49704
|
+
});
|
|
49705
|
+
if (!result.success) {
|
|
49706
|
+
throw new Error(result.error || `Failed to execute collection action "${action.id}".`);
|
|
49707
|
+
}
|
|
49708
|
+
this.bindWorkflowSurfaceOutcome(action, result.data, {
|
|
49709
|
+
sourceOutput: 'bulkAction',
|
|
49710
|
+
rows,
|
|
49711
|
+
eventPayload: { action: action.id, rows: this.cloneForEmit(rows) },
|
|
49712
|
+
});
|
|
49713
|
+
}
|
|
49714
|
+
catch (error) {
|
|
49715
|
+
this.showActionFeedbackMessage('errors', action.id, {
|
|
49716
|
+
label: action.title,
|
|
49717
|
+
rows,
|
|
49718
|
+
selectedCount: rows.length,
|
|
49719
|
+
error,
|
|
49720
|
+
fallback: translateTableRuntimeText(this.i18n, 'table.chrome.actions.workflow.failed', 'Não foi possível concluir a ação.'),
|
|
49721
|
+
duration: 4500,
|
|
49722
|
+
});
|
|
49723
|
+
}
|
|
49724
|
+
}
|
|
49725
|
+
bindWorkflowSurfaceOutcome(action, surfaceRef, context) {
|
|
49726
|
+
const result$ = surfaceRef?.result$;
|
|
49727
|
+
if (!result$?.subscribe) {
|
|
49728
|
+
this.warnLog('[PraxisTable] A surface aberta não publicou result$ para o lifecycle da ação', {
|
|
49729
|
+
actionId: action.id,
|
|
49730
|
+
});
|
|
49731
|
+
return;
|
|
49732
|
+
}
|
|
49733
|
+
const subscription = result$.subscribe({
|
|
49734
|
+
next: (outcome) => {
|
|
49735
|
+
if (outcome?.kind === 'dismissed' || outcome?.kind === 'notification')
|
|
49736
|
+
return;
|
|
49737
|
+
if (outcome?.kind === 'failed') {
|
|
49738
|
+
this.handleWorkflowSurfaceFailure(action, context, outcome.error);
|
|
49739
|
+
return;
|
|
49740
|
+
}
|
|
49741
|
+
if (outcome?.kind !== 'completed')
|
|
49742
|
+
return;
|
|
49743
|
+
if (context.rows) {
|
|
49744
|
+
this.applyCollectionWorkflowOutcome(action, context.rows, outcome.data);
|
|
49745
|
+
}
|
|
49746
|
+
this.emitResourceEvent('surface-open', context.sourceOutput, context.eventPayload, null, context.resourceId ?? null, 'success');
|
|
49747
|
+
this.applyWorkflowActionRefresh(action);
|
|
49748
|
+
},
|
|
49749
|
+
error: (error) => this.handleWorkflowSurfaceFailure(action, context, error),
|
|
49750
|
+
});
|
|
49751
|
+
this.subscriptions.push(subscription);
|
|
49752
|
+
}
|
|
49753
|
+
handleWorkflowSurfaceFailure(action, context, error) {
|
|
49754
|
+
this.emitResourceEvent('surface-open', context.sourceOutput, { ...context.eventPayload, error }, null, context.resourceId ?? null, 'error');
|
|
49755
|
+
this.showActionFeedbackMessage('errors', action.id, {
|
|
49756
|
+
label: action.title,
|
|
49757
|
+
...(context.rows
|
|
49758
|
+
? { rows: context.rows, selectedCount: context.rows.length }
|
|
49759
|
+
: {}),
|
|
49760
|
+
error,
|
|
49761
|
+
fallback: translateTableRuntimeText(this.i18n, 'table.chrome.actions.workflow.failed', 'Não foi possível concluir a ação.'),
|
|
49762
|
+
duration: 4500,
|
|
49763
|
+
});
|
|
49764
|
+
}
|
|
49765
|
+
applyCollectionWorkflowOutcome(action, rows, rawResult) {
|
|
49766
|
+
const result = this.unwrapCollectionWorkflowResult(rawResult);
|
|
49767
|
+
if (action.execution?.outcome.mode !== 'PER_ITEM' || !Array.isArray(result?.details)) {
|
|
49768
|
+
this.selection.clear();
|
|
49769
|
+
return;
|
|
49770
|
+
}
|
|
49771
|
+
const failedIds = new Set(result.details
|
|
49772
|
+
.filter((detail) => detail?.ok === false)
|
|
49773
|
+
.map((detail) => String(detail?.id)));
|
|
49774
|
+
this.selection.clear();
|
|
49775
|
+
rows
|
|
49776
|
+
.filter((row) => failedIds.has(String(this.getRowId(row))))
|
|
49777
|
+
.forEach((row) => this.selection.select(row));
|
|
49778
|
+
if (failedIds.size) {
|
|
49779
|
+
this.showActionFeedbackMessage('errors', action.id, {
|
|
49780
|
+
label: action.title,
|
|
49781
|
+
rows,
|
|
49782
|
+
selectedCount: rows.length,
|
|
49783
|
+
error: result.details.filter((detail) => detail?.ok === false),
|
|
49784
|
+
fallback: translateTableRuntimeText(this.i18n, 'table.chrome.actions.workflow.partialFailure', '{count} item(ns) exigem revisão.', { count: failedIds.size }),
|
|
49785
|
+
duration: 5000,
|
|
49786
|
+
});
|
|
49787
|
+
}
|
|
49788
|
+
}
|
|
49789
|
+
unwrapCollectionWorkflowResult(rawResult) {
|
|
49790
|
+
let current = rawResult;
|
|
49791
|
+
for (let depth = 0; depth < 3; depth += 1) {
|
|
49792
|
+
if (!current || typeof current !== 'object' || !Object.prototype.hasOwnProperty.call(current, 'data')) {
|
|
49793
|
+
break;
|
|
49794
|
+
}
|
|
49795
|
+
current = current.data;
|
|
49796
|
+
}
|
|
49797
|
+
return current;
|
|
49798
|
+
}
|
|
49799
|
+
showCollectionWorkflowContractError(action, message) {
|
|
49800
|
+
this.warnLog('[PraxisTable] Contrato de ação de coleção incompleto', {
|
|
49801
|
+
actionId: action.id,
|
|
49802
|
+
message,
|
|
49803
|
+
});
|
|
49804
|
+
this.snackBar.open(translateTableRuntimeText(this.i18n, 'table.chrome.actions.workflow.contractInvalid', 'A ação não pode ser executada porque seu contrato está incompleto.'), undefined, { duration: 4500 });
|
|
49805
|
+
}
|
|
49361
49806
|
async tryHandleCollectionCreateToolbarAction(action, actionConfig) {
|
|
49362
49807
|
if (String(action || '').trim().toLowerCase() !== 'create') {
|
|
49363
49808
|
return false;
|
|
49364
49809
|
}
|
|
49810
|
+
if (this.crudContext) {
|
|
49811
|
+
return false;
|
|
49812
|
+
}
|
|
49365
49813
|
const configuredAction = actionConfig ||
|
|
49366
49814
|
(this.config?.toolbar?.actions || []).find((candidate) => this.isCreateToolbarAction(candidate));
|
|
49367
49815
|
if (!configuredAction?.__praxisCollectionCreateAction) {
|
|
@@ -49391,6 +49839,7 @@ class PraxisTable {
|
|
|
49391
49839
|
endpointKey: this.crudContext?.endpointKey,
|
|
49392
49840
|
title: surface.title || configuredAction.label,
|
|
49393
49841
|
subtitle: surface.description || configuredAction.tooltip || undefined,
|
|
49842
|
+
icon: configuredAction.icon || 'add',
|
|
49394
49843
|
presentation: 'drawer',
|
|
49395
49844
|
queryContext: this.queryContext ?? undefined,
|
|
49396
49845
|
});
|
|
@@ -50009,7 +50458,7 @@ class PraxisTable {
|
|
|
50009
50458
|
let settled = false;
|
|
50010
50459
|
this.asyncConfigStorage
|
|
50011
50460
|
.saveConfig(key, payload)
|
|
50012
|
-
.pipe(take
|
|
50461
|
+
.pipe(take(1))
|
|
50013
50462
|
.subscribe({
|
|
50014
50463
|
next: () => {
|
|
50015
50464
|
if (settled)
|
|
@@ -50055,7 +50504,7 @@ class PraxisTable {
|
|
|
50055
50504
|
let settled = false;
|
|
50056
50505
|
this.asyncConfigStorage
|
|
50057
50506
|
.clearConfig(key)
|
|
50058
|
-
.pipe(take
|
|
50507
|
+
.pipe(take(1))
|
|
50059
50508
|
.subscribe({
|
|
50060
50509
|
next: () => {
|
|
50061
50510
|
if (settled)
|
|
@@ -50096,7 +50545,7 @@ class PraxisTable {
|
|
|
50096
50545
|
persistHorizontalScrollInput(inputsKey, horizontalScroll, trigger) {
|
|
50097
50546
|
this.asyncConfigStorage
|
|
50098
50547
|
.loadConfig(inputsKey)
|
|
50099
|
-
.pipe(take
|
|
50548
|
+
.pipe(take(1))
|
|
50100
50549
|
.subscribe({
|
|
50101
50550
|
next: (prev) => {
|
|
50102
50551
|
this.saveConfigWithAck(inputsKey, { ...(prev || {}), horizontalScroll }, `${trigger}:horizontal-scroll`);
|
|
@@ -51383,7 +51832,7 @@ class PraxisTable {
|
|
|
51383
51832
|
if (!action$ || typeof action$.pipe !== 'function')
|
|
51384
51833
|
return;
|
|
51385
51834
|
this.columnReorderUndoSubscription = action$
|
|
51386
|
-
.pipe(take
|
|
51835
|
+
.pipe(take(1))
|
|
51387
51836
|
.subscribe(() => {
|
|
51388
51837
|
this.restoreColumnOrderFromUndo(context);
|
|
51389
51838
|
});
|
|
@@ -51891,7 +52340,7 @@ class PraxisTable {
|
|
|
51891
52340
|
let settled = false;
|
|
51892
52341
|
this.asyncConfigStorage
|
|
51893
52342
|
.saveConfig(cfgKey, this.config)
|
|
51894
|
-
.pipe(take
|
|
52343
|
+
.pipe(take(1))
|
|
51895
52344
|
.subscribe({
|
|
51896
52345
|
next: () => {
|
|
51897
52346
|
if (settled)
|
|
@@ -52062,7 +52511,7 @@ class PraxisTable {
|
|
|
52062
52511
|
httpContext,
|
|
52063
52512
|
idField: this.getIdField(),
|
|
52064
52513
|
})
|
|
52065
|
-
.pipe(take
|
|
52514
|
+
.pipe(take(1))
|
|
52066
52515
|
.subscribe({
|
|
52067
52516
|
next: (fields) => {
|
|
52068
52517
|
if (sequence !== this.remoteSchemaLoadSequence ||
|
|
@@ -52173,7 +52622,7 @@ class PraxisTable {
|
|
|
52173
52622
|
}
|
|
52174
52623
|
this.crudService
|
|
52175
52624
|
.getFilterSchema({ cache: true })
|
|
52176
|
-
.pipe(take
|
|
52625
|
+
.pipe(take(1))
|
|
52177
52626
|
.subscribe({
|
|
52178
52627
|
next: (fields) => {
|
|
52179
52628
|
this.setFilterSchemaFieldsSnapshot(fields);
|
|
@@ -52911,8 +53360,8 @@ class PraxisTable {
|
|
|
52911
53360
|
return this.rowActionCatalogByHref.get(href) || null;
|
|
52912
53361
|
}
|
|
52913
53362
|
shouldUseRowDiscovery() {
|
|
52914
|
-
const rowActionDiscoveryEnabled = this.config
|
|
52915
|
-
if (this.config
|
|
53363
|
+
const rowActionDiscoveryEnabled = this.config?.actions?.row?.discovery?.enabled !== false;
|
|
53364
|
+
if (this.config?.actions?.row?.enabled === true && rowActionDiscoveryEnabled) {
|
|
52916
53365
|
return true;
|
|
52917
53366
|
}
|
|
52918
53367
|
const expansionMode = String((this.getExpansionConfig()?.detail?.source || {}).mode || '')
|
|
@@ -53333,7 +53782,7 @@ class PraxisTable {
|
|
|
53333
53782
|
const sequence = ++this.remoteDataLoadSequence;
|
|
53334
53783
|
this.crudService
|
|
53335
53784
|
.filterResponse(effectiveFilterCriteria, pageable, { httpContext })
|
|
53336
|
-
.pipe(take
|
|
53785
|
+
.pipe(take(1))
|
|
53337
53786
|
.subscribe({
|
|
53338
53787
|
next: (response) => {
|
|
53339
53788
|
if (sequence !== this.remoteDataLoadSequence) {
|
|
@@ -54523,7 +54972,7 @@ class PraxisTable {
|
|
|
54523
54972
|
resolveContextualConditionalSurfaces() {
|
|
54524
54973
|
const selector = '[style*="--p-table-conditional-surface-context"]';
|
|
54525
54974
|
const staleElements = this.hostRef.nativeElement.querySelectorAll('[data-p-table-runtime-background]');
|
|
54526
|
-
for (const element of staleElements) {
|
|
54975
|
+
for (const element of Array.from(staleElements)) {
|
|
54527
54976
|
if (element.matches(selector))
|
|
54528
54977
|
continue;
|
|
54529
54978
|
const runtimeBackground = element.dataset['pTableRuntimeBackground'] || '';
|
|
@@ -54537,7 +54986,7 @@ class PraxisTable {
|
|
|
54537
54986
|
delete element.dataset['pTableContrast'];
|
|
54538
54987
|
}
|
|
54539
54988
|
const elements = this.hostRef.nativeElement.querySelectorAll(selector);
|
|
54540
|
-
for (const element of elements) {
|
|
54989
|
+
for (const element of Array.from(elements)) {
|
|
54541
54990
|
const cellPendingBackground = element.style.getPropertyValue('--p-table-conditional-cell-pending-bg').trim();
|
|
54542
54991
|
const rowPendingBackground = element.style.getPropertyValue('--p-table-conditional-row-pending-bg').trim();
|
|
54543
54992
|
const pendingBackground = cellPendingBackground || rowPendingBackground;
|
|
@@ -58394,6 +58843,9 @@ class PraxisTable {
|
|
|
58394
58843
|
return surface.kind === 'VIEW' || surface.kind === 'READ_PROJECTION';
|
|
58395
58844
|
}
|
|
58396
58845
|
getDiscoveredSurfaceIcon(surface) {
|
|
58846
|
+
if (surface.relatedResource) {
|
|
58847
|
+
return 'dataset_linked';
|
|
58848
|
+
}
|
|
58397
58849
|
return this.isReadableRowSurface(surface) ? 'visibility' : 'edit_note';
|
|
58398
58850
|
}
|
|
58399
58851
|
getDiscoveredSurfaceColor(surface) {
|
|
@@ -58573,7 +59025,7 @@ class PraxisTable {
|
|
|
58573
59025
|
TableDefaultsProvider,
|
|
58574
59026
|
FilterConfigService,
|
|
58575
59027
|
DataFormattingService
|
|
58576
|
-
], 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<!-- Operational error state; authoring actions remain capability-gated. -->\n@if (isRemoteMode() && (schemaError || dataError)) {\n <div class=\"ptable-error\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">\n <mat-icon class=\"ptable-error__icon\" aria-hidden=\"true\">cloud_off</mat-icon>\n <div class=\"ptable-error__content\">\n <praxis-rich-content\n rootClassName=\"ptable-error__title\"\n [nodes]=\"getTableChromeTextRichContentNodes(getTableErrorTitle(), 'ptable-error__title-text')\"\n ></praxis-rich-content>\n <praxis-rich-content\n rootClassName=\"ptable-error__message\"\n [nodes]=\"getTableChromeTextRichContentNodes(getTableErrorMessage(), 'ptable-error__message-text')\"\n ></praxis-rich-content>\n </div>\n <div class=\"ptable-error__actions\">\n <button mat-flat-button color=\"primary\" [disabled]=\"isErrorRetryInProgress()\" (click)=\"retryTableError()\">\n <mat-icon [class.ptable-error__retry-icon--active]=\"isErrorRetryInProgress()\">refresh</mat-icon>\n <praxis-rich-content\n rootClassName=\"ptable-error__action-label\"\n [nodes]=\"getTableChromeTextRichContentNodes(getTableErrorRetryLabel(), 'ptable-error__action-label-text')\"\n ></praxis-rich-content>\n </button>\n @if (isCustomizationAvailable()) {\n <button mat-stroked-button (click)=\"openQuickConnect()\">\n <mat-icon>bolt</mat-icon>\n <praxis-rich-content\n rootClassName=\"ptable-error__action-label\"\n [nodes]=\"getTableChromeTextRichContentNodes(getTableSelectResourceLabel(), 'ptable-error__action-label-text')\"\n ></praxis-rich-content>\n </button>\n <button type=\"button\" praxisIconButton=\"settings\" size=\"compact\" class=\"praxis-table-toolbar-action--configuration\" data-role=\"table-settings\" data-testid=\"table-settings-trigger\"\n (click)=\"openTableSettings()\" [attr.aria-label]=\"getTableSettingsLabel()\"\n [matTooltip]=\"getTableSettingsLabel()\" matTooltipPosition=\"below\">\n ></button>\n }\n </div>\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]=\"isCustomizationAvailable()\" [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]=\"isCustomizationAvailable()\"\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]=\"isCustomizationAvailable()\"\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 [praxisIconButton]=\"aiAssistantTriggerIcon()\"\n size=\"compact\"\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 ></button>\n }\n\n @if (isCustomizationAvailable()) {\n <button end-actions type=\"button\" praxisIconButton=\"settings\" size=\"compact\" 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\"></button>\n }\n </praxis-table-toolbar>\n }\n @if (!showToolbar && isCustomizationAvailable()) {\n <div class=\"ptable-header-actions\">\n @if (shouldShowAiAssistantEntrypoint()) {\n <button\n [praxisIconButton]=\"aiAssistantTriggerIcon()\"\n size=\"compact\"\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 ></button>\n }\n <button type=\"button\" praxisIconButton=\"settings\" size=\"compact\" 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\"></button>\n @if (isRemoteMode()) {\n <button type=\"button\" praxisIconButton=\"link_off\" size=\"compact\" (click)=\"disconnect()\" [attr.aria-label]=\"getDisconnectLabel()\" [matTooltip]=\"getDisconnectTooltip()\"></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]=\"isCustomizationAvailable()\"\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]=\"isCustomizationAvailable()\"\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 [praxisIconButton]=\"aiAssistantTriggerIcon()\"\n size=\"compact\"\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 ></button>\n }\n @if (isCustomizationAvailable()) {\n <button end-actions type=\"button\" praxisIconButton=\"settings\" size=\"compact\" 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\"></button>\n }\n </praxis-table-toolbar>\n }\n @if (!showToolbar && isCustomizationAvailable()) {\n <div class=\"ptable-header-actions\">\n @if (shouldShowAiAssistantEntrypoint()) {\n <button\n [praxisIconButton]=\"aiAssistantTriggerIcon()\"\n size=\"compact\"\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 ></button>\n }\n <button type=\"button\" praxisIconButton=\"settings\" size=\"compact\" 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\"></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 type=\"button\"\n [praxisIconButton]=\"isRowExpanded(row, i)\n ? getExpansionExpandedIcon()\n : getExpansionCollapsedIcon()\"\n size=\"compact\"\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 ></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 type=\"button\" praxisIconButton=\"more_vert\" presentation=\"projected\" size=\"compact\" [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 type=\"button\" praxisIconButton=\"more_vert\" presentation=\"projected\" size=\"compact\" [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\" [ngClass]=\"getComposeValueClasses(it)\">{{ 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 type=\"button\"\n praxisIconButton=\"more_vert\"\n presentation=\"projected\"\n size=\"compact\"\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 [style.color]=\"getCanonicalIconActionColor(a.color)\"\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 type=\"button\"\n [praxisIconButton]=\"getRowMenuIcon()\"\n size=\"compact\"\n class=\"praxis-icon-btn praxis-more-btn\"\n [matMenuTriggerFor]=\"rowMoreMenu\"\n (menuOpened)=\"onRowOverflowMenuOpened(row)\"\n [style.color]=\"getCanonicalIconActionColor(getRowMenuButtonColor())\"\n [attr.aria-label]=\"getRowMenuTooltip(row)\"\n [matTooltip]=\"getRowMenuTooltip(row)\"\n matTooltipPosition=\"above\"\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 type=\"button\"\n praxisIconButton=\"more_vert\"\n presentation=\"projected\"\n size=\"compact\"\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 @case ('toggle') {\n <mat-slide-toggle\n [checked]=\"getToggleState(row, column)\"\n [disabled]=\"isToggleDisabled(row, column)\"\n [attr.aria-label]=\"getToggleAriaLabel(row, column) || 'Alternar'\"\n (change)=\"onToggleChange(row, column, $event)\"\n (click)=\"$event.stopPropagation()\"\n ></mat-slide-toggle>\n }\n @case ('rating') {\n <praxis-table-rating\n class=\"pfx-rating-cell\"\n [itemsCount]=\"getRatingMax(row, column)\"\n [value]=\"getRatingValue(row, column)\"\n [size]=\"getRatingSize(row, column)\"\n [ratingColor]=\"getRatingColor(row, column)\"\n [outlineColor]=\"getRatingOutlineColor(row, column)\"\n [ariaLabel]=\"getRatingAriaLabel(row, column) || column.header\"\n ></praxis-table-rating>\n }\n @case ('html') {\n <span [innerHTML]=\"getSafeHtml(row, column)\"></span>\n }\n @case ('compose') {\n <span class=\"pfx-cell-compose\" [ngClass]=\"getComposeClasses(row, column)\" [ngStyle]=\"getComposeGapStyle(row, column)\">\n @for (it of getComposeItems(row, column); track trackComposeItem($index, it)) {\n @switch (getItemEffectiveType(row, column, it)) {\n @case ('icon') {\n <span class=\"pfx-icon-renderer\" [style.color]=\"getIconColor(row, asItemColumn(column, it)) || null\" [ngStyle]=\"getIconStyle(row, asItemColumn(column, it))\" [attr.aria-label]=\"getIconAriaLabel(row, asItemColumn(column, it)) || null\"><praxis-rich-content [layout]=\"'inline'\" rootClassName=\"pfx-icon-renderer__content\" [nodes]=\"getIconRichContentNodes(row, 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(row, asItemColumn(column, it))\"></praxis-rich-content></span>\n }\n @case ('badge') {\n @if (shouldRenderBadge(row, asItemColumn(column, it))) {\n <span class=\"pfx-badge\" [ngClass]=\"getBadgeClasses(row, asItemColumn(column, it))\"><praxis-rich-content [layout]=\"'inline'\" rootClassName=\"pfx-badge__content\" [nodes]=\"getBadgeRichContentNodes(row, asItemColumn(column, it))\"></praxis-rich-content></span>\n }\n }\n @case ('link') {\n <a class=\"pfx-link\" [attr.href]=\"getLinkHref(row, asItemColumn(column, it)) || null\" [attr.target]=\"getLinkTarget(row, asItemColumn(column, it)) || null\" [attr.rel]=\"getLinkRel(row, asItemColumn(column, it)) || null\" (click)=\"$event.stopPropagation()\"><praxis-rich-content [layout]=\"'inline'\" rootClassName=\"pfx-link__content\" [nodes]=\"getLinkRichContentNodes(row, asItemColumn(column, it))\"></praxis-rich-content></a>\n }\n @case ('button') {\n @switch (getButtonVariant(row, asItemColumn(column, it))) {\n @case ('outlined') {\n <button mat-stroked-button [color]=\"getButtonColor(row, asItemColumn(column, it)) || null\" [disabled]=\"isButtonDisabled(row, asItemColumn(column, it))\" [attr.aria-label]=\"getButtonAriaLabel(row, asItemColumn(column, it)) || getButtonLabel(row, asItemColumn(column, it))\" (click)=\"onButtonClick(row, asItemColumn(column, it), $event)\"><praxis-rich-content [layout]=\"'inline'\" rootClassName=\"pfx-button-renderer__content\" [nodes]=\"getButtonRichContentNodes(row, asItemColumn(column, it))\"></praxis-rich-content></button>\n }\n @case ('text') {\n <button mat-button [color]=\"getButtonColor(row, asItemColumn(column, it)) || null\" [disabled]=\"isButtonDisabled(row, asItemColumn(column, it))\" [attr.aria-label]=\"getButtonAriaLabel(row, asItemColumn(column, it)) || getButtonLabel(row, asItemColumn(column, it))\" (click)=\"onButtonClick(row, asItemColumn(column, it), $event)\"><praxis-rich-content [layout]=\"'inline'\" rootClassName=\"pfx-button-renderer__content\" [nodes]=\"getButtonRichContentNodes(row, asItemColumn(column, it))\"></praxis-rich-content></button>\n }\n @default {\n <button mat-flat-button [color]=\"getButtonColor(row, asItemColumn(column, it)) || null\" [disabled]=\"isButtonDisabled(row, asItemColumn(column, it))\" [attr.aria-label]=\"getButtonAriaLabel(row, asItemColumn(column, it)) || getButtonLabel(row, asItemColumn(column, it))\" (click)=\"onButtonClick(row, asItemColumn(column, it), $event)\"><praxis-rich-content [layout]=\"'inline'\" rootClassName=\"pfx-button-renderer__content\" [nodes]=\"getButtonRichContentNodes(row, asItemColumn(column, it))\"></praxis-rich-content></button>\n }\n }\n }\n @case ('chip') {\n @if (shouldRenderChip(row, asItemColumn(column, it))) {\n <span class=\"pfx-chip\" [ngClass]=\"getChipClasses(row, asItemColumn(column, it))\"><praxis-rich-content [layout]=\"'inline'\" rootClassName=\"pfx-chip__content\" [nodes]=\"getChipRichContentNodes(row, asItemColumn(column, it))\"></praxis-rich-content></span>\n }\n }\n @case ('progress') {\n <div class=\"pfx-progress\"><praxis-rich-content rootClassName=\"pfx-progress__content\" [context]=\"getProgressRichContentContext(row, asItemColumn(column, it))\" [nodes]=\"getProgressRichContentNodes(row, asItemColumn(column, it))\"></praxis-rich-content></div>\n }\n @case ('microVisualization') {\n <span class=\"pfx-micro-viz-cell\" [innerHTML]=\"getMicroVisualizationHtml(row, asItemColumn(column, it))\"></span>\n }\n @case ('avatar') {\n <span class=\"pfx-avatar-renderer\" [ngStyle]=\"getAvatarStyle(row, asItemColumn(column, it))\" [class.shape-rounded]=\"getAvatarShape(row, asItemColumn(column, it)) === 'rounded'\" [class.shape-circle]=\"getAvatarShape(row, asItemColumn(column, it)) === 'circle'\"><praxis-rich-content rootClassName=\"pfx-avatar-renderer__content\" [nodes]=\"getAvatarRichContentNodes(row, asItemColumn(column, it))\"></praxis-rich-content></span>\n }\n @case ('toggle') {\n <mat-slide-toggle [checked]=\"getToggleState(row, asItemColumn(column, it))\" [disabled]=\"isToggleDisabled(row, asItemColumn(column, it))\" [attr.aria-label]=\"getToggleAriaLabel(row, asItemColumn(column, it)) || 'Alternar'\" (change)=\"onToggleChange(row, asItemColumn(column, it), $event)\" (click)=\"$event.stopPropagation()\"></mat-slide-toggle>\n }\n @case ('menu') {\n <button type=\"button\" praxisIconButton=\"more_vert\" presentation=\"projected\" size=\"compact\" [matMenuTriggerFor]=\"composeMenuRef\" (click)=\"$event.stopPropagation()\" [attr.aria-label]=\"getMenuAriaLabel(row, asItemColumn(column, it)) || 'Menu'\"><praxis-rich-content rootClassName=\"pfx-menu-trigger__content\" [nodes]=\"getMenuTriggerRichContentNodes()\"></praxis-rich-content></button>\n <mat-menu #composeMenuRef=\"matMenu\">\n @for (mi of getMenuItems(row, asItemColumn(column, it)); track mi.id) {\n <button mat-menu-item (click)=\"onMenuItemClick(mi, row, $event)\" [disabled]=\"!mi.__visible\"><praxis-rich-content rootClassName=\"pfx-menu-item__content\" [nodes]=\"getMenuItemRichContentNodes(mi)\"></praxis-rich-content></button>\n }\n </mat-menu>\n }\n @case ('rating') {\n <praxis-table-rating class=\"pfx-rating-cell\" [itemsCount]=\"getRatingMax(row, asItemColumn(column, it))\" [value]=\"getRatingValue(row, asItemColumn(column, it))\" [size]=\"getRatingSize(row, asItemColumn(column, it))\" [ratingColor]=\"getRatingColor(row, asItemColumn(column, it))\" [outlineColor]=\"getRatingOutlineColor(row, asItemColumn(column, it))\" [ariaLabel]=\"getRatingAriaLabel(row, asItemColumn(column, it)) || column.header\"></praxis-table-rating>\n }\n @case ('html') {\n <span [innerHTML]=\"getSafeHtml(row, asItemColumn(column, it))\"></span>\n }\n @case ('value') {\n <span class=\"pfx-cell-value\" [ngClass]=\"getComposeValueClasses(it)\">{{ getComposeItemValue(row, column, it) }}</span>\n }\n }\n }\n </span>\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 type=\"button\" praxisIconButton=\"more_vert\" presentation=\"projected\" size=\"compact\" 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 [style.color]=\"getCanonicalIconActionColor(a.color)\">\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 type=\"button\" [praxisIconButton]=\"getRowMenuIcon()\" size=\"compact\" class=\"praxis-icon-btn praxis-more-btn\"\n [matMenuTriggerFor]=\"rowMoreMenuV\"\n (menuOpened)=\"onRowOverflowMenuOpened(row)\"\n [style.color]=\"getCanonicalIconActionColor(getRowMenuButtonColor())\"\n [attr.aria-label]=\"getRowMenuTooltip(row)\"\n [matTooltip]=\"getRowMenuTooltip(row)\"\n matTooltipPosition=\"above\"></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\n class=\"ptable-no-data-state\"\n [style.--p-table-empty-action-size]=\"getNoDataStateActionSize()\"\n >\n <span class=\"ptable-no-data-state__announcement\" role=\"status\" aria-live=\"polite\">\n {{ getNoDataStateTitle() }}. {{ getNoDataStateDescription() }}\n </span>\n <praxis-empty-state-card\n [icon]=\"getNoDataStateIcon()\"\n [title]=\"getNoDataStateTitle()\"\n [description]=\"getNoDataStateDescription()\"\n [primaryAction]=\"getNoDataStatePrimaryAction()\"\n [secondaryActions]=\"getNoDataStateSecondaryActions()\"\n [inline]=\"true\"\n [tone]=\"getNoDataStateTone()\"\n [variant]=\"getNoDataStateVariant()\"\n [alignment]=\"getNoDataStateAlignment()\"\n [density]=\"getNoDataStateDensity()\"\n [iconContainer]=\"getNoDataStateIconContainer()\"\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]=\"isCustomizationAvailable()\"\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]=\"isCustomizationAvailable()\"\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 [praxisIconButton]=\"aiAssistantTriggerIcon()\"\n size=\"compact\"\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 ></button>\n }\n }\n @if (shouldShowFooterToolbarMain() && shouldRenderAdvancedFilter() && isCustomizationAvailable()) {\n <button\n end-actions\n type=\"button\"\n praxisIconButton=\"settings\"\n size=\"compact\"\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 ></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{--praxis-icon-button-surface-size: var(--p-actions-btn-size, var(--p-actions-btn-size-default, 36px));--praxis-icon-button-icon-size: var(--p-actions-icon-size, var(--p-actions-icon-size-default, 20px))}.praxis-icon-btn praxis-rich-content{display:inline-flex;align-items:center;justify-content:center;width:var(--praxis-icon-button-icon-size);height:var(--praxis-icon-button-icon-size);line-height:var(--praxis-icon-button-icon-size)}: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(--praxis-icon-button-icon-size);height:var(--praxis-icon-button-icon-size);line-height:var(--praxis-icon-button-icon-size)}:host ::ng-deep .praxis-icon-btn .praxis-row-action__icon .prx-rich-icon{font-size:var(--praxis-icon-button-icon-size);width:var(--praxis-icon-button-icon-size);height:var(--praxis-icon-button-icon-size);line-height:var(--praxis-icon-button-icon-size)}.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{--praxis-icon-button-surface-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, 36px))));--praxis-icon-button-icon-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, 20px))));background-image:var(--p-actions-more-btn-gradient, none);background-size:100% 100%;background-repeat:no-repeat}.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{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{color:var(--md-sys-color-primary);transition:background-color .16s ease,box-shadow .16s ease,color .16s ease}.praxis-table-toolbar-action--configuration{color:var(--md-sys-color-primary)}.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].praxis-icon-button{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{display:grid;gap:4px;width:100%;min-width:0;color:var(--md-sys-color-on-surface);font-size:12px;line-height:1.2}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__track,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__segments{position:relative;display:flex;width:100%;height:8px;min-width:0;overflow:hidden;border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-outline-variant) 62%,transparent)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__bar,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__segment{display:block;height:100%;border-radius:inherit;background:var(--md-sys-color-primary)}:host ::ng-deep .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)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__bullet{display:flex;flex-direction:column;gap:4px}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__track{position:relative;display:block;width:100%;block-size:10px;overflow:hidden;border-radius:var(--pfx-micro-track-radius, 999px);background:var(--pfx-micro-track-color, var(--md-sys-color-surface-container-high, #e5e7eb))}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__range,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__actual,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__target{position:absolute}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__range{inset-block:0;display:block;block-size:100%;opacity:.32}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__actual{inset-block-start:3px;inset-inline-start:0;block-size:4px;border-radius:inherit}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__target{inset-block:0;inline-size:2px;background:var(--md-sys-color-on-surface, #111827)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__range[data-tone=success],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__actual[data-tone=success]{background:var(--p-table-state-success-fg, #168a4a)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__range[data-tone=warning],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__actual[data-tone=warning]{background:var(--p-table-state-warning-fg, #b45f06)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__range[data-tone=danger],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__range[data-tone=critical],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__actual[data-tone=danger],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__actual[data-tone=critical]{background:var(--p-table-state-danger-fg, #b3261e)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__range[data-tone=info],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__actual[data-tone=info]{background:var(--md-sys-color-primary, #2563eb)}:host ::ng-deep .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}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__label,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__value{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}: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}.pfx-cell-value--strong{font-weight:600}.pfx-cell-value--subtle{color:var(--md-sys-color-on-surface-variant);font-size:.875em}.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-conditional-cell-fg, var(--p-table-conditional-row-fg, 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-conditional-row-bg, var(--p-table-row-hover-bg));box-shadow:inset 0 0 0 9999px color-mix(in srgb,currentColor 4%,transparent)}: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-conditional-row-bg, 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);box-shadow:none}: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;flex-wrap:wrap;align-items:center;gap:12px;padding:12px;margin:8px 0;border:1px solid var(--md-sys-color-error);border-radius:8px;background:var(--md-sys-color-error-container);color:var(--md-sys-color-on-error-container)}.ptable-error__icon{flex:0 0 auto;color:var(--md-sys-color-error)}.ptable-error__content{flex:1 1 18rem;min-width:0}.ptable-error__title{font-weight:600}.ptable-error__message{overflow-wrap:anywhere}.ptable-error__actions{display:flex;flex:0 1 auto;flex-wrap:wrap;align-items:center;justify-content:flex-end;gap:8px;max-width:100%}.ptable-error__retry-icon--active{animation:ptable-error-retry-spin .9s linear infinite}@keyframes ptable-error-retry-spin{to{transform:rotate(360deg)}}@media(prefers-reduced-motion:reduce){.ptable-error__retry-icon--active{animation:none}}.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,.pfx-conditional-row-surface--success,.pfx-conditional-row-surface--success td,td.pfx-conditional-cell-surface--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,.pfx-conditional-row-surface--warning,.pfx-conditional-row-surface--warning td,td.pfx-conditional-cell-surface--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,.pfx-conditional-row-surface--danger,.pfx-conditional-row-surface--danger td,td.pfx-conditional-cell-surface--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,.pfx-conditional-row-surface--highlight,.pfx-conditional-row-surface--highlight td,td.pfx-conditional-cell-surface--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:12px;border-inline:1px solid var(--p-table-border-color);background:var(--p-table-paginator-bg, var(--p-table-bg));--pdx-empty-state-action-height: var(--p-table-empty-action-size, 36px);--pdx-empty-state-transparent-margin: 0}.ptable-no-data-state ::ng-deep .empty-card{margin:0;min-block-size:clamp(9rem,22vh,13.75rem);border:0;border-radius:0;background:transparent;box-shadow:none}.ptable-no-data-state ::ng-deep .empty-card mat-card-content{display:flex;min-block-size:inherit;flex-direction:column;align-items:center;justify-content:center;padding:24px}.ptable-no-data-state ::ng-deep .empty-card .content{align-items:center;text-align:center}.ptable-no-data-state ::ng-deep .empty-card .texts{justify-items:center}.ptable-no-data-state ::ng-deep .empty-card .desc{max-width:min(100%,42rem)}.ptable-no-data-state__announcement{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}@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.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: "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$2.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: i7.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$2.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i8$2.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i8$2.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i8$2.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i8$2.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i8$2.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i8$2.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i8$2.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i8$2.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i8$2.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i14.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: "component", type: PraxisIconButtonComponent, selector: "button[praxisIconButton]", inputs: ["praxisIconButton", "size", "appearance", "presentation", "pressed", "busy"] }, { 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", "variant", "alignment", "density", "iconContainer"] }, { kind: "component", type: TableRatingCellComponent, selector: "praxis-table-rating", inputs: ["itemsCount", "value", "size", "ratingColor", "outlineColor", "ariaLabel"] }] });
|
|
59028
|
+
], 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<!-- Operational error state; authoring actions remain capability-gated. -->\n@if (isRemoteMode() && (schemaError || dataError)) {\n <div class=\"ptable-error\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">\n <mat-icon class=\"ptable-error__icon\" aria-hidden=\"true\">cloud_off</mat-icon>\n <div class=\"ptable-error__content\">\n <praxis-rich-content\n rootClassName=\"ptable-error__title\"\n [nodes]=\"getTableChromeTextRichContentNodes(getTableErrorTitle(), 'ptable-error__title-text')\"\n ></praxis-rich-content>\n <praxis-rich-content\n rootClassName=\"ptable-error__message\"\n [nodes]=\"getTableChromeTextRichContentNodes(getTableErrorMessage(), 'ptable-error__message-text')\"\n ></praxis-rich-content>\n </div>\n <div class=\"ptable-error__actions\">\n <button mat-flat-button color=\"primary\" [disabled]=\"isErrorRetryInProgress()\" (click)=\"retryTableError()\">\n <mat-icon [class.ptable-error__retry-icon--active]=\"isErrorRetryInProgress()\">refresh</mat-icon>\n <praxis-rich-content\n rootClassName=\"ptable-error__action-label\"\n [nodes]=\"getTableChromeTextRichContentNodes(getTableErrorRetryLabel(), 'ptable-error__action-label-text')\"\n ></praxis-rich-content>\n </button>\n @if (isCustomizationAvailable()) {\n <button mat-stroked-button (click)=\"openQuickConnect()\">\n <mat-icon>bolt</mat-icon>\n <praxis-rich-content\n rootClassName=\"ptable-error__action-label\"\n [nodes]=\"getTableChromeTextRichContentNodes(getTableSelectResourceLabel(), 'ptable-error__action-label-text')\"\n ></praxis-rich-content>\n </button>\n <button type=\"button\" praxisIconButton=\"settings\" size=\"compact\" class=\"praxis-table-toolbar-action--configuration\" data-role=\"table-settings\" data-testid=\"table-settings-trigger\"\n (click)=\"openTableSettings()\" [attr.aria-label]=\"getTableSettingsLabel()\"\n [matTooltip]=\"getTableSettingsLabel()\" matTooltipPosition=\"below\">\n ></button>\n }\n </div>\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]=\"isCustomizationAvailable()\" [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]=\"getAdvancedFilterFormId()\"\n [persistenceKey]=\"getAdvancedFilterPersistenceKey()\"\n [fieldMetadata]=\"getAdvancedFilterFieldMetadata()\"\n [enableCustomization]=\"isCustomizationAvailable()\"\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 [advancedOpenMode]=\"getAdvancedFilterOpenMode()\"\n [advancedClearButtonsEnabled]=\"config.behavior?.filtering?.advancedFilters?.settings?.advancedClearButtonsEnabled\"\n [changeDebounceMs]=\"config.behavior?.filtering?.advancedFilters?.settings?.changeDebounceMs ?? 300\"\n [i18n]=\"getFilterI18n()\"\n [mode]=\"'filter'\"\n [showFilterSettings]=\"isCustomizationAvailable()\"\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 [praxisIconButton]=\"aiAssistantTriggerIcon()\"\n size=\"compact\"\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 ></button>\n }\n\n @if (isCustomizationAvailable()) {\n <button end-actions type=\"button\" praxisIconButton=\"settings\" size=\"compact\" 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\"></button>\n }\n </praxis-table-toolbar>\n }\n @if (!showToolbar && isCustomizationAvailable()) {\n <div class=\"ptable-header-actions\">\n @if (shouldShowAiAssistantEntrypoint()) {\n <button\n [praxisIconButton]=\"aiAssistantTriggerIcon()\"\n size=\"compact\"\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 ></button>\n }\n <button type=\"button\" praxisIconButton=\"settings\" size=\"compact\" 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\"></button>\n @if (isRemoteMode()) {\n <button type=\"button\" praxisIconButton=\"link_off\" size=\"compact\" (click)=\"disconnect()\" [attr.aria-label]=\"getDisconnectLabel()\" [matTooltip]=\"getDisconnectTooltip()\"></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]=\"getAdvancedFilterFormId()\"\n [persistenceKey]=\"getAdvancedFilterPersistenceKey()\"\n [fieldMetadata]=\"getAdvancedFilterFieldMetadata()\"\n [enableCustomization]=\"isCustomizationAvailable()\"\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 [advancedOpenMode]=\"getAdvancedFilterOpenMode()\"\n [advancedClearButtonsEnabled]=\"config.behavior?.filtering?.advancedFilters?.settings?.advancedClearButtonsEnabled\"\n [changeDebounceMs]=\"config.behavior?.filtering?.advancedFilters?.settings?.changeDebounceMs ?? 300\"\n [i18n]=\"getFilterI18n()\"\n [mode]=\"'filter'\"\n [showFilterSettings]=\"isCustomizationAvailable()\"\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 [praxisIconButton]=\"aiAssistantTriggerIcon()\"\n size=\"compact\"\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 ></button>\n }\n @if (isCustomizationAvailable()) {\n <button end-actions type=\"button\" praxisIconButton=\"settings\" size=\"compact\" 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\"></button>\n }\n </praxis-table-toolbar>\n }\n @if (!showToolbar && isCustomizationAvailable()) {\n <div class=\"ptable-header-actions\">\n @if (shouldShowAiAssistantEntrypoint()) {\n <button\n [praxisIconButton]=\"aiAssistantTriggerIcon()\"\n size=\"compact\"\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 ></button>\n }\n <button type=\"button\" praxisIconButton=\"settings\" size=\"compact\" 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\"></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 [class.table-rounded-bottom]=\"!hasBottomTableStack()\">\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.table-rounded-bottom]=\"!hasBottomTableStack()\"\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 type=\"button\"\n [praxisIconButton]=\"isRowExpanded(row, i)\n ? getExpansionExpandedIcon()\n : getExpansionCollapsedIcon()\"\n size=\"compact\"\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 ></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 [mat-sort-header]=\"column.field\"\n [disabled]=\"!getSortingEnabled() || column.sortable === false || isColumnResizeActive()\"\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 (keydown)=\"onColumnHeaderReorderKeydown($event, column)\"\n >\n <span class=\"praxis-header-sort-trigger\">\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 [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 type=\"button\" praxisIconButton=\"more_vert\" presentation=\"projected\" size=\"compact\" [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))\" [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 type=\"button\" praxisIconButton=\"more_vert\" presentation=\"projected\" size=\"compact\" [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\" [ngClass]=\"getComposeValueClasses(it)\">{{ 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 layout=\"inline\"\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 type=\"button\"\n praxisIconButton=\"more_vert\"\n presentation=\"projected\"\n size=\"compact\"\n class=\"praxis-icon-btn\"\n [class.praxis-icon-btn--workflow]=\"isWorkflowRowAction(a)\"\n [class.praxis-icon-btn--blocked]=\"isBlockedWorkflowRowAction(a, row)\"\n [busy]=\"isRowActionOpening(a, row)\"\n [disabled]=\"isActionDisabled(a, row) || isRowActionOpening(a, row)\"\n (click)=\"onRowAction(getActionId(a), row, $event, getRowActionRuntimeOptions(a, row))\"\n [attr.aria-label]=\"a.label || getActionId(a)\"\n [style.color]=\"getCanonicalIconActionColor(a.color)\"\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) || isRowActionOpening(a, row)\"\n [attr.aria-busy]=\"isRowActionOpening(a, row) ? 'true' : null\"\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 #rowMoreMenuTrigger=\"matMenuTrigger\"\n type=\"button\"\n [praxisIconButton]=\"getRowMenuIcon()\"\n size=\"compact\"\n class=\"praxis-icon-btn praxis-more-btn\"\n [matMenuTriggerFor]=\"rowMoreMenu\"\n (menuOpened)=\"activeRowOverflowMenuTrigger = rowMoreMenuTrigger; onRowOverflowMenuOpened(row)\"\n [style.color]=\"getCanonicalIconActionColor(getRowMenuButtonColor())\"\n [attr.aria-label]=\"getRowMenuTooltip(row)\"\n [matTooltip]=\"getRowMenuTooltip(row)\"\n matTooltipPosition=\"above\"\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)=\"onOverflowRowAction(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 [class.table-rounded-bottom]=\"!hasBottomTableStack()\"\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 type=\"button\"\n praxisIconButton=\"more_vert\"\n presentation=\"projected\"\n size=\"compact\"\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 @case ('toggle') {\n <mat-slide-toggle\n [checked]=\"getToggleState(row, column)\"\n [disabled]=\"isToggleDisabled(row, column)\"\n [aria-label]=\"getToggleAriaLabel(row, column) || 'Alternar'\"\n (change)=\"onToggleChange(row, column, $event)\"\n (click)=\"$event.stopPropagation()\"\n ></mat-slide-toggle>\n }\n @case ('rating') {\n <praxis-table-rating\n class=\"pfx-rating-cell\"\n [itemsCount]=\"getRatingMax(row, column)\"\n [value]=\"getRatingValue(row, column)\"\n [size]=\"getRatingSize(row, column)\"\n [ratingColor]=\"getRatingColor(row, column)\"\n [outlineColor]=\"getRatingOutlineColor(row, column)\"\n [ariaLabel]=\"getRatingAriaLabel(row, column) || column.header\"\n ></praxis-table-rating>\n }\n @case ('html') {\n <span [innerHTML]=\"getSafeHtml(row, column)\"></span>\n }\n @case ('compose') {\n <span class=\"pfx-cell-compose\" [ngClass]=\"getComposeClasses(row, column)\" [ngStyle]=\"getComposeGapStyle(row, column)\">\n @for (it of getComposeItems(row, column); track trackComposeItem($index, it)) {\n @switch (getItemEffectiveType(row, column, it)) {\n @case ('icon') {\n <span class=\"pfx-icon-renderer\" [style.color]=\"getIconColor(row, asItemColumn(column, it)) || null\" [ngStyle]=\"getIconStyle(row, asItemColumn(column, it))\" [attr.aria-label]=\"getIconAriaLabel(row, asItemColumn(column, it)) || null\"><praxis-rich-content [layout]=\"'inline'\" rootClassName=\"pfx-icon-renderer__content\" [nodes]=\"getIconRichContentNodes(row, 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(row, asItemColumn(column, it))\"></praxis-rich-content></span>\n }\n @case ('badge') {\n @if (shouldRenderBadge(row, asItemColumn(column, it))) {\n <span class=\"pfx-badge\" [ngClass]=\"getBadgeClasses(row, asItemColumn(column, it))\"><praxis-rich-content [layout]=\"'inline'\" rootClassName=\"pfx-badge__content\" [nodes]=\"getBadgeRichContentNodes(row, asItemColumn(column, it))\"></praxis-rich-content></span>\n }\n }\n @case ('link') {\n <a class=\"pfx-link\" [attr.href]=\"getLinkHref(row, asItemColumn(column, it)) || null\" [attr.target]=\"getLinkTarget(row, asItemColumn(column, it)) || null\" [attr.rel]=\"getLinkRel(row, asItemColumn(column, it)) || null\" (click)=\"$event.stopPropagation()\"><praxis-rich-content [layout]=\"'inline'\" rootClassName=\"pfx-link__content\" [nodes]=\"getLinkRichContentNodes(row, asItemColumn(column, it))\"></praxis-rich-content></a>\n }\n @case ('button') {\n @switch (getButtonVariant(row, asItemColumn(column, it))) {\n @case ('outlined') {\n <button mat-stroked-button [color]=\"getButtonColor(row, asItemColumn(column, it)) || null\" [disabled]=\"isButtonDisabled(row, asItemColumn(column, it))\" [attr.aria-label]=\"getButtonAriaLabel(row, asItemColumn(column, it)) || getButtonLabel(row, asItemColumn(column, it))\" (click)=\"onButtonClick(row, asItemColumn(column, it), $event)\"><praxis-rich-content [layout]=\"'inline'\" rootClassName=\"pfx-button-renderer__content\" [nodes]=\"getButtonRichContentNodes(row, asItemColumn(column, it))\"></praxis-rich-content></button>\n }\n @case ('text') {\n <button mat-button [color]=\"getButtonColor(row, asItemColumn(column, it)) || null\" [disabled]=\"isButtonDisabled(row, asItemColumn(column, it))\" [attr.aria-label]=\"getButtonAriaLabel(row, asItemColumn(column, it)) || getButtonLabel(row, asItemColumn(column, it))\" (click)=\"onButtonClick(row, asItemColumn(column, it), $event)\"><praxis-rich-content [layout]=\"'inline'\" rootClassName=\"pfx-button-renderer__content\" [nodes]=\"getButtonRichContentNodes(row, asItemColumn(column, it))\"></praxis-rich-content></button>\n }\n @default {\n <button mat-flat-button [color]=\"getButtonColor(row, asItemColumn(column, it)) || null\" [disabled]=\"isButtonDisabled(row, asItemColumn(column, it))\" [attr.aria-label]=\"getButtonAriaLabel(row, asItemColumn(column, it)) || getButtonLabel(row, asItemColumn(column, it))\" (click)=\"onButtonClick(row, asItemColumn(column, it), $event)\"><praxis-rich-content [layout]=\"'inline'\" rootClassName=\"pfx-button-renderer__content\" [nodes]=\"getButtonRichContentNodes(row, asItemColumn(column, it))\"></praxis-rich-content></button>\n }\n }\n }\n @case ('chip') {\n @if (shouldRenderChip(row, asItemColumn(column, it))) {\n <span class=\"pfx-chip\" [ngClass]=\"getChipClasses(row, asItemColumn(column, it))\"><praxis-rich-content [layout]=\"'inline'\" rootClassName=\"pfx-chip__content\" [nodes]=\"getChipRichContentNodes(row, asItemColumn(column, it))\"></praxis-rich-content></span>\n }\n }\n @case ('progress') {\n <div class=\"pfx-progress\"><praxis-rich-content rootClassName=\"pfx-progress__content\" [context]=\"getProgressRichContentContext(row, asItemColumn(column, it))\" [nodes]=\"getProgressRichContentNodes(row, asItemColumn(column, it))\"></praxis-rich-content></div>\n }\n @case ('microVisualization') {\n <span class=\"pfx-micro-viz-cell\" [innerHTML]=\"getMicroVisualizationHtml(row, asItemColumn(column, it))\"></span>\n }\n @case ('avatar') {\n <span class=\"pfx-avatar-renderer\" [ngStyle]=\"getAvatarStyle(row, asItemColumn(column, it))\" [class.shape-rounded]=\"getAvatarShape(row, asItemColumn(column, it)) === 'rounded'\" [class.shape-circle]=\"getAvatarShape(row, asItemColumn(column, it)) === 'circle'\"><praxis-rich-content rootClassName=\"pfx-avatar-renderer__content\" [nodes]=\"getAvatarRichContentNodes(row, asItemColumn(column, it))\"></praxis-rich-content></span>\n }\n @case ('toggle') {\n <mat-slide-toggle [checked]=\"getToggleState(row, asItemColumn(column, it))\" [disabled]=\"isToggleDisabled(row, asItemColumn(column, it))\" [aria-label]=\"getToggleAriaLabel(row, asItemColumn(column, it)) || 'Alternar'\" (change)=\"onToggleChange(row, asItemColumn(column, it), $event)\" (click)=\"$event.stopPropagation()\"></mat-slide-toggle>\n }\n @case ('menu') {\n <button type=\"button\" praxisIconButton=\"more_vert\" presentation=\"projected\" size=\"compact\" [matMenuTriggerFor]=\"composeMenuRef\" (click)=\"$event.stopPropagation()\" [attr.aria-label]=\"getMenuAriaLabel(row, asItemColumn(column, it)) || 'Menu'\"><praxis-rich-content rootClassName=\"pfx-menu-trigger__content\" [nodes]=\"getMenuTriggerRichContentNodes()\"></praxis-rich-content></button>\n <mat-menu #composeMenuRef=\"matMenu\">\n @for (mi of getMenuItems(row, asItemColumn(column, it)); track mi.id) {\n <button mat-menu-item (click)=\"onMenuItemClick(mi, row, $event)\" [disabled]=\"!mi.__visible\"><praxis-rich-content rootClassName=\"pfx-menu-item__content\" [nodes]=\"getMenuItemRichContentNodes(mi)\"></praxis-rich-content></button>\n }\n </mat-menu>\n }\n @case ('rating') {\n <praxis-table-rating class=\"pfx-rating-cell\" [itemsCount]=\"getRatingMax(row, asItemColumn(column, it))\" [value]=\"getRatingValue(row, asItemColumn(column, it))\" [size]=\"getRatingSize(row, asItemColumn(column, it))\" [ratingColor]=\"getRatingColor(row, asItemColumn(column, it))\" [outlineColor]=\"getRatingOutlineColor(row, asItemColumn(column, it))\" [ariaLabel]=\"getRatingAriaLabel(row, asItemColumn(column, it)) || column.header\"></praxis-table-rating>\n }\n @case ('html') {\n <span [innerHTML]=\"getSafeHtml(row, asItemColumn(column, it))\"></span>\n }\n @case ('value') {\n <span class=\"pfx-cell-value\" [ngClass]=\"getComposeValueClasses(it)\">{{ getComposeItemValue(row, column, it) }}</span>\n }\n }\n }\n </span>\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 type=\"button\" praxisIconButton=\"more_vert\" presentation=\"projected\" size=\"compact\" class=\"praxis-icon-btn\"\n [class.praxis-icon-btn--workflow]=\"isWorkflowRowAction(a)\"\n [class.praxis-icon-btn--blocked]=\"isBlockedWorkflowRowAction(a, row)\"\n [busy]=\"isRowActionOpening(a, row)\"\n [disabled]=\"isActionDisabled(a, row) || isRowActionOpening(a, row)\"\n (click)=\"onRowAction(getActionId(a), row, $event, getRowActionRuntimeOptions(a, row))\"\n [attr.aria-label]=\"a.label || getActionId(a)\"\n [style.color]=\"getCanonicalIconActionColor(a.color)\">\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) || isRowActionOpening(a, row)\"\n [attr.aria-busy]=\"isRowActionOpening(a, row) ? 'true' : null\"\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 #rowMoreMenuTriggerV=\"matMenuTrigger\" type=\"button\" [praxisIconButton]=\"getRowMenuIcon()\" size=\"compact\" class=\"praxis-icon-btn praxis-more-btn\"\n [matMenuTriggerFor]=\"rowMoreMenuV\"\n (menuOpened)=\"activeRowOverflowMenuTrigger = rowMoreMenuTriggerV; onRowOverflowMenuOpened(row)\"\n [style.color]=\"getCanonicalIconActionColor(getRowMenuButtonColor())\"\n [attr.aria-label]=\"getRowMenuTooltip(row)\"\n [matTooltip]=\"getRowMenuTooltip(row)\"\n matTooltipPosition=\"above\"></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)=\"onOverflowRowAction(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\n class=\"ptable-no-data-state\"\n [style.--p-table-empty-action-size]=\"getNoDataStateActionSize()\"\n >\n <span class=\"ptable-no-data-state__announcement\" role=\"status\" aria-live=\"polite\">\n {{ getNoDataStateTitle() }}. {{ getNoDataStateDescription() }}\n </span>\n <praxis-empty-state-card\n [icon]=\"getNoDataStateIcon()\"\n [title]=\"getNoDataStateTitle()\"\n [description]=\"getNoDataStateDescription()\"\n [primaryAction]=\"getNoDataStatePrimaryAction()\"\n [secondaryActions]=\"getNoDataStateSecondaryActions()\"\n [inline]=\"true\"\n [tone]=\"getNoDataStateTone()\"\n [variant]=\"getNoDataStateVariant()\"\n [alignment]=\"getNoDataStateAlignment()\"\n [density]=\"getNoDataStateDensity()\"\n [iconContainer]=\"getNoDataStateIconContainer()\"\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]=\"getAdvancedFilterFormId()\"\n [persistenceKey]=\"getAdvancedFilterPersistenceKey()\"\n [fieldMetadata]=\"getAdvancedFilterFieldMetadata()\"\n [enableCustomization]=\"isCustomizationAvailable()\"\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 [advancedOpenMode]=\"getAdvancedFilterOpenMode()\"\n [advancedClearButtonsEnabled]=\"config.behavior?.filtering?.advancedFilters?.settings?.advancedClearButtonsEnabled\"\n [changeDebounceMs]=\"config.behavior?.filtering?.advancedFilters?.settings?.changeDebounceMs ?? 300\"\n [i18n]=\"getFilterI18n()\"\n [mode]=\"'filter'\"\n [showFilterSettings]=\"isCustomizationAvailable()\"\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 [praxisIconButton]=\"aiAssistantTriggerIcon()\"\n size=\"compact\"\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 ></button>\n }\n }\n @if (shouldShowFooterToolbarMain() && shouldRenderAdvancedFilter() && isCustomizationAvailable()) {\n <button\n end-actions\n type=\"button\"\n praxisIconButton=\"settings\"\n size=\"compact\"\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 ></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{--praxis-icon-button-surface-size: var(--p-actions-btn-size, var(--p-actions-btn-size-default, 36px));--praxis-icon-button-icon-size: var(--p-actions-icon-size, var(--p-actions-icon-size-default, 20px))}.praxis-icon-btn praxis-rich-content{display:inline-flex;align-items:center;justify-content:center;width:var(--praxis-icon-button-icon-size);height:var(--praxis-icon-button-icon-size);line-height:var(--praxis-icon-button-icon-size)}: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(--praxis-icon-button-icon-size);height:var(--praxis-icon-button-icon-size);line-height:var(--praxis-icon-button-icon-size)}:host ::ng-deep .praxis-icon-btn .praxis-row-action__icon .prx-rich-icon{font-size:var(--praxis-icon-button-icon-size);width:var(--praxis-icon-button-icon-size);height:var(--praxis-icon-button-icon-size);line-height:var(--praxis-icon-button-icon-size)}.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{--praxis-icon-button-surface-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, 36px))));--praxis-icon-button-icon-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, 20px))));background-image:var(--p-actions-more-btn-gradient, none);background-size:100% 100%;background-repeat:no-repeat}.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{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 .mat-mdc-table.table-rounded-bottom{border-bottom-left-radius:12px;border-bottom-right-radius:12px}: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{color:var(--md-sys-color-primary);transition:background-color .16s ease,box-shadow .16s ease,color .16s ease}.praxis-table-toolbar-action--configuration{color:var(--md-sys-color-primary)}.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].praxis-icon-button{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{display:grid;gap:4px;width:100%;min-width:0;color:var(--md-sys-color-on-surface);font-size:12px;line-height:1.2}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__track,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__segments{position:relative;display:flex;width:100%;height:8px;min-width:0;overflow:hidden;border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-outline-variant) 62%,transparent)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__bar,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__segment{display:block;height:100%;border-radius:inherit;background:var(--md-sys-color-primary)}:host ::ng-deep .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)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__bullet{display:flex;flex-direction:column;gap:4px}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__track{position:relative;display:block;width:100%;block-size:10px;overflow:hidden;border-radius:var(--pfx-micro-track-radius, 999px);background:var(--pfx-micro-track-color, var(--md-sys-color-surface-container-high, #e5e7eb))}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__range,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__actual,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__target{position:absolute}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__range{inset-block:0;display:block;block-size:100%;opacity:.32}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__actual{inset-block-start:3px;inset-inline-start:0;block-size:4px;border-radius:inherit}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__target{inset-block:0;inline-size:2px;background:var(--md-sys-color-on-surface, #111827)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__range[data-tone=success],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__actual[data-tone=success]{background:var(--p-table-state-success-fg, #168a4a)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__range[data-tone=warning],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__actual[data-tone=warning]{background:var(--p-table-state-warning-fg, #b45f06)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__range[data-tone=danger],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__range[data-tone=critical],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__actual[data-tone=danger],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__actual[data-tone=critical]{background:var(--p-table-state-danger-fg, #b3261e)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__range[data-tone=info],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__actual[data-tone=info]{background:var(--md-sys-color-primary, #2563eb)}:host ::ng-deep .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}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__label,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__value{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}: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}.pfx-cell-value--strong{font-weight:600}.pfx-cell-value--subtle{color:var(--md-sys-color-on-surface-variant);font-size:.875em}.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.table-rounded-bottom{border-bottom-left-radius:12px;border-bottom-right-radius:12px}.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: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-conditional-cell-fg, var(--p-table-conditional-row-fg, 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-conditional-row-bg, var(--p-table-row-hover-bg));box-shadow:inset 0 0 0 9999px color-mix(in srgb,currentColor 4%,transparent)}: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-conditional-row-bg, 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);box-shadow:none}: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;flex-wrap:wrap;align-items:center;gap:12px;padding:12px;margin:8px 0;border:1px solid var(--md-sys-color-error);border-radius:8px;background:var(--md-sys-color-error-container);color:var(--md-sys-color-on-error-container)}.ptable-error__icon{flex:0 0 auto;color:var(--md-sys-color-error)}.ptable-error__content{flex:1 1 18rem;min-width:0}.ptable-error__title{font-weight:600}.ptable-error__message{overflow-wrap:anywhere}.ptable-error__actions{display:flex;flex:0 1 auto;flex-wrap:wrap;align-items:center;justify-content:flex-end;gap:8px;max-width:100%}.ptable-error__retry-icon--active{animation:ptable-error-retry-spin .9s linear infinite}@keyframes ptable-error-retry-spin{to{transform:rotate(360deg)}}@media(prefers-reduced-motion:reduce){.ptable-error__retry-icon--active{animation:none}}.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,.pfx-conditional-row-surface--success,.pfx-conditional-row-surface--success td,td.pfx-conditional-cell-surface--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,.pfx-conditional-row-surface--warning,.pfx-conditional-row-surface--warning td,td.pfx-conditional-cell-surface--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,.pfx-conditional-row-surface--danger,.pfx-conditional-row-surface--danger td,td.pfx-conditional-cell-surface--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,.pfx-conditional-row-surface--highlight,.pfx-conditional-row-surface--highlight td,td.pfx-conditional-cell-surface--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:12px;border-inline:1px solid var(--p-table-border-color);background:var(--p-table-paginator-bg, var(--p-table-bg));--pdx-empty-state-action-height: var(--p-table-empty-action-size, 36px);--pdx-empty-state-transparent-margin: 0}.ptable-no-data-state ::ng-deep .empty-card{margin:0;min-block-size:clamp(9rem,22vh,13.75rem);border:0;border-radius:0;background:transparent;box-shadow:none}.ptable-no-data-state ::ng-deep .empty-card mat-card-content{display:flex;min-block-size:inherit;flex-direction:column;align-items:center;justify-content:center;padding:24px}.ptable-no-data-state ::ng-deep .empty-card .content{align-items:center;text-align:center}.ptable-no-data-state ::ng-deep .empty-card .texts{justify-items:center}.ptable-no-data-state ::ng-deep .empty-card .desc{max-width:min(100%,42rem)}.ptable-no-data-state__announcement{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}@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.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: "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$2.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: i7.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$2.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i8$2.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i8$2.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i8$2.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i8$2.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i8$2.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i8$2.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i8$2.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i8$2.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i8$2.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i14.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: "component", type: PraxisIconButtonComponent, selector: "button[praxisIconButton]", inputs: ["praxisIconButton", "size", "appearance", "presentation", "pressed", "busy"] }, { 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", "variant", "alignment", "density", "iconContainer"] }, { kind: "component", type: TableRatingCellComponent, selector: "praxis-table-rating", inputs: ["itemsCount", "value", "size", "ratingColor", "outlineColor", "ariaLabel"] }] });
|
|
58577
59029
|
}
|
|
58578
59030
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisTable, decorators: [{
|
|
58579
59031
|
type: Component,
|
|
@@ -58610,7 +59062,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
58610
59062
|
TableDefaultsProvider,
|
|
58611
59063
|
FilterConfigService,
|
|
58612
59064
|
DataFormattingService
|
|
58613
|
-
], 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<!-- Operational error state; authoring actions remain capability-gated. -->\n@if (isRemoteMode() && (schemaError || dataError)) {\n <div class=\"ptable-error\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">\n <mat-icon class=\"ptable-error__icon\" aria-hidden=\"true\">cloud_off</mat-icon>\n <div class=\"ptable-error__content\">\n <praxis-rich-content\n rootClassName=\"ptable-error__title\"\n [nodes]=\"getTableChromeTextRichContentNodes(getTableErrorTitle(), 'ptable-error__title-text')\"\n ></praxis-rich-content>\n <praxis-rich-content\n rootClassName=\"ptable-error__message\"\n [nodes]=\"getTableChromeTextRichContentNodes(getTableErrorMessage(), 'ptable-error__message-text')\"\n ></praxis-rich-content>\n </div>\n <div class=\"ptable-error__actions\">\n <button mat-flat-button color=\"primary\" [disabled]=\"isErrorRetryInProgress()\" (click)=\"retryTableError()\">\n <mat-icon [class.ptable-error__retry-icon--active]=\"isErrorRetryInProgress()\">refresh</mat-icon>\n <praxis-rich-content\n rootClassName=\"ptable-error__action-label\"\n [nodes]=\"getTableChromeTextRichContentNodes(getTableErrorRetryLabel(), 'ptable-error__action-label-text')\"\n ></praxis-rich-content>\n </button>\n @if (isCustomizationAvailable()) {\n <button mat-stroked-button (click)=\"openQuickConnect()\">\n <mat-icon>bolt</mat-icon>\n <praxis-rich-content\n rootClassName=\"ptable-error__action-label\"\n [nodes]=\"getTableChromeTextRichContentNodes(getTableSelectResourceLabel(), 'ptable-error__action-label-text')\"\n ></praxis-rich-content>\n </button>\n <button type=\"button\" praxisIconButton=\"settings\" size=\"compact\" class=\"praxis-table-toolbar-action--configuration\" data-role=\"table-settings\" data-testid=\"table-settings-trigger\"\n (click)=\"openTableSettings()\" [attr.aria-label]=\"getTableSettingsLabel()\"\n [matTooltip]=\"getTableSettingsLabel()\" matTooltipPosition=\"below\">\n ></button>\n }\n </div>\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]=\"isCustomizationAvailable()\" [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]=\"isCustomizationAvailable()\"\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]=\"isCustomizationAvailable()\"\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 [praxisIconButton]=\"aiAssistantTriggerIcon()\"\n size=\"compact\"\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 ></button>\n }\n\n @if (isCustomizationAvailable()) {\n <button end-actions type=\"button\" praxisIconButton=\"settings\" size=\"compact\" 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\"></button>\n }\n </praxis-table-toolbar>\n }\n @if (!showToolbar && isCustomizationAvailable()) {\n <div class=\"ptable-header-actions\">\n @if (shouldShowAiAssistantEntrypoint()) {\n <button\n [praxisIconButton]=\"aiAssistantTriggerIcon()\"\n size=\"compact\"\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 ></button>\n }\n <button type=\"button\" praxisIconButton=\"settings\" size=\"compact\" 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\"></button>\n @if (isRemoteMode()) {\n <button type=\"button\" praxisIconButton=\"link_off\" size=\"compact\" (click)=\"disconnect()\" [attr.aria-label]=\"getDisconnectLabel()\" [matTooltip]=\"getDisconnectTooltip()\"></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]=\"isCustomizationAvailable()\"\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]=\"isCustomizationAvailable()\"\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 [praxisIconButton]=\"aiAssistantTriggerIcon()\"\n size=\"compact\"\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 ></button>\n }\n @if (isCustomizationAvailable()) {\n <button end-actions type=\"button\" praxisIconButton=\"settings\" size=\"compact\" 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\"></button>\n }\n </praxis-table-toolbar>\n }\n @if (!showToolbar && isCustomizationAvailable()) {\n <div class=\"ptable-header-actions\">\n @if (shouldShowAiAssistantEntrypoint()) {\n <button\n [praxisIconButton]=\"aiAssistantTriggerIcon()\"\n size=\"compact\"\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 ></button>\n }\n <button type=\"button\" praxisIconButton=\"settings\" size=\"compact\" 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\"></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 type=\"button\"\n [praxisIconButton]=\"isRowExpanded(row, i)\n ? getExpansionExpandedIcon()\n : getExpansionCollapsedIcon()\"\n size=\"compact\"\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 ></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 type=\"button\" praxisIconButton=\"more_vert\" presentation=\"projected\" size=\"compact\" [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 type=\"button\" praxisIconButton=\"more_vert\" presentation=\"projected\" size=\"compact\" [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\" [ngClass]=\"getComposeValueClasses(it)\">{{ 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 type=\"button\"\n praxisIconButton=\"more_vert\"\n presentation=\"projected\"\n size=\"compact\"\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 [style.color]=\"getCanonicalIconActionColor(a.color)\"\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 type=\"button\"\n [praxisIconButton]=\"getRowMenuIcon()\"\n size=\"compact\"\n class=\"praxis-icon-btn praxis-more-btn\"\n [matMenuTriggerFor]=\"rowMoreMenu\"\n (menuOpened)=\"onRowOverflowMenuOpened(row)\"\n [style.color]=\"getCanonicalIconActionColor(getRowMenuButtonColor())\"\n [attr.aria-label]=\"getRowMenuTooltip(row)\"\n [matTooltip]=\"getRowMenuTooltip(row)\"\n matTooltipPosition=\"above\"\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 type=\"button\"\n praxisIconButton=\"more_vert\"\n presentation=\"projected\"\n size=\"compact\"\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 @case ('toggle') {\n <mat-slide-toggle\n [checked]=\"getToggleState(row, column)\"\n [disabled]=\"isToggleDisabled(row, column)\"\n [attr.aria-label]=\"getToggleAriaLabel(row, column) || 'Alternar'\"\n (change)=\"onToggleChange(row, column, $event)\"\n (click)=\"$event.stopPropagation()\"\n ></mat-slide-toggle>\n }\n @case ('rating') {\n <praxis-table-rating\n class=\"pfx-rating-cell\"\n [itemsCount]=\"getRatingMax(row, column)\"\n [value]=\"getRatingValue(row, column)\"\n [size]=\"getRatingSize(row, column)\"\n [ratingColor]=\"getRatingColor(row, column)\"\n [outlineColor]=\"getRatingOutlineColor(row, column)\"\n [ariaLabel]=\"getRatingAriaLabel(row, column) || column.header\"\n ></praxis-table-rating>\n }\n @case ('html') {\n <span [innerHTML]=\"getSafeHtml(row, column)\"></span>\n }\n @case ('compose') {\n <span class=\"pfx-cell-compose\" [ngClass]=\"getComposeClasses(row, column)\" [ngStyle]=\"getComposeGapStyle(row, column)\">\n @for (it of getComposeItems(row, column); track trackComposeItem($index, it)) {\n @switch (getItemEffectiveType(row, column, it)) {\n @case ('icon') {\n <span class=\"pfx-icon-renderer\" [style.color]=\"getIconColor(row, asItemColumn(column, it)) || null\" [ngStyle]=\"getIconStyle(row, asItemColumn(column, it))\" [attr.aria-label]=\"getIconAriaLabel(row, asItemColumn(column, it)) || null\"><praxis-rich-content [layout]=\"'inline'\" rootClassName=\"pfx-icon-renderer__content\" [nodes]=\"getIconRichContentNodes(row, 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(row, asItemColumn(column, it))\"></praxis-rich-content></span>\n }\n @case ('badge') {\n @if (shouldRenderBadge(row, asItemColumn(column, it))) {\n <span class=\"pfx-badge\" [ngClass]=\"getBadgeClasses(row, asItemColumn(column, it))\"><praxis-rich-content [layout]=\"'inline'\" rootClassName=\"pfx-badge__content\" [nodes]=\"getBadgeRichContentNodes(row, asItemColumn(column, it))\"></praxis-rich-content></span>\n }\n }\n @case ('link') {\n <a class=\"pfx-link\" [attr.href]=\"getLinkHref(row, asItemColumn(column, it)) || null\" [attr.target]=\"getLinkTarget(row, asItemColumn(column, it)) || null\" [attr.rel]=\"getLinkRel(row, asItemColumn(column, it)) || null\" (click)=\"$event.stopPropagation()\"><praxis-rich-content [layout]=\"'inline'\" rootClassName=\"pfx-link__content\" [nodes]=\"getLinkRichContentNodes(row, asItemColumn(column, it))\"></praxis-rich-content></a>\n }\n @case ('button') {\n @switch (getButtonVariant(row, asItemColumn(column, it))) {\n @case ('outlined') {\n <button mat-stroked-button [color]=\"getButtonColor(row, asItemColumn(column, it)) || null\" [disabled]=\"isButtonDisabled(row, asItemColumn(column, it))\" [attr.aria-label]=\"getButtonAriaLabel(row, asItemColumn(column, it)) || getButtonLabel(row, asItemColumn(column, it))\" (click)=\"onButtonClick(row, asItemColumn(column, it), $event)\"><praxis-rich-content [layout]=\"'inline'\" rootClassName=\"pfx-button-renderer__content\" [nodes]=\"getButtonRichContentNodes(row, asItemColumn(column, it))\"></praxis-rich-content></button>\n }\n @case ('text') {\n <button mat-button [color]=\"getButtonColor(row, asItemColumn(column, it)) || null\" [disabled]=\"isButtonDisabled(row, asItemColumn(column, it))\" [attr.aria-label]=\"getButtonAriaLabel(row, asItemColumn(column, it)) || getButtonLabel(row, asItemColumn(column, it))\" (click)=\"onButtonClick(row, asItemColumn(column, it), $event)\"><praxis-rich-content [layout]=\"'inline'\" rootClassName=\"pfx-button-renderer__content\" [nodes]=\"getButtonRichContentNodes(row, asItemColumn(column, it))\"></praxis-rich-content></button>\n }\n @default {\n <button mat-flat-button [color]=\"getButtonColor(row, asItemColumn(column, it)) || null\" [disabled]=\"isButtonDisabled(row, asItemColumn(column, it))\" [attr.aria-label]=\"getButtonAriaLabel(row, asItemColumn(column, it)) || getButtonLabel(row, asItemColumn(column, it))\" (click)=\"onButtonClick(row, asItemColumn(column, it), $event)\"><praxis-rich-content [layout]=\"'inline'\" rootClassName=\"pfx-button-renderer__content\" [nodes]=\"getButtonRichContentNodes(row, asItemColumn(column, it))\"></praxis-rich-content></button>\n }\n }\n }\n @case ('chip') {\n @if (shouldRenderChip(row, asItemColumn(column, it))) {\n <span class=\"pfx-chip\" [ngClass]=\"getChipClasses(row, asItemColumn(column, it))\"><praxis-rich-content [layout]=\"'inline'\" rootClassName=\"pfx-chip__content\" [nodes]=\"getChipRichContentNodes(row, asItemColumn(column, it))\"></praxis-rich-content></span>\n }\n }\n @case ('progress') {\n <div class=\"pfx-progress\"><praxis-rich-content rootClassName=\"pfx-progress__content\" [context]=\"getProgressRichContentContext(row, asItemColumn(column, it))\" [nodes]=\"getProgressRichContentNodes(row, asItemColumn(column, it))\"></praxis-rich-content></div>\n }\n @case ('microVisualization') {\n <span class=\"pfx-micro-viz-cell\" [innerHTML]=\"getMicroVisualizationHtml(row, asItemColumn(column, it))\"></span>\n }\n @case ('avatar') {\n <span class=\"pfx-avatar-renderer\" [ngStyle]=\"getAvatarStyle(row, asItemColumn(column, it))\" [class.shape-rounded]=\"getAvatarShape(row, asItemColumn(column, it)) === 'rounded'\" [class.shape-circle]=\"getAvatarShape(row, asItemColumn(column, it)) === 'circle'\"><praxis-rich-content rootClassName=\"pfx-avatar-renderer__content\" [nodes]=\"getAvatarRichContentNodes(row, asItemColumn(column, it))\"></praxis-rich-content></span>\n }\n @case ('toggle') {\n <mat-slide-toggle [checked]=\"getToggleState(row, asItemColumn(column, it))\" [disabled]=\"isToggleDisabled(row, asItemColumn(column, it))\" [attr.aria-label]=\"getToggleAriaLabel(row, asItemColumn(column, it)) || 'Alternar'\" (change)=\"onToggleChange(row, asItemColumn(column, it), $event)\" (click)=\"$event.stopPropagation()\"></mat-slide-toggle>\n }\n @case ('menu') {\n <button type=\"button\" praxisIconButton=\"more_vert\" presentation=\"projected\" size=\"compact\" [matMenuTriggerFor]=\"composeMenuRef\" (click)=\"$event.stopPropagation()\" [attr.aria-label]=\"getMenuAriaLabel(row, asItemColumn(column, it)) || 'Menu'\"><praxis-rich-content rootClassName=\"pfx-menu-trigger__content\" [nodes]=\"getMenuTriggerRichContentNodes()\"></praxis-rich-content></button>\n <mat-menu #composeMenuRef=\"matMenu\">\n @for (mi of getMenuItems(row, asItemColumn(column, it)); track mi.id) {\n <button mat-menu-item (click)=\"onMenuItemClick(mi, row, $event)\" [disabled]=\"!mi.__visible\"><praxis-rich-content rootClassName=\"pfx-menu-item__content\" [nodes]=\"getMenuItemRichContentNodes(mi)\"></praxis-rich-content></button>\n }\n </mat-menu>\n }\n @case ('rating') {\n <praxis-table-rating class=\"pfx-rating-cell\" [itemsCount]=\"getRatingMax(row, asItemColumn(column, it))\" [value]=\"getRatingValue(row, asItemColumn(column, it))\" [size]=\"getRatingSize(row, asItemColumn(column, it))\" [ratingColor]=\"getRatingColor(row, asItemColumn(column, it))\" [outlineColor]=\"getRatingOutlineColor(row, asItemColumn(column, it))\" [ariaLabel]=\"getRatingAriaLabel(row, asItemColumn(column, it)) || column.header\"></praxis-table-rating>\n }\n @case ('html') {\n <span [innerHTML]=\"getSafeHtml(row, asItemColumn(column, it))\"></span>\n }\n @case ('value') {\n <span class=\"pfx-cell-value\" [ngClass]=\"getComposeValueClasses(it)\">{{ getComposeItemValue(row, column, it) }}</span>\n }\n }\n }\n </span>\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 type=\"button\" praxisIconButton=\"more_vert\" presentation=\"projected\" size=\"compact\" 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 [style.color]=\"getCanonicalIconActionColor(a.color)\">\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 type=\"button\" [praxisIconButton]=\"getRowMenuIcon()\" size=\"compact\" class=\"praxis-icon-btn praxis-more-btn\"\n [matMenuTriggerFor]=\"rowMoreMenuV\"\n (menuOpened)=\"onRowOverflowMenuOpened(row)\"\n [style.color]=\"getCanonicalIconActionColor(getRowMenuButtonColor())\"\n [attr.aria-label]=\"getRowMenuTooltip(row)\"\n [matTooltip]=\"getRowMenuTooltip(row)\"\n matTooltipPosition=\"above\"></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\n class=\"ptable-no-data-state\"\n [style.--p-table-empty-action-size]=\"getNoDataStateActionSize()\"\n >\n <span class=\"ptable-no-data-state__announcement\" role=\"status\" aria-live=\"polite\">\n {{ getNoDataStateTitle() }}. {{ getNoDataStateDescription() }}\n </span>\n <praxis-empty-state-card\n [icon]=\"getNoDataStateIcon()\"\n [title]=\"getNoDataStateTitle()\"\n [description]=\"getNoDataStateDescription()\"\n [primaryAction]=\"getNoDataStatePrimaryAction()\"\n [secondaryActions]=\"getNoDataStateSecondaryActions()\"\n [inline]=\"true\"\n [tone]=\"getNoDataStateTone()\"\n [variant]=\"getNoDataStateVariant()\"\n [alignment]=\"getNoDataStateAlignment()\"\n [density]=\"getNoDataStateDensity()\"\n [iconContainer]=\"getNoDataStateIconContainer()\"\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]=\"isCustomizationAvailable()\"\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]=\"isCustomizationAvailable()\"\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 [praxisIconButton]=\"aiAssistantTriggerIcon()\"\n size=\"compact\"\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 ></button>\n }\n }\n @if (shouldShowFooterToolbarMain() && shouldRenderAdvancedFilter() && isCustomizationAvailable()) {\n <button\n end-actions\n type=\"button\"\n praxisIconButton=\"settings\"\n size=\"compact\"\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 ></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{--praxis-icon-button-surface-size: var(--p-actions-btn-size, var(--p-actions-btn-size-default, 36px));--praxis-icon-button-icon-size: var(--p-actions-icon-size, var(--p-actions-icon-size-default, 20px))}.praxis-icon-btn praxis-rich-content{display:inline-flex;align-items:center;justify-content:center;width:var(--praxis-icon-button-icon-size);height:var(--praxis-icon-button-icon-size);line-height:var(--praxis-icon-button-icon-size)}: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(--praxis-icon-button-icon-size);height:var(--praxis-icon-button-icon-size);line-height:var(--praxis-icon-button-icon-size)}:host ::ng-deep .praxis-icon-btn .praxis-row-action__icon .prx-rich-icon{font-size:var(--praxis-icon-button-icon-size);width:var(--praxis-icon-button-icon-size);height:var(--praxis-icon-button-icon-size);line-height:var(--praxis-icon-button-icon-size)}.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{--praxis-icon-button-surface-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, 36px))));--praxis-icon-button-icon-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, 20px))));background-image:var(--p-actions-more-btn-gradient, none);background-size:100% 100%;background-repeat:no-repeat}.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{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{color:var(--md-sys-color-primary);transition:background-color .16s ease,box-shadow .16s ease,color .16s ease}.praxis-table-toolbar-action--configuration{color:var(--md-sys-color-primary)}.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].praxis-icon-button{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{display:grid;gap:4px;width:100%;min-width:0;color:var(--md-sys-color-on-surface);font-size:12px;line-height:1.2}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__track,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__segments{position:relative;display:flex;width:100%;height:8px;min-width:0;overflow:hidden;border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-outline-variant) 62%,transparent)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__bar,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__segment{display:block;height:100%;border-radius:inherit;background:var(--md-sys-color-primary)}:host ::ng-deep .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)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__bullet{display:flex;flex-direction:column;gap:4px}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__track{position:relative;display:block;width:100%;block-size:10px;overflow:hidden;border-radius:var(--pfx-micro-track-radius, 999px);background:var(--pfx-micro-track-color, var(--md-sys-color-surface-container-high, #e5e7eb))}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__range,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__actual,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__target{position:absolute}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__range{inset-block:0;display:block;block-size:100%;opacity:.32}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__actual{inset-block-start:3px;inset-inline-start:0;block-size:4px;border-radius:inherit}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__target{inset-block:0;inline-size:2px;background:var(--md-sys-color-on-surface, #111827)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__range[data-tone=success],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__actual[data-tone=success]{background:var(--p-table-state-success-fg, #168a4a)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__range[data-tone=warning],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__actual[data-tone=warning]{background:var(--p-table-state-warning-fg, #b45f06)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__range[data-tone=danger],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__range[data-tone=critical],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__actual[data-tone=danger],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__actual[data-tone=critical]{background:var(--p-table-state-danger-fg, #b3261e)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__range[data-tone=info],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__actual[data-tone=info]{background:var(--md-sys-color-primary, #2563eb)}:host ::ng-deep .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}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__label,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__value{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}: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}.pfx-cell-value--strong{font-weight:600}.pfx-cell-value--subtle{color:var(--md-sys-color-on-surface-variant);font-size:.875em}.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-conditional-cell-fg, var(--p-table-conditional-row-fg, 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-conditional-row-bg, var(--p-table-row-hover-bg));box-shadow:inset 0 0 0 9999px color-mix(in srgb,currentColor 4%,transparent)}: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-conditional-row-bg, 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);box-shadow:none}: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;flex-wrap:wrap;align-items:center;gap:12px;padding:12px;margin:8px 0;border:1px solid var(--md-sys-color-error);border-radius:8px;background:var(--md-sys-color-error-container);color:var(--md-sys-color-on-error-container)}.ptable-error__icon{flex:0 0 auto;color:var(--md-sys-color-error)}.ptable-error__content{flex:1 1 18rem;min-width:0}.ptable-error__title{font-weight:600}.ptable-error__message{overflow-wrap:anywhere}.ptable-error__actions{display:flex;flex:0 1 auto;flex-wrap:wrap;align-items:center;justify-content:flex-end;gap:8px;max-width:100%}.ptable-error__retry-icon--active{animation:ptable-error-retry-spin .9s linear infinite}@keyframes ptable-error-retry-spin{to{transform:rotate(360deg)}}@media(prefers-reduced-motion:reduce){.ptable-error__retry-icon--active{animation:none}}.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,.pfx-conditional-row-surface--success,.pfx-conditional-row-surface--success td,td.pfx-conditional-cell-surface--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,.pfx-conditional-row-surface--warning,.pfx-conditional-row-surface--warning td,td.pfx-conditional-cell-surface--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,.pfx-conditional-row-surface--danger,.pfx-conditional-row-surface--danger td,td.pfx-conditional-cell-surface--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,.pfx-conditional-row-surface--highlight,.pfx-conditional-row-surface--highlight td,td.pfx-conditional-cell-surface--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:12px;border-inline:1px solid var(--p-table-border-color);background:var(--p-table-paginator-bg, var(--p-table-bg));--pdx-empty-state-action-height: var(--p-table-empty-action-size, 36px);--pdx-empty-state-transparent-margin: 0}.ptable-no-data-state ::ng-deep .empty-card{margin:0;min-block-size:clamp(9rem,22vh,13.75rem);border:0;border-radius:0;background:transparent;box-shadow:none}.ptable-no-data-state ::ng-deep .empty-card mat-card-content{display:flex;min-block-size:inherit;flex-direction:column;align-items:center;justify-content:center;padding:24px}.ptable-no-data-state ::ng-deep .empty-card .content{align-items:center;text-align:center}.ptable-no-data-state ::ng-deep .empty-card .texts{justify-items:center}.ptable-no-data-state ::ng-deep .empty-card .desc{max-width:min(100%,42rem)}.ptable-no-data-state__announcement{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}@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"] }]
|
|
59065
|
+
], 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<!-- Operational error state; authoring actions remain capability-gated. -->\n@if (isRemoteMode() && (schemaError || dataError)) {\n <div class=\"ptable-error\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">\n <mat-icon class=\"ptable-error__icon\" aria-hidden=\"true\">cloud_off</mat-icon>\n <div class=\"ptable-error__content\">\n <praxis-rich-content\n rootClassName=\"ptable-error__title\"\n [nodes]=\"getTableChromeTextRichContentNodes(getTableErrorTitle(), 'ptable-error__title-text')\"\n ></praxis-rich-content>\n <praxis-rich-content\n rootClassName=\"ptable-error__message\"\n [nodes]=\"getTableChromeTextRichContentNodes(getTableErrorMessage(), 'ptable-error__message-text')\"\n ></praxis-rich-content>\n </div>\n <div class=\"ptable-error__actions\">\n <button mat-flat-button color=\"primary\" [disabled]=\"isErrorRetryInProgress()\" (click)=\"retryTableError()\">\n <mat-icon [class.ptable-error__retry-icon--active]=\"isErrorRetryInProgress()\">refresh</mat-icon>\n <praxis-rich-content\n rootClassName=\"ptable-error__action-label\"\n [nodes]=\"getTableChromeTextRichContentNodes(getTableErrorRetryLabel(), 'ptable-error__action-label-text')\"\n ></praxis-rich-content>\n </button>\n @if (isCustomizationAvailable()) {\n <button mat-stroked-button (click)=\"openQuickConnect()\">\n <mat-icon>bolt</mat-icon>\n <praxis-rich-content\n rootClassName=\"ptable-error__action-label\"\n [nodes]=\"getTableChromeTextRichContentNodes(getTableSelectResourceLabel(), 'ptable-error__action-label-text')\"\n ></praxis-rich-content>\n </button>\n <button type=\"button\" praxisIconButton=\"settings\" size=\"compact\" class=\"praxis-table-toolbar-action--configuration\" data-role=\"table-settings\" data-testid=\"table-settings-trigger\"\n (click)=\"openTableSettings()\" [attr.aria-label]=\"getTableSettingsLabel()\"\n [matTooltip]=\"getTableSettingsLabel()\" matTooltipPosition=\"below\">\n ></button>\n }\n </div>\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]=\"isCustomizationAvailable()\" [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]=\"getAdvancedFilterFormId()\"\n [persistenceKey]=\"getAdvancedFilterPersistenceKey()\"\n [fieldMetadata]=\"getAdvancedFilterFieldMetadata()\"\n [enableCustomization]=\"isCustomizationAvailable()\"\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 [advancedOpenMode]=\"getAdvancedFilterOpenMode()\"\n [advancedClearButtonsEnabled]=\"config.behavior?.filtering?.advancedFilters?.settings?.advancedClearButtonsEnabled\"\n [changeDebounceMs]=\"config.behavior?.filtering?.advancedFilters?.settings?.changeDebounceMs ?? 300\"\n [i18n]=\"getFilterI18n()\"\n [mode]=\"'filter'\"\n [showFilterSettings]=\"isCustomizationAvailable()\"\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 [praxisIconButton]=\"aiAssistantTriggerIcon()\"\n size=\"compact\"\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 ></button>\n }\n\n @if (isCustomizationAvailable()) {\n <button end-actions type=\"button\" praxisIconButton=\"settings\" size=\"compact\" 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\"></button>\n }\n </praxis-table-toolbar>\n }\n @if (!showToolbar && isCustomizationAvailable()) {\n <div class=\"ptable-header-actions\">\n @if (shouldShowAiAssistantEntrypoint()) {\n <button\n [praxisIconButton]=\"aiAssistantTriggerIcon()\"\n size=\"compact\"\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 ></button>\n }\n <button type=\"button\" praxisIconButton=\"settings\" size=\"compact\" 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\"></button>\n @if (isRemoteMode()) {\n <button type=\"button\" praxisIconButton=\"link_off\" size=\"compact\" (click)=\"disconnect()\" [attr.aria-label]=\"getDisconnectLabel()\" [matTooltip]=\"getDisconnectTooltip()\"></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]=\"getAdvancedFilterFormId()\"\n [persistenceKey]=\"getAdvancedFilterPersistenceKey()\"\n [fieldMetadata]=\"getAdvancedFilterFieldMetadata()\"\n [enableCustomization]=\"isCustomizationAvailable()\"\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 [advancedOpenMode]=\"getAdvancedFilterOpenMode()\"\n [advancedClearButtonsEnabled]=\"config.behavior?.filtering?.advancedFilters?.settings?.advancedClearButtonsEnabled\"\n [changeDebounceMs]=\"config.behavior?.filtering?.advancedFilters?.settings?.changeDebounceMs ?? 300\"\n [i18n]=\"getFilterI18n()\"\n [mode]=\"'filter'\"\n [showFilterSettings]=\"isCustomizationAvailable()\"\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 [praxisIconButton]=\"aiAssistantTriggerIcon()\"\n size=\"compact\"\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 ></button>\n }\n @if (isCustomizationAvailable()) {\n <button end-actions type=\"button\" praxisIconButton=\"settings\" size=\"compact\" 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\"></button>\n }\n </praxis-table-toolbar>\n }\n @if (!showToolbar && isCustomizationAvailable()) {\n <div class=\"ptable-header-actions\">\n @if (shouldShowAiAssistantEntrypoint()) {\n <button\n [praxisIconButton]=\"aiAssistantTriggerIcon()\"\n size=\"compact\"\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 ></button>\n }\n <button type=\"button\" praxisIconButton=\"settings\" size=\"compact\" 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\"></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 [class.table-rounded-bottom]=\"!hasBottomTableStack()\">\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.table-rounded-bottom]=\"!hasBottomTableStack()\"\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 type=\"button\"\n [praxisIconButton]=\"isRowExpanded(row, i)\n ? getExpansionExpandedIcon()\n : getExpansionCollapsedIcon()\"\n size=\"compact\"\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 ></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 [mat-sort-header]=\"column.field\"\n [disabled]=\"!getSortingEnabled() || column.sortable === false || isColumnResizeActive()\"\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 (keydown)=\"onColumnHeaderReorderKeydown($event, column)\"\n >\n <span class=\"praxis-header-sort-trigger\">\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 [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 type=\"button\" praxisIconButton=\"more_vert\" presentation=\"projected\" size=\"compact\" [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))\" [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 type=\"button\" praxisIconButton=\"more_vert\" presentation=\"projected\" size=\"compact\" [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\" [ngClass]=\"getComposeValueClasses(it)\">{{ 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 layout=\"inline\"\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 type=\"button\"\n praxisIconButton=\"more_vert\"\n presentation=\"projected\"\n size=\"compact\"\n class=\"praxis-icon-btn\"\n [class.praxis-icon-btn--workflow]=\"isWorkflowRowAction(a)\"\n [class.praxis-icon-btn--blocked]=\"isBlockedWorkflowRowAction(a, row)\"\n [busy]=\"isRowActionOpening(a, row)\"\n [disabled]=\"isActionDisabled(a, row) || isRowActionOpening(a, row)\"\n (click)=\"onRowAction(getActionId(a), row, $event, getRowActionRuntimeOptions(a, row))\"\n [attr.aria-label]=\"a.label || getActionId(a)\"\n [style.color]=\"getCanonicalIconActionColor(a.color)\"\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) || isRowActionOpening(a, row)\"\n [attr.aria-busy]=\"isRowActionOpening(a, row) ? 'true' : null\"\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 #rowMoreMenuTrigger=\"matMenuTrigger\"\n type=\"button\"\n [praxisIconButton]=\"getRowMenuIcon()\"\n size=\"compact\"\n class=\"praxis-icon-btn praxis-more-btn\"\n [matMenuTriggerFor]=\"rowMoreMenu\"\n (menuOpened)=\"activeRowOverflowMenuTrigger = rowMoreMenuTrigger; onRowOverflowMenuOpened(row)\"\n [style.color]=\"getCanonicalIconActionColor(getRowMenuButtonColor())\"\n [attr.aria-label]=\"getRowMenuTooltip(row)\"\n [matTooltip]=\"getRowMenuTooltip(row)\"\n matTooltipPosition=\"above\"\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)=\"onOverflowRowAction(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 [class.table-rounded-bottom]=\"!hasBottomTableStack()\"\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 type=\"button\"\n praxisIconButton=\"more_vert\"\n presentation=\"projected\"\n size=\"compact\"\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 @case ('toggle') {\n <mat-slide-toggle\n [checked]=\"getToggleState(row, column)\"\n [disabled]=\"isToggleDisabled(row, column)\"\n [aria-label]=\"getToggleAriaLabel(row, column) || 'Alternar'\"\n (change)=\"onToggleChange(row, column, $event)\"\n (click)=\"$event.stopPropagation()\"\n ></mat-slide-toggle>\n }\n @case ('rating') {\n <praxis-table-rating\n class=\"pfx-rating-cell\"\n [itemsCount]=\"getRatingMax(row, column)\"\n [value]=\"getRatingValue(row, column)\"\n [size]=\"getRatingSize(row, column)\"\n [ratingColor]=\"getRatingColor(row, column)\"\n [outlineColor]=\"getRatingOutlineColor(row, column)\"\n [ariaLabel]=\"getRatingAriaLabel(row, column) || column.header\"\n ></praxis-table-rating>\n }\n @case ('html') {\n <span [innerHTML]=\"getSafeHtml(row, column)\"></span>\n }\n @case ('compose') {\n <span class=\"pfx-cell-compose\" [ngClass]=\"getComposeClasses(row, column)\" [ngStyle]=\"getComposeGapStyle(row, column)\">\n @for (it of getComposeItems(row, column); track trackComposeItem($index, it)) {\n @switch (getItemEffectiveType(row, column, it)) {\n @case ('icon') {\n <span class=\"pfx-icon-renderer\" [style.color]=\"getIconColor(row, asItemColumn(column, it)) || null\" [ngStyle]=\"getIconStyle(row, asItemColumn(column, it))\" [attr.aria-label]=\"getIconAriaLabel(row, asItemColumn(column, it)) || null\"><praxis-rich-content [layout]=\"'inline'\" rootClassName=\"pfx-icon-renderer__content\" [nodes]=\"getIconRichContentNodes(row, 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(row, asItemColumn(column, it))\"></praxis-rich-content></span>\n }\n @case ('badge') {\n @if (shouldRenderBadge(row, asItemColumn(column, it))) {\n <span class=\"pfx-badge\" [ngClass]=\"getBadgeClasses(row, asItemColumn(column, it))\"><praxis-rich-content [layout]=\"'inline'\" rootClassName=\"pfx-badge__content\" [nodes]=\"getBadgeRichContentNodes(row, asItemColumn(column, it))\"></praxis-rich-content></span>\n }\n }\n @case ('link') {\n <a class=\"pfx-link\" [attr.href]=\"getLinkHref(row, asItemColumn(column, it)) || null\" [attr.target]=\"getLinkTarget(row, asItemColumn(column, it)) || null\" [attr.rel]=\"getLinkRel(row, asItemColumn(column, it)) || null\" (click)=\"$event.stopPropagation()\"><praxis-rich-content [layout]=\"'inline'\" rootClassName=\"pfx-link__content\" [nodes]=\"getLinkRichContentNodes(row, asItemColumn(column, it))\"></praxis-rich-content></a>\n }\n @case ('button') {\n @switch (getButtonVariant(row, asItemColumn(column, it))) {\n @case ('outlined') {\n <button mat-stroked-button [color]=\"getButtonColor(row, asItemColumn(column, it)) || null\" [disabled]=\"isButtonDisabled(row, asItemColumn(column, it))\" [attr.aria-label]=\"getButtonAriaLabel(row, asItemColumn(column, it)) || getButtonLabel(row, asItemColumn(column, it))\" (click)=\"onButtonClick(row, asItemColumn(column, it), $event)\"><praxis-rich-content [layout]=\"'inline'\" rootClassName=\"pfx-button-renderer__content\" [nodes]=\"getButtonRichContentNodes(row, asItemColumn(column, it))\"></praxis-rich-content></button>\n }\n @case ('text') {\n <button mat-button [color]=\"getButtonColor(row, asItemColumn(column, it)) || null\" [disabled]=\"isButtonDisabled(row, asItemColumn(column, it))\" [attr.aria-label]=\"getButtonAriaLabel(row, asItemColumn(column, it)) || getButtonLabel(row, asItemColumn(column, it))\" (click)=\"onButtonClick(row, asItemColumn(column, it), $event)\"><praxis-rich-content [layout]=\"'inline'\" rootClassName=\"pfx-button-renderer__content\" [nodes]=\"getButtonRichContentNodes(row, asItemColumn(column, it))\"></praxis-rich-content></button>\n }\n @default {\n <button mat-flat-button [color]=\"getButtonColor(row, asItemColumn(column, it)) || null\" [disabled]=\"isButtonDisabled(row, asItemColumn(column, it))\" [attr.aria-label]=\"getButtonAriaLabel(row, asItemColumn(column, it)) || getButtonLabel(row, asItemColumn(column, it))\" (click)=\"onButtonClick(row, asItemColumn(column, it), $event)\"><praxis-rich-content [layout]=\"'inline'\" rootClassName=\"pfx-button-renderer__content\" [nodes]=\"getButtonRichContentNodes(row, asItemColumn(column, it))\"></praxis-rich-content></button>\n }\n }\n }\n @case ('chip') {\n @if (shouldRenderChip(row, asItemColumn(column, it))) {\n <span class=\"pfx-chip\" [ngClass]=\"getChipClasses(row, asItemColumn(column, it))\"><praxis-rich-content [layout]=\"'inline'\" rootClassName=\"pfx-chip__content\" [nodes]=\"getChipRichContentNodes(row, asItemColumn(column, it))\"></praxis-rich-content></span>\n }\n }\n @case ('progress') {\n <div class=\"pfx-progress\"><praxis-rich-content rootClassName=\"pfx-progress__content\" [context]=\"getProgressRichContentContext(row, asItemColumn(column, it))\" [nodes]=\"getProgressRichContentNodes(row, asItemColumn(column, it))\"></praxis-rich-content></div>\n }\n @case ('microVisualization') {\n <span class=\"pfx-micro-viz-cell\" [innerHTML]=\"getMicroVisualizationHtml(row, asItemColumn(column, it))\"></span>\n }\n @case ('avatar') {\n <span class=\"pfx-avatar-renderer\" [ngStyle]=\"getAvatarStyle(row, asItemColumn(column, it))\" [class.shape-rounded]=\"getAvatarShape(row, asItemColumn(column, it)) === 'rounded'\" [class.shape-circle]=\"getAvatarShape(row, asItemColumn(column, it)) === 'circle'\"><praxis-rich-content rootClassName=\"pfx-avatar-renderer__content\" [nodes]=\"getAvatarRichContentNodes(row, asItemColumn(column, it))\"></praxis-rich-content></span>\n }\n @case ('toggle') {\n <mat-slide-toggle [checked]=\"getToggleState(row, asItemColumn(column, it))\" [disabled]=\"isToggleDisabled(row, asItemColumn(column, it))\" [aria-label]=\"getToggleAriaLabel(row, asItemColumn(column, it)) || 'Alternar'\" (change)=\"onToggleChange(row, asItemColumn(column, it), $event)\" (click)=\"$event.stopPropagation()\"></mat-slide-toggle>\n }\n @case ('menu') {\n <button type=\"button\" praxisIconButton=\"more_vert\" presentation=\"projected\" size=\"compact\" [matMenuTriggerFor]=\"composeMenuRef\" (click)=\"$event.stopPropagation()\" [attr.aria-label]=\"getMenuAriaLabel(row, asItemColumn(column, it)) || 'Menu'\"><praxis-rich-content rootClassName=\"pfx-menu-trigger__content\" [nodes]=\"getMenuTriggerRichContentNodes()\"></praxis-rich-content></button>\n <mat-menu #composeMenuRef=\"matMenu\">\n @for (mi of getMenuItems(row, asItemColumn(column, it)); track mi.id) {\n <button mat-menu-item (click)=\"onMenuItemClick(mi, row, $event)\" [disabled]=\"!mi.__visible\"><praxis-rich-content rootClassName=\"pfx-menu-item__content\" [nodes]=\"getMenuItemRichContentNodes(mi)\"></praxis-rich-content></button>\n }\n </mat-menu>\n }\n @case ('rating') {\n <praxis-table-rating class=\"pfx-rating-cell\" [itemsCount]=\"getRatingMax(row, asItemColumn(column, it))\" [value]=\"getRatingValue(row, asItemColumn(column, it))\" [size]=\"getRatingSize(row, asItemColumn(column, it))\" [ratingColor]=\"getRatingColor(row, asItemColumn(column, it))\" [outlineColor]=\"getRatingOutlineColor(row, asItemColumn(column, it))\" [ariaLabel]=\"getRatingAriaLabel(row, asItemColumn(column, it)) || column.header\"></praxis-table-rating>\n }\n @case ('html') {\n <span [innerHTML]=\"getSafeHtml(row, asItemColumn(column, it))\"></span>\n }\n @case ('value') {\n <span class=\"pfx-cell-value\" [ngClass]=\"getComposeValueClasses(it)\">{{ getComposeItemValue(row, column, it) }}</span>\n }\n }\n }\n </span>\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 type=\"button\" praxisIconButton=\"more_vert\" presentation=\"projected\" size=\"compact\" class=\"praxis-icon-btn\"\n [class.praxis-icon-btn--workflow]=\"isWorkflowRowAction(a)\"\n [class.praxis-icon-btn--blocked]=\"isBlockedWorkflowRowAction(a, row)\"\n [busy]=\"isRowActionOpening(a, row)\"\n [disabled]=\"isActionDisabled(a, row) || isRowActionOpening(a, row)\"\n (click)=\"onRowAction(getActionId(a), row, $event, getRowActionRuntimeOptions(a, row))\"\n [attr.aria-label]=\"a.label || getActionId(a)\"\n [style.color]=\"getCanonicalIconActionColor(a.color)\">\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) || isRowActionOpening(a, row)\"\n [attr.aria-busy]=\"isRowActionOpening(a, row) ? 'true' : null\"\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 #rowMoreMenuTriggerV=\"matMenuTrigger\" type=\"button\" [praxisIconButton]=\"getRowMenuIcon()\" size=\"compact\" class=\"praxis-icon-btn praxis-more-btn\"\n [matMenuTriggerFor]=\"rowMoreMenuV\"\n (menuOpened)=\"activeRowOverflowMenuTrigger = rowMoreMenuTriggerV; onRowOverflowMenuOpened(row)\"\n [style.color]=\"getCanonicalIconActionColor(getRowMenuButtonColor())\"\n [attr.aria-label]=\"getRowMenuTooltip(row)\"\n [matTooltip]=\"getRowMenuTooltip(row)\"\n matTooltipPosition=\"above\"></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)=\"onOverflowRowAction(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\n class=\"ptable-no-data-state\"\n [style.--p-table-empty-action-size]=\"getNoDataStateActionSize()\"\n >\n <span class=\"ptable-no-data-state__announcement\" role=\"status\" aria-live=\"polite\">\n {{ getNoDataStateTitle() }}. {{ getNoDataStateDescription() }}\n </span>\n <praxis-empty-state-card\n [icon]=\"getNoDataStateIcon()\"\n [title]=\"getNoDataStateTitle()\"\n [description]=\"getNoDataStateDescription()\"\n [primaryAction]=\"getNoDataStatePrimaryAction()\"\n [secondaryActions]=\"getNoDataStateSecondaryActions()\"\n [inline]=\"true\"\n [tone]=\"getNoDataStateTone()\"\n [variant]=\"getNoDataStateVariant()\"\n [alignment]=\"getNoDataStateAlignment()\"\n [density]=\"getNoDataStateDensity()\"\n [iconContainer]=\"getNoDataStateIconContainer()\"\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]=\"getAdvancedFilterFormId()\"\n [persistenceKey]=\"getAdvancedFilterPersistenceKey()\"\n [fieldMetadata]=\"getAdvancedFilterFieldMetadata()\"\n [enableCustomization]=\"isCustomizationAvailable()\"\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 [advancedOpenMode]=\"getAdvancedFilterOpenMode()\"\n [advancedClearButtonsEnabled]=\"config.behavior?.filtering?.advancedFilters?.settings?.advancedClearButtonsEnabled\"\n [changeDebounceMs]=\"config.behavior?.filtering?.advancedFilters?.settings?.changeDebounceMs ?? 300\"\n [i18n]=\"getFilterI18n()\"\n [mode]=\"'filter'\"\n [showFilterSettings]=\"isCustomizationAvailable()\"\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 [praxisIconButton]=\"aiAssistantTriggerIcon()\"\n size=\"compact\"\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 ></button>\n }\n }\n @if (shouldShowFooterToolbarMain() && shouldRenderAdvancedFilter() && isCustomizationAvailable()) {\n <button\n end-actions\n type=\"button\"\n praxisIconButton=\"settings\"\n size=\"compact\"\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 ></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{--praxis-icon-button-surface-size: var(--p-actions-btn-size, var(--p-actions-btn-size-default, 36px));--praxis-icon-button-icon-size: var(--p-actions-icon-size, var(--p-actions-icon-size-default, 20px))}.praxis-icon-btn praxis-rich-content{display:inline-flex;align-items:center;justify-content:center;width:var(--praxis-icon-button-icon-size);height:var(--praxis-icon-button-icon-size);line-height:var(--praxis-icon-button-icon-size)}: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(--praxis-icon-button-icon-size);height:var(--praxis-icon-button-icon-size);line-height:var(--praxis-icon-button-icon-size)}:host ::ng-deep .praxis-icon-btn .praxis-row-action__icon .prx-rich-icon{font-size:var(--praxis-icon-button-icon-size);width:var(--praxis-icon-button-icon-size);height:var(--praxis-icon-button-icon-size);line-height:var(--praxis-icon-button-icon-size)}.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{--praxis-icon-button-surface-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, 36px))));--praxis-icon-button-icon-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, 20px))));background-image:var(--p-actions-more-btn-gradient, none);background-size:100% 100%;background-repeat:no-repeat}.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{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 .mat-mdc-table.table-rounded-bottom{border-bottom-left-radius:12px;border-bottom-right-radius:12px}: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{color:var(--md-sys-color-primary);transition:background-color .16s ease,box-shadow .16s ease,color .16s ease}.praxis-table-toolbar-action--configuration{color:var(--md-sys-color-primary)}.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].praxis-icon-button{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{display:grid;gap:4px;width:100%;min-width:0;color:var(--md-sys-color-on-surface);font-size:12px;line-height:1.2}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__track,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__segments{position:relative;display:flex;width:100%;height:8px;min-width:0;overflow:hidden;border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-outline-variant) 62%,transparent)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__bar,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__segment{display:block;height:100%;border-radius:inherit;background:var(--md-sys-color-primary)}:host ::ng-deep .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)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__bullet{display:flex;flex-direction:column;gap:4px}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__track{position:relative;display:block;width:100%;block-size:10px;overflow:hidden;border-radius:var(--pfx-micro-track-radius, 999px);background:var(--pfx-micro-track-color, var(--md-sys-color-surface-container-high, #e5e7eb))}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__range,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__actual,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__target{position:absolute}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__range{inset-block:0;display:block;block-size:100%;opacity:.32}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__actual{inset-block-start:3px;inset-inline-start:0;block-size:4px;border-radius:inherit}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__target{inset-block:0;inline-size:2px;background:var(--md-sys-color-on-surface, #111827)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__range[data-tone=success],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__actual[data-tone=success]{background:var(--p-table-state-success-fg, #168a4a)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__range[data-tone=warning],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__actual[data-tone=warning]{background:var(--p-table-state-warning-fg, #b45f06)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__range[data-tone=danger],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__range[data-tone=critical],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__actual[data-tone=danger],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__actual[data-tone=critical]{background:var(--p-table-state-danger-fg, #b3261e)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__range[data-tone=info],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__actual[data-tone=info]{background:var(--md-sys-color-primary, #2563eb)}:host ::ng-deep .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}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__label,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__value{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}: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}.pfx-cell-value--strong{font-weight:600}.pfx-cell-value--subtle{color:var(--md-sys-color-on-surface-variant);font-size:.875em}.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.table-rounded-bottom{border-bottom-left-radius:12px;border-bottom-right-radius:12px}.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: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-conditional-cell-fg, var(--p-table-conditional-row-fg, 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-conditional-row-bg, var(--p-table-row-hover-bg));box-shadow:inset 0 0 0 9999px color-mix(in srgb,currentColor 4%,transparent)}: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-conditional-row-bg, 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);box-shadow:none}: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;flex-wrap:wrap;align-items:center;gap:12px;padding:12px;margin:8px 0;border:1px solid var(--md-sys-color-error);border-radius:8px;background:var(--md-sys-color-error-container);color:var(--md-sys-color-on-error-container)}.ptable-error__icon{flex:0 0 auto;color:var(--md-sys-color-error)}.ptable-error__content{flex:1 1 18rem;min-width:0}.ptable-error__title{font-weight:600}.ptable-error__message{overflow-wrap:anywhere}.ptable-error__actions{display:flex;flex:0 1 auto;flex-wrap:wrap;align-items:center;justify-content:flex-end;gap:8px;max-width:100%}.ptable-error__retry-icon--active{animation:ptable-error-retry-spin .9s linear infinite}@keyframes ptable-error-retry-spin{to{transform:rotate(360deg)}}@media(prefers-reduced-motion:reduce){.ptable-error__retry-icon--active{animation:none}}.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,.pfx-conditional-row-surface--success,.pfx-conditional-row-surface--success td,td.pfx-conditional-cell-surface--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,.pfx-conditional-row-surface--warning,.pfx-conditional-row-surface--warning td,td.pfx-conditional-cell-surface--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,.pfx-conditional-row-surface--danger,.pfx-conditional-row-surface--danger td,td.pfx-conditional-cell-surface--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,.pfx-conditional-row-surface--highlight,.pfx-conditional-row-surface--highlight td,td.pfx-conditional-cell-surface--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:12px;border-inline:1px solid var(--p-table-border-color);background:var(--p-table-paginator-bg, var(--p-table-bg));--pdx-empty-state-action-height: var(--p-table-empty-action-size, 36px);--pdx-empty-state-transparent-margin: 0}.ptable-no-data-state ::ng-deep .empty-card{margin:0;min-block-size:clamp(9rem,22vh,13.75rem);border:0;border-radius:0;background:transparent;box-shadow:none}.ptable-no-data-state ::ng-deep .empty-card mat-card-content{display:flex;min-block-size:inherit;flex-direction:column;align-items:center;justify-content:center;padding:24px}.ptable-no-data-state ::ng-deep .empty-card .content{align-items:center;text-align:center}.ptable-no-data-state ::ng-deep .empty-card .texts{justify-items:center}.ptable-no-data-state ::ng-deep .empty-card .desc{max-width:min(100%,42rem)}.ptable-no-data-state__announcement{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}@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"] }]
|
|
58614
59066
|
}], 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: [{
|
|
58615
59067
|
type: Inject,
|
|
58616
59068
|
args: [ASYNC_CONFIG_STORAGE]
|