@praxisui/table 10.0.0-rc.41 → 10.0.0-rc.42
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -4
- package/ai/component-registry.json +2 -2
- package/fesm2022/praxisui-table-authoring.mjs +1 -1
- package/fesm2022/{praxisui-table-filter-form-dialog-host.component-Cst6rkAK.mjs → praxisui-table-filter-form-dialog-host.component-sMT_87rK.mjs} +1 -1
- package/fesm2022/{praxisui-table-praxisui-table-CdEy3SYM.mjs → praxisui-table-praxisui-table-DQZySZjy.mjs} +184 -28
- package/fesm2022/{praxisui-table-table-agentic-authoring-turn-flow-sQz0BpSY.mjs → praxisui-table-table-agentic-authoring-turn-flow-DWd6fB1R.mjs} +1 -1
- package/fesm2022/{praxisui-table-table-ai.adapter-DEetBMv9.mjs → praxisui-table-table-ai.adapter-YZzruRc6.mjs} +1 -1
- package/fesm2022/praxisui-table.mjs +1 -1
- package/package.json +10 -10
- package/types/praxisui-table.d.ts +7 -0
|
@@ -78,7 +78,7 @@ import * as i6$1 from '@praxisui/dialog';
|
|
|
78
78
|
import * as i8$1 from '@angular/router';
|
|
79
79
|
import * as i11$1 from '@angular/cdk/scrolling';
|
|
80
80
|
import { ScrollingModule, CdkVirtualScrollViewport } from '@angular/cdk/scrolling';
|
|
81
|
-
import { sanitizePraxisAssistantText, createPraxisAssistantViewportLayout, AiBackendApiService, AgenticAuthoringTurnClientService, PraxisAssistantSessionRegistryService, PraxisAssistantTurnOrchestratorService, PraxisAiAssistantShellComponent } from '@praxisui/ai';
|
|
81
|
+
import { PRAXIS_ASSISTANT_VOICE_INPUT_MODE, PRAXIS_ASSISTANT_VOICE_LANGUAGE, sanitizePraxisAssistantText, createPraxisAssistantViewportLayout, AiBackendApiService, AgenticAuthoringTurnClientService, PraxisAssistantSessionRegistryService, PraxisAssistantTurnOrchestratorService, PraxisAiAssistantShellComponent } from '@praxisui/ai';
|
|
82
82
|
import { toCellClassAndStyle, RuleEffectsPanelComponent } from '@praxisui/table-rule-builder';
|
|
83
83
|
import * as i7$3 from '@angular/material/autocomplete';
|
|
84
84
|
import { MatAutocompleteModule } from '@angular/material/autocomplete';
|
|
@@ -18093,7 +18093,7 @@ class PraxisFilter {
|
|
|
18093
18093
|
this.advancedOpen = true;
|
|
18094
18094
|
this.saveConfig();
|
|
18095
18095
|
try {
|
|
18096
|
-
const { FilterFormDialogHostComponent } = await import('./praxisui-table-filter-form-dialog-host.component-
|
|
18096
|
+
const { FilterFormDialogHostComponent } = await import('./praxisui-table-filter-form-dialog-host.component-sMT_87rK.mjs');
|
|
18097
18097
|
const formId = this.formId || this.filterId || 'filter';
|
|
18098
18098
|
const ref = this.dialog.open(FilterFormDialogHostComponent, {
|
|
18099
18099
|
width: '780px',
|
|
@@ -20582,7 +20582,7 @@ function tableDetailAuthoringIssues(config) {
|
|
|
20582
20582
|
|| (detail.presentation?.initiallyCollapsed !== undefined && typeof detail.presentation.initiallyCollapsed !== 'boolean')
|
|
20583
20583
|
|| (detail.presentation?.bottomStackPosition !== undefined && !['beforeControls', 'afterControls'].includes(detail.presentation.bottomStackPosition))
|
|
20584
20584
|
|| (detail.presentation?.emptyBehavior !== undefined && !['message', 'hide'].includes(detail.presentation.emptyBehavior))
|
|
20585
|
-
|| (detail.source?.mode !== undefined && !['inline', 'resource', 'resourcePath', 'hypermedia'].includes(detail.source.mode))
|
|
20585
|
+
|| (detail.source?.mode !== undefined && !['inline', 'resource', 'resourcePath', 'hypermedia', 'schema'].includes(detail.source.mode))
|
|
20586
20586
|
|| (detail.source?.inlineSchema !== undefined && !isObject(detail.source.inlineSchema))
|
|
20587
20587
|
|| (detail.source?.inlineSchema?.items !== undefined && !Array.isArray(detail.source.inlineSchema.items))
|
|
20588
20588
|
|| (resource !== undefined && !isObject(resource))
|
|
@@ -21931,8 +21931,8 @@ class PraxisTable {
|
|
|
21931
21931
|
queryContextChange = new EventEmitter();
|
|
21932
21932
|
activeCrossFilters = [];
|
|
21933
21933
|
aiContext = null;
|
|
21934
|
-
aiAssistantVoiceInputMode =
|
|
21935
|
-
aiAssistantVoiceLanguage =
|
|
21934
|
+
aiAssistantVoiceInputMode = inject(PRAXIS_ASSISTANT_VOICE_INPUT_MODE);
|
|
21935
|
+
aiAssistantVoiceLanguage = inject(PRAXIS_ASSISTANT_VOICE_LANGUAGE);
|
|
21936
21936
|
advancedFilterValue = {};
|
|
21937
21937
|
activeQuickFilterId = null;
|
|
21938
21938
|
quickFilterBaseCriteria = null;
|
|
@@ -22020,15 +22020,18 @@ class PraxisTable {
|
|
|
22020
22020
|
columnRuntimeMutationOperationCounter = 0;
|
|
22021
22021
|
latestColumnRuntimeMutationOperationId = 0;
|
|
22022
22022
|
persistenceContextEpoch = 0;
|
|
22023
|
+
schemaPrefsContextEpoch = 0;
|
|
22023
22024
|
persistenceContextDestroyed = false;
|
|
22024
22025
|
/** Fence delayed work; requests already sent are not retroactively canceled. */
|
|
22025
22026
|
persistenceGuard(allowVolatile = false, identity = 'runtime') {
|
|
22026
22027
|
const epoch = this.persistenceContextEpoch ?? 0;
|
|
22028
|
+
const schemaEpoch = this.schemaPrefsContextEpoch ?? 0;
|
|
22027
22029
|
const strategy = this.configPersistenceStrategy;
|
|
22028
22030
|
const hostIdentity = JSON.stringify([this.tableId, this.componentInstanceId]);
|
|
22029
22031
|
const binding = identity === 'runtime' ? JSON.stringify(this.resourcePath) : null;
|
|
22030
22032
|
return () => !this.persistenceContextDestroyed && (allowVolatile || this.configPersistenceStrategy !== 'volatile')
|
|
22031
22033
|
&& this.configPersistenceStrategy === strategy && (this.persistenceContextEpoch ?? 0) === epoch
|
|
22034
|
+
&& (identity !== 'owner' || (this.schemaPrefsContextEpoch ?? 0) === schemaEpoch)
|
|
22032
22035
|
&& JSON.stringify([this.tableId, this.componentInstanceId]) === hostIdentity
|
|
22033
22036
|
&& (binding === null || JSON.stringify(this.resourcePath) === binding);
|
|
22034
22037
|
}
|
|
@@ -22966,6 +22969,8 @@ class PraxisTable {
|
|
|
22966
22969
|
const filtering = config?.behavior?.filtering;
|
|
22967
22970
|
if (filtering?.enabled === false)
|
|
22968
22971
|
return false;
|
|
22972
|
+
if (config?.toolbar?.filters?.enabled === false)
|
|
22973
|
+
return false;
|
|
22969
22974
|
const advancedFilters = filtering?.advancedFilters;
|
|
22970
22975
|
if (!advancedFilters || advancedFilters.enabled === false)
|
|
22971
22976
|
return false;
|
|
@@ -22975,6 +22980,44 @@ class PraxisTable {
|
|
|
22975
22980
|
const selectedFieldCount = advancedFilters.settings?.selectedFieldIds?.length ?? 0;
|
|
22976
22981
|
return alwaysVisibleCount > 0 || selectedFieldCount > 0;
|
|
22977
22982
|
}
|
|
22983
|
+
hasExplicitAdvancedFiltersDisable() {
|
|
22984
|
+
if (this.hostInputConfig?.behavior?.filtering?.advancedFilters?.enabled === false) {
|
|
22985
|
+
return true;
|
|
22986
|
+
}
|
|
22987
|
+
if (!this.isVolatileConfigPersistence() &&
|
|
22988
|
+
this.persistedUserConfig?.behavior?.filtering?.advancedFilters?.enabled === false) {
|
|
22989
|
+
return true;
|
|
22990
|
+
}
|
|
22991
|
+
return false;
|
|
22992
|
+
}
|
|
22993
|
+
hasDiscoveredCollectionFilterCapability() {
|
|
22994
|
+
if (!this.isRemoteMode() || !this.isCollectionActionDiscoveryEnabled()) {
|
|
22995
|
+
return false;
|
|
22996
|
+
}
|
|
22997
|
+
const snapshot = this.collectionCapabilities;
|
|
22998
|
+
if (snapshot) {
|
|
22999
|
+
const filterOp = snapshot.operations?.['filter'];
|
|
23000
|
+
if (filterOp?.supported === false || filterOp?.availability?.allowed === false) {
|
|
23001
|
+
return false;
|
|
23002
|
+
}
|
|
23003
|
+
if (filterOp?.supported === true || snapshot.canonicalOperations?.['filter'] === true) {
|
|
23004
|
+
return true;
|
|
23005
|
+
}
|
|
23006
|
+
}
|
|
23007
|
+
const digest = this.crudService?.getResourceCapabilityDigest?.() ?? null;
|
|
23008
|
+
if (digest?.canonicalOperations?.['filter'] === false) {
|
|
23009
|
+
return false;
|
|
23010
|
+
}
|
|
23011
|
+
if (digest?.canonicalOperations?.['filter'] === true) {
|
|
23012
|
+
return true;
|
|
23013
|
+
}
|
|
23014
|
+
try {
|
|
23015
|
+
return !!this.resourceDiscovery?.resolveLinkHref?.(this.collectionLinks || undefined, 'filter', this.resolveCollectionDiscoveryOptions());
|
|
23016
|
+
}
|
|
23017
|
+
catch {
|
|
23018
|
+
return false;
|
|
23019
|
+
}
|
|
23020
|
+
}
|
|
22978
23021
|
shouldRenderAdvancedFilter() {
|
|
22979
23022
|
if (!this.isAdvancedFiltersEffectivelyEnabled()) {
|
|
22980
23023
|
return false;
|
|
@@ -24307,6 +24350,7 @@ class PraxisTable {
|
|
|
24307
24350
|
this.collectionLinks = links;
|
|
24308
24351
|
const capabilitiesHref = this.resolveCollectionCapabilitiesHref(links);
|
|
24309
24352
|
this.materializeCollectionCreateToolbarAction();
|
|
24353
|
+
this.syncDiscoveredCollectionFilterToolbarState();
|
|
24310
24354
|
if (!capabilitiesHref) {
|
|
24311
24355
|
this.collectionCapabilitiesRequestSeq += 1;
|
|
24312
24356
|
this.collectionCapabilitiesRequestHref = null;
|
|
@@ -24315,6 +24359,7 @@ class PraxisTable {
|
|
|
24315
24359
|
this.collectionCapabilities = null;
|
|
24316
24360
|
this.materializeCollectionCreateToolbarAction();
|
|
24317
24361
|
this.materializeCollectionWorkflowToolbarActions();
|
|
24362
|
+
this.syncDiscoveredCollectionFilterToolbarState();
|
|
24318
24363
|
}
|
|
24319
24364
|
this.materializeCollectionBulkSyncToolbarAction();
|
|
24320
24365
|
return;
|
|
@@ -24336,6 +24381,7 @@ class PraxisTable {
|
|
|
24336
24381
|
this.materializeCollectionCreateToolbarAction();
|
|
24337
24382
|
this.materializeCollectionWorkflowToolbarActions();
|
|
24338
24383
|
this.materializeCollectionBulkSyncToolbarAction();
|
|
24384
|
+
this.syncDiscoveredCollectionFilterToolbarState();
|
|
24339
24385
|
})
|
|
24340
24386
|
.catch(() => {
|
|
24341
24387
|
if (requestSeq !== this.collectionCapabilitiesRequestSeq) {
|
|
@@ -24348,10 +24394,32 @@ class PraxisTable {
|
|
|
24348
24394
|
if (hadCapabilities) {
|
|
24349
24395
|
this.materializeCollectionCreateToolbarAction();
|
|
24350
24396
|
this.materializeCollectionWorkflowToolbarActions();
|
|
24397
|
+
this.syncDiscoveredCollectionFilterToolbarState();
|
|
24351
24398
|
}
|
|
24352
24399
|
this.materializeCollectionBulkSyncToolbarAction();
|
|
24353
24400
|
});
|
|
24354
24401
|
}
|
|
24402
|
+
syncDiscoveredCollectionFilterToolbarState() {
|
|
24403
|
+
if (!this.config || !this.isCollectionActionDiscoveryEnabled()) {
|
|
24404
|
+
return;
|
|
24405
|
+
}
|
|
24406
|
+
if (this.hasDiscoveredCollectionFilterCapability() &&
|
|
24407
|
+
!this.hasExplicitAdvancedFiltersDisable() &&
|
|
24408
|
+
this.config.behavior?.filtering?.enabled !== false &&
|
|
24409
|
+
this.config.toolbar?.filters?.enabled !== false &&
|
|
24410
|
+
!this.isAdvancedFiltersEffectivelyEnabled(this.config)) {
|
|
24411
|
+
this.config.behavior = this.config.behavior || {};
|
|
24412
|
+
this.config.behavior.filtering =
|
|
24413
|
+
this.config.behavior.filtering || { enabled: true, strategy: 'server' };
|
|
24414
|
+
this.config.behavior.filtering.enabled = true;
|
|
24415
|
+
this.config.behavior.filtering.advancedFilters = {
|
|
24416
|
+
...(this.config.behavior.filtering.advancedFilters || {}),
|
|
24417
|
+
enabled: true,
|
|
24418
|
+
};
|
|
24419
|
+
}
|
|
24420
|
+
this.setShowToolbar(this.shouldExposeToolbar());
|
|
24421
|
+
this.cdr?.markForCheck?.();
|
|
24422
|
+
}
|
|
24355
24423
|
resolveCollectionCapabilitiesHref(links) {
|
|
24356
24424
|
try {
|
|
24357
24425
|
return this.resourceDiscovery.resolveLinkHref(links || undefined, 'capabilities', this.resolveCollectionDiscoveryOptions());
|
|
@@ -24950,7 +25018,7 @@ class PraxisTable {
|
|
|
24950
25018
|
if (this.aiAdapter || this.aiAdapterLoadStarted)
|
|
24951
25019
|
return;
|
|
24952
25020
|
this.aiAdapterLoadStarted = true;
|
|
24953
|
-
import('./praxisui-table-table-ai.adapter-
|
|
25021
|
+
import('./praxisui-table-table-ai.adapter-YZzruRc6.mjs')
|
|
24954
25022
|
.then(({ TableAiAdapter }) => {
|
|
24955
25023
|
if (!this.isAiAssistantEnabled()) {
|
|
24956
25024
|
this.aiAssistantOpenAfterAdapterLoad = false;
|
|
@@ -25722,7 +25790,7 @@ class PraxisTable {
|
|
|
25722
25790
|
initializeAiAssistantController() {
|
|
25723
25791
|
if (!this.aiAdapter || this.aiAssistantController)
|
|
25724
25792
|
return;
|
|
25725
|
-
import('./praxisui-table-table-agentic-authoring-turn-flow-
|
|
25793
|
+
import('./praxisui-table-table-agentic-authoring-turn-flow-DWd6fB1R.mjs')
|
|
25726
25794
|
.then(({ TableAgenticAuthoringTurnFlow }) => {
|
|
25727
25795
|
if (this.aiAssistantController || !this.aiAdapter)
|
|
25728
25796
|
return;
|
|
@@ -26294,6 +26362,14 @@ class PraxisTable {
|
|
|
26294
26362
|
resolveAiAssistantSessionId() {
|
|
26295
26363
|
return `table:${this.resolveAiAssistantRouteKey()}:${this.resolveAiAssistantOwnerId()}`;
|
|
26296
26364
|
}
|
|
26365
|
+
aiAssistantShellOwnerKey() {
|
|
26366
|
+
return this.resolveAiAssistantSessionId();
|
|
26367
|
+
}
|
|
26368
|
+
onAiAssistantShellPromptChange(prompt, owner) {
|
|
26369
|
+
if (owner !== this.aiAssistantShellOwnerKey())
|
|
26370
|
+
return;
|
|
26371
|
+
this.onAiAssistantPromptChange(prompt);
|
|
26372
|
+
}
|
|
26297
26373
|
resolveAiAssistantOwnerId() {
|
|
26298
26374
|
return (this.componentInstanceId || this.tableId || 'table').trim() || 'table';
|
|
26299
26375
|
}
|
|
@@ -26986,11 +27062,15 @@ class PraxisTable {
|
|
|
26986
27062
|
this.applyAppearanceVariables();
|
|
26987
27063
|
}
|
|
26988
27064
|
ngOnChanges(changes) {
|
|
26989
|
-
const ownershipContextChanged = ['tableId', 'componentInstanceId', 'resourcePath', 'configPersistenceStrategy', '
|
|
27065
|
+
const ownershipContextChanged = ['tableId', 'componentInstanceId', 'resourcePath', 'configPersistenceStrategy', 'notifyIfOutdated', 'snoozeMs', 'autoOpenSettingsOnOutdated'].some(key => !!changes[key]);
|
|
26990
27066
|
if (ownershipContextChanged) {
|
|
26991
27067
|
this.persistenceContextEpoch = (this.persistenceContextEpoch ?? 0) + 1;
|
|
26992
27068
|
this.columnRuntimePersistencePending = null;
|
|
26993
27069
|
}
|
|
27070
|
+
const schemaPrefsContextChanged = ownershipContextChanged || !!changes['config'];
|
|
27071
|
+
if (schemaPrefsContextChanged) {
|
|
27072
|
+
this.schemaPrefsContextEpoch = (this.schemaPrefsContextEpoch ?? 0) + 1;
|
|
27073
|
+
}
|
|
26994
27074
|
if (changes['horizontalScroll']) {
|
|
26995
27075
|
const value = changes['horizontalScroll'].currentValue;
|
|
26996
27076
|
const explicit = value === 'auto' || value === 'wrap' || value === 'none';
|
|
@@ -27033,13 +27113,23 @@ class PraxisTable {
|
|
|
27033
27113
|
const hostDeclaredColumnsOnSwitch = Array.isArray(this.hostInputConfig?.columns) &&
|
|
27034
27114
|
this.hostInputConfig.columns.length > 0;
|
|
27035
27115
|
const hostDeclaredQuickFiltersOnSwitch = Array.isArray(this.hostInputConfig?.toolbar?.filters?.quickFilters);
|
|
27116
|
+
const hostDeclaredToolbarTitleOnSwitch = Boolean((typeof this.hostInputConfig?.toolbar?.title === 'string' &&
|
|
27117
|
+
this.hostInputConfig.toolbar.title.trim()) ||
|
|
27118
|
+
(typeof this.hostInputConfig?.toolbar?.subtitle === 'string' &&
|
|
27119
|
+
this.hostInputConfig.toolbar.subtitle.trim()));
|
|
27036
27120
|
this.clearSchemaFieldsSnapshot();
|
|
27037
27121
|
this.clearQuickFilterRuntimeState();
|
|
27038
27122
|
if (!hostDeclaredColumnsOnSwitch) {
|
|
27039
27123
|
this.visibleColumns = [];
|
|
27040
|
-
this.config = this.stripResourceBoundTableConfigState(this.config, this.resourcePath, {
|
|
27124
|
+
this.config = this.stripResourceBoundTableConfigState(this.config, this.resourcePath, {
|
|
27125
|
+
preserveQuickFilters: hostDeclaredQuickFiltersOnSwitch,
|
|
27126
|
+
preserveToolbarTitle: hostDeclaredToolbarTitleOnSwitch,
|
|
27127
|
+
});
|
|
27041
27128
|
if (this.persistedUserConfig) {
|
|
27042
|
-
this.persistedUserConfig = this.stripResourceBoundTableConfigState(this.persistedUserConfig, this.resourcePath, {
|
|
27129
|
+
this.persistedUserConfig = this.stripResourceBoundTableConfigState(this.persistedUserConfig, this.resourcePath, {
|
|
27130
|
+
preserveQuickFilters: hostDeclaredQuickFiltersOnSwitch,
|
|
27131
|
+
preserveToolbarTitle: hostDeclaredToolbarTitleOnSwitch,
|
|
27132
|
+
});
|
|
27043
27133
|
}
|
|
27044
27134
|
}
|
|
27045
27135
|
}
|
|
@@ -27089,12 +27179,18 @@ class PraxisTable {
|
|
|
27089
27179
|
const hostDeclaredColumns = Array.isArray(this.hostInputConfig?.columns) &&
|
|
27090
27180
|
this.hostInputConfig.columns.length > 0;
|
|
27091
27181
|
const hostDeclaredQuickFilters = Array.isArray(this.hostInputConfig?.toolbar?.filters?.quickFilters);
|
|
27182
|
+
const hostDeclaredToolbarTitle = Boolean((typeof this.hostInputConfig?.toolbar?.title === 'string' &&
|
|
27183
|
+
this.hostInputConfig.toolbar.title.trim()) ||
|
|
27184
|
+
(typeof this.hostInputConfig?.toolbar?.subtitle === 'string' &&
|
|
27185
|
+
this.hostInputConfig.toolbar.subtitle.trim()));
|
|
27092
27186
|
if (isResourceSwitch) {
|
|
27093
27187
|
this.updateCollectionLinks(null);
|
|
27094
27188
|
this.clearRowDiscoveryRuntime();
|
|
27095
27189
|
this.lastRowDiscoveryScopeKey = null;
|
|
27096
27190
|
this.clearSchemaFieldsSnapshot();
|
|
27097
27191
|
this.clearQuickFilterRuntimeState();
|
|
27192
|
+
this.uncontrolledExpandedRowKeys?.clear();
|
|
27193
|
+
this.clearExpansionDetailRuntime();
|
|
27098
27194
|
if (!changes['filterCriteria']) {
|
|
27099
27195
|
this.setAdvancedFilterCriteria({});
|
|
27100
27196
|
}
|
|
@@ -27106,10 +27202,16 @@ class PraxisTable {
|
|
|
27106
27202
|
if (!hostDeclaredColumns) {
|
|
27107
27203
|
this.visibleColumns = [];
|
|
27108
27204
|
if (this.config) {
|
|
27109
|
-
this.config = this.stripResourceBoundTableConfigState(this.config, this.resourcePath, {
|
|
27205
|
+
this.config = this.stripResourceBoundTableConfigState(this.config, this.resourcePath, {
|
|
27206
|
+
preserveQuickFilters: hostDeclaredQuickFilters,
|
|
27207
|
+
preserveToolbarTitle: hostDeclaredToolbarTitle,
|
|
27208
|
+
});
|
|
27110
27209
|
}
|
|
27111
27210
|
if (this.persistedUserConfig) {
|
|
27112
|
-
this.persistedUserConfig = this.stripResourceBoundTableConfigState(this.persistedUserConfig, this.resourcePath, {
|
|
27211
|
+
this.persistedUserConfig = this.stripResourceBoundTableConfigState(this.persistedUserConfig, this.resourcePath, {
|
|
27212
|
+
preserveQuickFilters: hostDeclaredQuickFilters,
|
|
27213
|
+
preserveToolbarTitle: hostDeclaredToolbarTitle,
|
|
27214
|
+
});
|
|
27113
27215
|
const cfgKey = this.tableConfigKey();
|
|
27114
27216
|
if (cfgKey) {
|
|
27115
27217
|
this.saveConfigWithAck(cfgKey, this.persistedUserConfig, 'resource-switch-reset');
|
|
@@ -27244,7 +27346,7 @@ class PraxisTable {
|
|
|
27244
27346
|
this.syncInternalFilterSettings(this.config?.behavior?.filtering?.advancedFilters?.settings);
|
|
27245
27347
|
this.cdr.markForCheck();
|
|
27246
27348
|
}
|
|
27247
|
-
if (
|
|
27349
|
+
if (schemaPrefsContextChanged) {
|
|
27248
27350
|
this.resolveSchemaPrefs();
|
|
27249
27351
|
}
|
|
27250
27352
|
}
|
|
@@ -29428,17 +29530,48 @@ class PraxisTable {
|
|
|
29428
29530
|
this.setExpansionDetailRuntimeState(rowKey, 'loading', null, null, null);
|
|
29429
29531
|
void this.resolveExpansionDetailSchemaForRow(row, index, rowKey);
|
|
29430
29532
|
}
|
|
29533
|
+
resolveEffectiveExpansionSourceMode() {
|
|
29534
|
+
const detailSource = this.getDetailConfig()?.source;
|
|
29535
|
+
const detailMode = String(detailSource?.mode || '').trim();
|
|
29536
|
+
const expansionSource = String(this.getExpansionConfig()?.source
|
|
29537
|
+
|| this.getExpansionConfig()?.mode
|
|
29538
|
+
|| '').trim();
|
|
29539
|
+
if (detailMode === 'resource'
|
|
29540
|
+
|| detailMode === 'resourcePath'
|
|
29541
|
+
|| detailMode === 'hypermedia'
|
|
29542
|
+
|| detailMode === 'schema') {
|
|
29543
|
+
return detailMode;
|
|
29544
|
+
}
|
|
29545
|
+
if (detailMode === 'inline') {
|
|
29546
|
+
if (this.hasExpansionDetailRenderableSchema(detailSource?.inlineSchema)) {
|
|
29547
|
+
return 'inline';
|
|
29548
|
+
}
|
|
29549
|
+
if (expansionSource === 'resource'
|
|
29550
|
+
|| expansionSource === 'resourcePath'
|
|
29551
|
+
|| expansionSource === 'hypermedia'
|
|
29552
|
+
|| expansionSource === 'schema') {
|
|
29553
|
+
return expansionSource;
|
|
29554
|
+
}
|
|
29555
|
+
if (Array.isArray(this.schemaFieldsSnapshot)
|
|
29556
|
+
&& this.schemaFieldsSnapshot.length > 0
|
|
29557
|
+
&& this.hasComplementarySchemaExpansionFields()) {
|
|
29558
|
+
return 'schema';
|
|
29559
|
+
}
|
|
29560
|
+
return 'inline';
|
|
29561
|
+
}
|
|
29562
|
+
if (expansionSource === 'resource'
|
|
29563
|
+
|| expansionSource === 'resourcePath'
|
|
29564
|
+
|| expansionSource === 'hypermedia'
|
|
29565
|
+
|| expansionSource === 'schema') {
|
|
29566
|
+
return expansionSource;
|
|
29567
|
+
}
|
|
29568
|
+
return 'inline';
|
|
29569
|
+
}
|
|
29431
29570
|
async resolveExpansionDetailSchemaForRow(row, index, rowKey) {
|
|
29432
29571
|
const token = this.getDetailRequests().begin(rowKey);
|
|
29433
29572
|
if (!token)
|
|
29434
29573
|
return;
|
|
29435
|
-
const
|
|
29436
|
-
|| this.getExpansionConfig()?.source
|
|
29437
|
-
|| this.getExpansionConfig()?.mode
|
|
29438
|
-
|| (this.getExpansionConfig()?.enabled && !this.getDetailConfig()?.source?.inlineSchema ? 'schema' : 'inline')).trim();
|
|
29439
|
-
const normalizedMode = rawMode === 'resource' || rawMode === 'resourcePath' || rawMode === 'hypermedia' || rawMode === 'schema'
|
|
29440
|
-
? rawMode
|
|
29441
|
-
: 'inline';
|
|
29574
|
+
const normalizedMode = this.resolveEffectiveExpansionSourceMode();
|
|
29442
29575
|
const result = await this.resolveExpansionDetailByMode(normalizedMode, row, index, rowKey, new Set(), token);
|
|
29443
29576
|
if (!this.getDetailRequests().isCurrent(token))
|
|
29444
29577
|
return;
|
|
@@ -29507,7 +29640,7 @@ class PraxisTable {
|
|
|
29507
29640
|
const source = (this.getDetailConfig()?.source || {});
|
|
29508
29641
|
const candidate = source.inlineSchema;
|
|
29509
29642
|
const normalized = this.normalizeExpansionDetailSchemaCandidate(candidate);
|
|
29510
|
-
if (!normalized) {
|
|
29643
|
+
if (!normalized || !this.hasExpansionDetailRenderableSchema(normalized)) {
|
|
29511
29644
|
this.logExpansionDiagnostic('EXPANSION_DETAIL_SOURCE_INVALID', '[PraxisTable] Detail inlineSchema inválido. Runtime aplicou fail-closed.', { mode: 'inline' }, 'praxis-table:expansion:detail:inline-schema-invalid');
|
|
29512
29645
|
return {
|
|
29513
29646
|
ok: false,
|
|
@@ -34396,6 +34529,7 @@ class PraxisTable {
|
|
|
34396
34529
|
return String(value ?? '')
|
|
34397
34530
|
.trim()
|
|
34398
34531
|
.replace(/^\/+|\/+$/g, '')
|
|
34532
|
+
.replace(/^api\//i, '')
|
|
34399
34533
|
.toLowerCase();
|
|
34400
34534
|
}
|
|
34401
34535
|
areColumnsDerivedFromPreviousResource(columns, nextNormalizedResourcePath, metaResourcePath) {
|
|
@@ -34431,6 +34565,10 @@ class PraxisTable {
|
|
|
34431
34565
|
else if (next.columnProjection) {
|
|
34432
34566
|
delete next.columnProjection;
|
|
34433
34567
|
}
|
|
34568
|
+
if (!options?.preserveToolbarTitle && next.toolbar) {
|
|
34569
|
+
delete next.toolbar.title;
|
|
34570
|
+
delete next.toolbar.subtitle;
|
|
34571
|
+
}
|
|
34434
34572
|
if (!options?.preserveQuickFilters && next.toolbar?.filters?.quickFilters) {
|
|
34435
34573
|
delete next.toolbar.filters.quickFilters;
|
|
34436
34574
|
}
|
|
@@ -36176,6 +36314,10 @@ class PraxisTable {
|
|
|
36176
36314
|
if (!meta.createdAt)
|
|
36177
36315
|
meta.createdAt = now;
|
|
36178
36316
|
meta.updatedAt = now;
|
|
36317
|
+
const currentResourcePath = (this.resourcePath || '').trim();
|
|
36318
|
+
if (currentResourcePath) {
|
|
36319
|
+
meta.resourcePath = currentResourcePath;
|
|
36320
|
+
}
|
|
36179
36321
|
this.config = {
|
|
36180
36322
|
...this.config,
|
|
36181
36323
|
meta,
|
|
@@ -39971,16 +40113,30 @@ class PraxisTable {
|
|
|
39971
40113
|
}, { dedupeKey: 'praxis-table:expansion:virtualization-fail-closed' });
|
|
39972
40114
|
return false;
|
|
39973
40115
|
}
|
|
40116
|
+
const effectiveMode = this.resolveEffectiveExpansionSourceMode();
|
|
40117
|
+
const fallbackMode = this.getExpansionFallbackMode();
|
|
40118
|
+
if (effectiveMode === 'inline' && fallbackMode === 'none') {
|
|
40119
|
+
if (!this.hasExpansionDetailRenderableSchema(detail?.source?.inlineSchema)) {
|
|
40120
|
+
return false;
|
|
40121
|
+
}
|
|
40122
|
+
}
|
|
40123
|
+
if (effectiveMode === 'hypermedia' && fallbackMode === 'none') {
|
|
40124
|
+
const loadedRows = this.getLoadedTableRowsForExpansionCheck();
|
|
40125
|
+
if (loadedRows.length > 0
|
|
40126
|
+
&& !loadedRows.some((row) => {
|
|
40127
|
+
const links = this.getRowLinks(row);
|
|
40128
|
+
return !!links && !!this.resolveRowDiscoveryHref(links, 'capabilities');
|
|
40129
|
+
})) {
|
|
40130
|
+
return false;
|
|
40131
|
+
}
|
|
40132
|
+
}
|
|
39974
40133
|
if (!this.hasComplementarySchemaExpansionFields()) {
|
|
39975
40134
|
return false;
|
|
39976
40135
|
}
|
|
39977
40136
|
return true;
|
|
39978
40137
|
}
|
|
39979
40138
|
isSchemaExpansionModeActive() {
|
|
39980
|
-
const rawMode =
|
|
39981
|
-
|| this.getExpansionConfig()?.source
|
|
39982
|
-
|| this.getExpansionConfig()?.mode
|
|
39983
|
-
|| (this.getExpansionConfig()?.enabled && !this.getDetailConfig()?.source?.inlineSchema ? 'schema' : 'inline')).trim();
|
|
40139
|
+
const rawMode = this.resolveEffectiveExpansionSourceMode();
|
|
39984
40140
|
return rawMode === 'schema' && this.getExpansionFallbackMode() === 'none';
|
|
39985
40141
|
}
|
|
39986
40142
|
getVisibleTableFieldNamesSet() {
|
|
@@ -44729,7 +44885,7 @@ class PraxisTable {
|
|
|
44729
44885
|
TableDefaultsProvider,
|
|
44730
44886
|
FilterConfigService,
|
|
44731
44887
|
DataFormattingService
|
|
44732
|
-
], queries: [{ propertyName: "toolbar", first: true, predicate: PraxisTableToolbar, descendants: true }, { propertyName: "projectedFilter", first: true, predicate: ["projectedFilter"], descendants: true }], viewQueries: [{ propertyName: "filterBarTemplate", first: true, predicate: ["filterBarTemplate"], descendants: true }, { 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: "virtualScrollViewport", first: true, predicate: CdkVirtualScrollViewport, descendants: true }, { propertyName: "scrollViewport", first: true, predicate: ["scrollViewport"], descendants: true }, { propertyName: "internalFilter", first: true, predicate: PraxisFilter, descendants: true }], usesOnChanges: true, ngImport: i0, template: "@if (collectionWorkflowOutcome && collectionWorkflowOutcome.resourcePath === resourcePath) {\n<praxis-table-collection-outcome [result]=\"collectionWorkflowOutcome\"></praxis-table-collection-outcome>\n}\n@if (bulkSyncHandle && canShowBulkSyncHandle()) {\n @for (handle of [bulkSyncHandle]; track handle) {\n <praxis-table-bulk-sync-workflow [handle]=\"handle\" [loading]=\"config?.behavior?.loading\"\n (closed)=\"closeBulkSync()\" />\n }\n}\n\n@if (shouldShowEmptyState()) {\n<praxis-empty-state-card\n icon=\"link\"\n [title]=\"getSetupEmptyStateTitle()\"\n [description]=\"getSetupEmptyStateDescription()\"\n [primaryAction]=\"getSetupEmptyStatePrimaryAction()\"\n></praxis-empty-state-card>\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} @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<!-- Shared template for <praxis-filter> (inline toolbar or teleported via <praxis-filter-outlet>) -->\n<ng-template #filterBarTemplate>\n @if (shouldRenderAdvancedFilter()) {\n <praxis-filter\n advancedFilter\n [resourcePath]=\"getAdvancedFilterResourcePath()\"\n [filterId]=\"tableId\"\n [formId]=\"getAdvancedFilterFormId()\"\n [persistenceKey]=\"getAdvancedFilterPersistenceKey()\"\n [disablePersistence]=\"configPersistenceStrategy === 'volatile'\"\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 [tags]=\"config.behavior?.filtering?.advancedFilters?.settings?.tags\"\n [advancedOpenMode]=\"getAdvancedFilterOpenMode()\"\n [presentation]=\"config.behavior?.filtering?.advancedFilters?.settings?.presentation\"\n [advancedClearButtonsEnabled]=\"config.behavior?.filtering?.advancedFilters?.settings?.advancedClearButtonsEnabled\"\n [useInlineSearchableSelectVariant]=\"config.behavior?.filtering?.advancedFilters?.settings?.useInlineSearchableSelectVariant ?? true\"\n [useInlineRangeVariant]=\"config.behavior?.filtering?.advancedFilters?.settings?.useInlineRangeVariant ?? true\"\n [useInlineDateVariant]=\"config.behavior?.filtering?.advancedFilters?.settings?.useInlineDateVariant ?? true\"\n [useInlineDateRangeVariant]=\"config.behavior?.filtering?.advancedFilters?.settings?.useInlineDateRangeVariant ?? true\"\n [useInlineTimeVariant]=\"config.behavior?.filtering?.advancedFilters?.settings?.useInlineTimeVariant ?? true\"\n [useInlineTimeRangeVariant]=\"config.behavior?.filtering?.advancedFilters?.settings?.useInlineTimeRangeVariant ?? true\"\n [useInlineTreeSelectVariant]=\"config.behavior?.filtering?.advancedFilters?.settings?.useInlineTreeSelectVariant ?? true\"\n [changeDebounceMs]=\"config.behavior?.filtering?.advancedFilters?.settings?.changeDebounceMs ?? 300\"\n [i18n]=\"getFilterI18n()\"\n [mode]=\"'filter'\"\n [showAddButton]=\"shouldShowAdvancedFilterAddButton()\"\n [showAdvancedButton]=\"config.toolbar?.filters?.showAdvancedButton !== false\"\n [showFilterSettings]=\"shouldShowAdvancedFilterSettings()\"\n (change)=\"onAdvancedFilterChange($event)\"\n (requestSearch)=\"onAdvancedFilterSubmit($event)\"\n (clear)=\"onAdvancedFilterClear()\"\n ></praxis-filter>\n }\n</ng-template>\n\n@if (shouldRenderDataSurface() && !schemaError && toolbarV2) {\n<div\n class=\"praxis-table-header\"\n [class.edit-mode]=\"isCustomizationAvailable()\"\n [class.stacked]=\"hasTopToolbarStack()\"\n>\n @if (showToolbar && shouldShowToolbarTopPlacement()) {\n <praxis-table-toolbar\n class=\"praxis-toolbar-stack-top\"\n [config]=\"config\"\n [focusScope]=\"getFocusRestoreScope('header')\"\n [backgroundColor]=\"getToolbarActionsBackgroundColor()\"\n [style.--pfx-filter-h]=\"getToolbarLayoutHeightHostStyle()\"\n [evaluationContext]=\"getToolbarEvaluationContext()\"\n [activeQuickFilterId]=\"activeQuickFilterId\"\n [activeDensity]=\"resolveAppearanceDensity()\"\n [activeCrossFilters]=\"activeCrossFilters\"\n [columnVisibilityController]=\"toolbarColumnVisibilityController\"\n [showActionsGroup]=\"shouldShowToolbarActionsTop()\"\n [showMobileActions]=\"shouldShowToolbarActionsTop()\"\n [exportBusy]=\"exportBusy\"\n [exportStatusMessage]=\"exportStatusMessage\"\n (toolbarAction)=\"onToolbarAction($event)\"\n (exportAction)=\"onExportAction($event)\"\n (quickFilterChange)=\"onQuickFilterChange($event)\"\n (densityChange)=\"onDensityChange($event)\"\n (clearCrossFilter)=\"onClearCrossFilter($event)\"\n (clearAllCrossFilters)=\"onClearAllCrossFilters()\"\n >\n @if (shouldRenderAdvancedFilter() && !filterTeleport) {\n <ng-container ngProjectAs=\"[advancedFilter]\" *ngTemplateOutlet=\"filterBarTemplate\" />\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 } @if (isCustomizationAvailable()) {\n <button\n end-actions\n type=\"button\"\n praxisIconButton=\"settings\"\n size=\"compact\"\n class=\"praxis-table-toolbar-action--configuration\"\n data-role=\"table-settings\"\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 } @if (!showToolbar && isCustomizationAvailable()) {\n <div class=\"ptable-header-actions\">\n @if ($any(config)?.title) {\n <span class=\"ptable-header-title\">{{ $any(config).title }}</span>\n }\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\n type=\"button\"\n praxisIconButton=\"settings\"\n size=\"compact\"\n class=\"praxis-table-toolbar-action--configuration\"\n data-role=\"table-settings\"\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 @if (isRemoteMode()) {\n <button\n type=\"button\"\n praxisIconButton=\"link_off\"\n size=\"compact\"\n (click)=\"disconnect()\"\n [attr.aria-label]=\"getDisconnectLabel()\"\n [matTooltip]=\"getDisconnectTooltip()\"\n ></button>\n }\n </div>\n }\n</div>\n} @else { @if (shouldRenderDataSurface() && !schemaError) { @if\n(showToolbar && shouldShowToolbarTopPlacement()) {\n<praxis-table-toolbar\n class=\"praxis-toolbar-stack-top\"\n [config]=\"config\"\n [focusScope]=\"getFocusRestoreScope('header')\"\n [backgroundColor]=\"getToolbarActionsBackgroundColor()\"\n [style.--pfx-filter-h]=\"getToolbarLayoutHeightHostStyle()\"\n [evaluationContext]=\"getToolbarEvaluationContext()\"\n [activeQuickFilterId]=\"activeQuickFilterId\"\n [activeDensity]=\"resolveAppearanceDensity()\"\n [activeCrossFilters]=\"activeCrossFilters\"\n [showActionsGroup]=\"shouldShowToolbarActionsTop()\"\n [showMobileActions]=\"shouldShowToolbarActionsTop()\"\n [exportBusy]=\"exportBusy\"\n [exportStatusMessage]=\"exportStatusMessage\"\n (toolbarAction)=\"onToolbarAction($event)\"\n (exportAction)=\"onExportAction($event)\"\n (quickFilterChange)=\"onQuickFilterChange($event)\"\n (densityChange)=\"onDensityChange($event)\"\n (clearCrossFilter)=\"onClearCrossFilter($event)\"\n (clearAllCrossFilters)=\"onClearAllCrossFilters()\"\n>\n @if (shouldRenderAdvancedFilter() && !filterTeleport) {\n <ng-container ngProjectAs=\"[advancedFilter]\" *ngTemplateOutlet=\"filterBarTemplate\" />\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 } @if (isCustomizationAvailable()) {\n <button\n end-actions\n type=\"button\"\n praxisIconButton=\"settings\"\n size=\"compact\"\n class=\"praxis-table-toolbar-action--configuration\"\n data-role=\"table-settings\"\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} @if (!showToolbar && isCustomizationAvailable()) {\n<div class=\"ptable-header-actions\">\n @if ($any(config)?.title) {\n <span class=\"ptable-header-title\">{{ $any(config).title }}</span>\n }\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\n type=\"button\"\n praxisIconButton=\"settings\"\n size=\"compact\"\n class=\"praxis-table-toolbar-action--configuration\"\n data-role=\"table-settings\"\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</div>\n} } }\n<!-- Operational error state; authoring actions remain capability-gated when toolbar cannot render. -->\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\n mat-flat-button\n color=\"primary\"\n [disabled]=\"isErrorRetryInProgress()\"\n (click)=\"retryTableError()\"\n >\n <mat-icon\n [class.ptable-error__retry-icon--active]=\"isErrorRetryInProgress()\"\n >refresh</mat-icon\n >\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 (canCancelLoad()) {\n <button mat-stroked-button type=\"button\" (click)=\"cancelLoad()\">\n {{ getCancelLoadLabel() }}\n </button>\n }\n @if (isCustomizationAvailable() && schemaError) {\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\n type=\"button\"\n praxisIconButton=\"settings\"\n size=\"compact\"\n class=\"praxis-table-toolbar-action--configuration\"\n data-role=\"table-settings\"\n data-testid=\"table-settings-trigger\"\n (click)=\"openTableSettings()\"\n [attr.aria-label]=\"getTableSettingsLabel()\"\n [matTooltip]=\"getTableSettingsLabel()\"\n matTooltipPosition=\"below\"\n >\n >\n </button>\n }\n </div>\n</div>\n}\n<!-- Paginador superior -->\n@if (shouldRenderDataSurface() && !schemaError && !dataError &&\ngetPaginationEnabled() && (config.behavior?.pagination?.position === 'top' ||\nconfig.behavior?.pagination?.position === 'both')) {\n<mat-paginator\n [length]=\"getPaginationLength()\"\n [pageIndex]=\"pageIndex\"\n [pageSize]=\"pageSize\"\n [pageSizeOptions]=\"getPaginationPageSizeOptions()\"\n [selectConfig]=\"paginatorSelectConfig\"\n [showFirstLastButtons]=\"getPaginationShowFirstLast()\"\n [disabled]=\"isTableDataLoading()\"\n (page)=\"onPageChange($event)\"\n [class.compact]=\"config.behavior?.pagination?.style === 'compact'\"\n>\n</mat-paginator>\n} @if (shouldShowRefreshingState()) {\n<div\n class=\"ptable-refresh-state\"\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n>\n @if (getLoadingIndicatorType() === 'progress') {\n <span class=\"ptable-refresh-state__progress\" aria-hidden=\"true\"></span>\n } @else if (getLoadingIndicatorType() === 'skeleton') {\n <span class=\"ptable-refresh-state__skeleton\" aria-hidden=\"true\"></span>\n } @else {\n <span class=\"ptable-refresh-state__spinner\" aria-hidden=\"true\"></span>\n }\n <span class=\"ptable-refresh-state__message\">{{ getLoadingSurfaceMessage() }}</span>\n @if (canCancelLoad()) {\n <button mat-button type=\"button\" (click)=\"cancelLoad()\">\n {{ getCancelLoadLabel() }}\n </button>\n }\n</div>\n}\n<div\n class=\"ptable-data-surface\"\n [class.ptable-data-surface--loading-overlay]=\"\n shouldShowLoadingSurface() && getLoadingIndicatorPosition() === 'overlay'\n \"\n>\n<div\n #scrollViewport\n class=\"px-scroll-viewport\"\n cdkScrollable\n (scroll)=\"onHorizontalViewportScroll($event)\"\n (keydown)=\"onHorizontalViewportKeydown($event)\"\n [attr.aria-busy]=\"isTableDataLoading() ? 'true' : 'false'\"\n [attr.role]=\"horizontalScroll === 'auto' ? 'region' : null\"\n [attr.aria-label]=\"horizontalScroll === 'auto' ? getScrollViewportAriaLabel() : null\"\n [attr.tabindex]=\"horizontalScroll === 'auto' ? 0 : null\"\n [class.px-scroll-viewport--refreshing]=\"shouldShowRefreshingState()\"\n [class.px-scroll-viewport--loading-replaced]=\"shouldReplaceDataWithLoading()\"\n [class.scroll-auto]=\"horizontalScroll === 'auto'\"\n [class.scroll-wrap]=\"horizontalScroll === 'wrap'\"\n [class.scroll-none]=\"horizontalScroll === 'none'\"\n [class.px-scroll-viewport--overflowing]=\"hasHorizontalOverflow\"\n [class.px-scroll-viewport--can-scroll-left]=\"canScrollHorizontallyLeft\"\n [class.px-scroll-viewport--can-scroll-right]=\"canScrollHorizontallyRight\"\n [class.pfx-mobile-card-mode]=\"isMobileCardModeActive()\"\n [class.table-rounded-bottom]=\"!hasBottomTableStack()\"\n>\n @if (shouldRenderDataSurface() && !schemaError && !dataError) {\n <div\n class=\"praxis-visually-hidden-status\"\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >\n {{ columnReorderStatusMessage }} {{ columnResizeStatusMessage }}\n </div>\n @if (selectionStatusMessage) {\n <div\n class=\"praxis-visually-hidden-status\"\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >\n {{ selectionStatusMessage }}\n </div>\n }\n @if (exportStatusMessage) {\n <div\n class=\"praxis-visually-hidden-status\"\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >\n {{ exportStatusMessage }}\n </div>\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 [attr.aria-label]=\"getTableAriaLabel()\"\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() || isTableDataLoading()\"\n [class.praxis-table-data--refreshing]=\"shouldShowRefreshingState()\"\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 [class.pfx-mobile-card-mode]=\"isMobileCardModeActive()\"\n [style.width]=\"getColumnResizeTableWidthStyle()\"\n >\n @if (isSelectionColumnEnabled()) {\n <ng-container matColumnDef=\"_select\">\n <th mat-header-cell *matHeaderCellDef>\n @if (canSelectAll()) {\n <mat-checkbox\n (change)=\"masterToggle()\"\n [checked]=\"isAllSelected()\"\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\"\n [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(); onSingleSelectionChanged(row)\"\n (change)=\"onSingleSelectionChanged(row)\"\n (keydown.space)=\"onSingleSelectionSpace($event, row)\"\n [checked]=\"selection.isSelected(row)\"\n [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 [aria-label]=\"getRowSelectionAriaLabel(row, i)\"\n ></mat-checkbox>\n }\n </td>\n </ng-container>\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\"\n >Expandir detalhes da linha</span\n >\n </th>\n <td\n mat-cell\n *matCellDef=\"let row; let i = index\"\n class=\"pfx-expansion-col-cell\"\n >\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 [attr.title]=\"!isRowExpandable(row, i) ? getRowExpansionToggleAriaLabel(row, i) : null\"\n (click)=\"onExpansionToggleFromIcon(row, i, $event)\"\n (keydown)=\"onExpansionToggleKeydown($event, row, i)\"\n ></button>\n </td>\n </ng-container>\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 [class.pfx-sticky-boundary-start]=\"isStickyStartBoundary(column)\"\n [class.pfx-sticky-boundary-end]=\"isStickyEndBoundary(column)\"\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 (lostpointercapture)=\"onColumnResizeLostPointerCapture($event)\"\n (dblclick)=\"onColumnResizeHandleDoubleClick($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 [class.pfx-sticky-boundary-start]=\"isStickyStartBoundary(column)\"\n [class.pfx-sticky-boundary-end]=\"isStickyEndBoundary(column)\"\n [matTooltip]=\"getCellTooltip(element, column) || ''\"\n [matTooltipPosition]=\"getCellTooltipPosition(element, column)\"\n [matTooltipDisabled]=\"!getCellTooltip(element, column)\"\n [attr.title]=\"getCellTooltip(element, column) || null\"\n [attr.data-praxis-card-label]=\"column.header || column.field\"\n [style.order]=\"isMobileCardModeActive() ? getMobileCardColumnOrder(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 [praxisQuickView]=\"getEffectiveQuickViewBinding(element, column)\"\n [praxisQuickViewRecord]=\"element\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\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') { @if (shouldRenderBadge(element, column)) {\n <span\n class=\"pfx-badge\"\n [ngClass]=\"getBadgeClasses(element, column)\"\n [praxisQuickView]=\"getEffectiveQuickViewBinding(element, column)\"\n [praxisQuickViewRecord]=\"element\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n >\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 <!-- Link renderer -->\n @case ('link') {\n @let linkQuickView = getEffectiveQuickViewBinding(element, column);\n @let linkHref = getLinkHref(element, column);\n @if (linkQuickView && !linkHref) {\n <button\n type=\"button\"\n class=\"pfx-link pfx-quick-view-trigger--button\"\n [praxisQuickView]=\"linkQuickView\"\n [praxisQuickViewRecord]=\"element\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"hover-and-click\"\n [attr.aria-label]=\"getLinkText(element, column) || column.header\"\n (click)=\"$event.stopPropagation()\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-link__content\"\n [nodes]=\"getLinkRichContentNodes(element, column)\"\n ></praxis-rich-content>\n </button>\n } @else if (linkQuickView && linkHref) {\n <span class=\"pfx-link-with-quick-view\">\n <a\n class=\"pfx-link\"\n [attr.href]=\"linkHref\"\n [attr.target]=\"getLinkTarget(element, column) || null\"\n [attr.rel]=\"getLinkRel(element, column) || null\"\n [praxisQuickView]=\"linkQuickView\"\n [praxisQuickViewRecord]=\"element\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"hover-only\"\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\n ></a>\n <button\n type=\"button\"\n class=\"pfx-quick-view-adjacent-btn\"\n [praxisQuickView]=\"linkQuickView\"\n [praxisQuickViewRecord]=\"element\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"explicit-button\"\n [attr.aria-label]=\"getQuickViewTriggerAriaLabel(getLinkText(element, column), column)\"\n (click)=\"$event.stopPropagation()\"\n >\n <mat-icon class=\"pfx-quick-view-adjacent-btn__icon\" aria-hidden=\"true\">info_outline</mat-icon>\n </button>\n </span>\n } @else {\n <a\n class=\"pfx-link\"\n [attr.href]=\"linkHref || 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\n ></a>\n }\n }\n <!-- Button renderer -->\n @case ('button') { @switch (getButtonVariant(element, column)) { @case\n ('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 } @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 } @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 <!-- Chip renderer -->\n @case ('chip') { @if (shouldRenderChip(element, column)) {\n <span\n class=\"pfx-chip\"\n [ngClass]=\"getChipClasses(element, column)\"\n [praxisQuickView]=\"getEffectiveQuickViewBinding(element, column)\"\n [praxisQuickViewRecord]=\"element\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n >\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 <!-- 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\n class=\"pfx-micro-viz-cell\"\n [innerHTML]=\"getMicroVisualizationHtml(element, column)\"\n ></span>\n }\n <!-- Avatar renderer -->\n @case ('avatar') {\n <span\n 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 [praxisQuickView]=\"getEffectiveQuickViewBinding(element, column)\"\n [praxisQuickViewRecord]=\"element\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n >\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\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(element, 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(element, column); track it.id) {\n <button\n mat-menu-item\n (click)=\"onMenuItemClick(it, element, $event)\"\n [disabled]=\"!it.__visible\"\n >\n <praxis-rich-content\n layout=\"inline\"\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 >\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\n class=\"pfx-cell-compose\"\n [ngClass]=\"getComposeClasses(element, column)\"\n [ngStyle]=\"getComposeGapStyle(element, column)\"\n >\n @for (it of getComposeItems(element, column); track\n trackComposeItem($index, it)) { @switch\n (getItemEffectiveType(element, column, it)) {\n <!-- Reuse helpers by projecting item as faux column -->\n @case ('icon') {\n @let composeIconCol = asItemColumn(column, it);\n <span\n class=\"pfx-icon-renderer\"\n [style.color]=\"getIconColor(element, composeIconCol) || null\"\n [ngStyle]=\"getIconStyle(element, composeIconCol)\"\n [attr.aria-label]=\"getIconAriaLabel(element, composeIconCol) || null\"\n [praxisQuickView]=\"getEffectiveQuickViewBinding(element, composeIconCol)\"\n [praxisQuickViewRecord]=\"element\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n ><praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-icon-renderer__content\"\n [nodes]=\"getIconRichContentNodes(element, composeIconCol)\"\n ></praxis-rich-content\n ></span>\n } @case ('image') {\n <span class=\"pfx-cell-image\"\n ><praxis-rich-content\n rootClassName=\"pfx-cell-image__content\"\n [nodes]=\"getImageRichContentNodes(element, asItemColumn(column, it))\"\n ></praxis-rich-content\n ></span>\n } @case ('badge') {\n @let composeBadgeCol = asItemColumn(column, it);\n @if (shouldRenderBadge(element, composeBadgeCol)) {\n <span\n class=\"pfx-badge\"\n [ngClass]=\"getBadgeClasses(element, composeBadgeCol)\"\n [praxisQuickView]=\"getEffectiveQuickViewBinding(element, composeBadgeCol)\"\n [praxisQuickViewRecord]=\"element\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n ><praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-badge__content\"\n [nodes]=\"getBadgeRichContentNodes(element, composeBadgeCol)\"\n ></praxis-rich-content\n ></span>\n } } @case ('link') {\n @let composeLinkCol = asItemColumn(column, it);\n @let composeLinkQuickView = getEffectiveQuickViewBinding(element, composeLinkCol);\n @let composeLinkHref = getLinkHref(element, composeLinkCol);\n @if (composeLinkQuickView && !composeLinkHref) {\n <button\n type=\"button\"\n class=\"pfx-link pfx-quick-view-trigger--button\"\n [praxisQuickView]=\"composeLinkQuickView\"\n [praxisQuickViewRecord]=\"element\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"hover-and-click\"\n [attr.aria-label]=\"getLinkText(element, composeLinkCol) || column.header\"\n (click)=\"$event.stopPropagation()\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-link__content\"\n [nodes]=\"getLinkRichContentNodes(element, composeLinkCol)\"\n ></praxis-rich-content>\n </button>\n } @else if (composeLinkQuickView && composeLinkHref) {\n <span class=\"pfx-link-with-quick-view\">\n <a\n class=\"pfx-link\"\n [attr.href]=\"composeLinkHref\"\n [attr.target]=\"getLinkTarget(element, composeLinkCol) || null\"\n [attr.rel]=\"getLinkRel(element, composeLinkCol) || null\"\n [praxisQuickView]=\"composeLinkQuickView\"\n [praxisQuickViewRecord]=\"element\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"hover-only\"\n (click)=\"$event.stopPropagation()\"\n ><praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-link__content\"\n [nodes]=\"getLinkRichContentNodes(element, composeLinkCol)\"\n ></praxis-rich-content\n ></a>\n <button\n type=\"button\"\n class=\"pfx-quick-view-adjacent-btn\"\n [praxisQuickView]=\"composeLinkQuickView\"\n [praxisQuickViewRecord]=\"element\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"explicit-button\"\n [attr.aria-label]=\"getQuickViewTriggerAriaLabel(getLinkText(element, composeLinkCol), composeLinkCol)\"\n (click)=\"$event.stopPropagation()\"\n >\n <mat-icon class=\"pfx-quick-view-adjacent-btn__icon\" aria-hidden=\"true\">info_outline</mat-icon>\n </button>\n </span>\n } @else {\n <a\n class=\"pfx-link\"\n [attr.href]=\"composeLinkHref || null\"\n [attr.target]=\"getLinkTarget(element, composeLinkCol) || null\"\n [attr.rel]=\"getLinkRel(element, composeLinkCol) || null\"\n (click)=\"$event.stopPropagation()\"\n ><praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-link__content\"\n [nodes]=\"getLinkRichContentNodes(element, composeLinkCol)\"\n ></praxis-rich-content\n ></a>\n }\n } @case ('button') { @switch (getButtonVariant(element,\n asItemColumn(column, it))) { @case ('outlined') {\n <button\n mat-stroked-button\n [color]=\"getButtonColor(element, asItemColumn(column, it)) || null\"\n [disabled]=\"isButtonDisabled(element, asItemColumn(column, it))\"\n [attr.aria-label]=\"getButtonAriaLabel(element, asItemColumn(column, it)) || getButtonLabel(element, asItemColumn(column, it))\"\n (click)=\"onButtonClick(element, asItemColumn(column, it), $event)\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-button-renderer__content\"\n [nodes]=\"getButtonRichContentNodes(element, asItemColumn(column, it))\"\n ></praxis-rich-content>\n </button>\n } @case ('text') {\n <button\n mat-button\n [color]=\"getButtonColor(element, asItemColumn(column, it)) || null\"\n [disabled]=\"isButtonDisabled(element, asItemColumn(column, it))\"\n [attr.aria-label]=\"getButtonAriaLabel(element, asItemColumn(column, it)) || getButtonLabel(element, asItemColumn(column, it))\"\n (click)=\"onButtonClick(element, asItemColumn(column, it), $event)\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-button-renderer__content\"\n [nodes]=\"getButtonRichContentNodes(element, asItemColumn(column, it))\"\n ></praxis-rich-content>\n </button>\n } @default {\n <button\n mat-flat-button\n [color]=\"getButtonColor(element, asItemColumn(column, it)) || null\"\n [disabled]=\"isButtonDisabled(element, asItemColumn(column, it))\"\n [attr.aria-label]=\"getButtonAriaLabel(element, asItemColumn(column, it)) || getButtonLabel(element, asItemColumn(column, it))\"\n (click)=\"onButtonClick(element, asItemColumn(column, it), $event)\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-button-renderer__content\"\n [nodes]=\"getButtonRichContentNodes(element, asItemColumn(column, it))\"\n ></praxis-rich-content>\n </button>\n } } } @case ('chip') {\n @let composeChipCol = asItemColumn(column, it);\n @if (shouldRenderChip(element, composeChipCol)) {\n <span\n class=\"pfx-chip\"\n [ngClass]=\"getChipClasses(element, composeChipCol)\"\n [praxisQuickView]=\"getEffectiveQuickViewBinding(element, composeChipCol)\"\n [praxisQuickViewRecord]=\"element\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n ><praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-chip__content\"\n [nodes]=\"getChipRichContentNodes(element, composeChipCol)\"\n ></praxis-rich-content\n ></span>\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 } @case ('microVisualization') {\n <span\n class=\"pfx-micro-viz-cell\"\n [innerHTML]=\"getMicroVisualizationHtml(element, asItemColumn(column, it))\"\n ></span>\n } @case ('avatar') {\n @let composeAvatarCol = asItemColumn(column, it);\n <span\n class=\"pfx-avatar-renderer\"\n [ngStyle]=\"getAvatarStyle(element, composeAvatarCol)\"\n [class.shape-rounded]=\"getAvatarShape(element, composeAvatarCol) === 'rounded'\"\n [class.shape-circle]=\"getAvatarShape(element, composeAvatarCol) === 'circle'\"\n [praxisQuickView]=\"getEffectiveQuickViewBinding(element, composeAvatarCol)\"\n [praxisQuickViewRecord]=\"element\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n ><praxis-rich-content\n rootClassName=\"pfx-avatar-renderer__content\"\n [nodes]=\"getAvatarRichContentNodes(element, composeAvatarCol)\"\n ></praxis-rich-content\n ></span>\n } @case ('toggle') {\n <mat-slide-toggle\n [checked]=\"getToggleState(element, asItemColumn(column, it))\"\n [disabled]=\"isToggleDisabled(element, asItemColumn(column, it))\"\n [aria-label]=\"getToggleAriaLabel(element, asItemColumn(column, it)) || 'Alternar'\"\n (change)=\"onToggleChange(element, asItemColumn(column, it), $event)\"\n (click)=\"$event.stopPropagation()\"\n ></mat-slide-toggle>\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(element, asItemColumn(column, it)) || '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 (mi of getMenuItems(element, asItemColumn(column, it)); track\n mi.id) {\n <button\n mat-menu-item\n (click)=\"onMenuItemClick(mi, element, $event)\"\n [disabled]=\"!mi.__visible\"\n >\n <praxis-rich-content\n layout=\"inline\"\n rootClassName=\"pfx-menu-item__content\"\n [nodes]=\"getMenuItemRichContentNodes(mi)\"\n ></praxis-rich-content>\n </button>\n }\n </mat-menu>\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 >\n </praxis-table-rating>\n } @case ('html') {\n <span\n [innerHTML]=\"getSafeHtml(element, asItemColumn(column, it))\"\n ></span>\n }\n <!-- Value item: render base cell text alongside visuals -->\n @case ('value') {\n @let composeValue = getComposeItemValue(element, column, it);\n @if (composeValue !== null && composeValue !== undefined && composeValue !== '') {\n @let composeValueQuickView = getComposeValueQuickViewBinding(element, column, it);\n @if (composeValueQuickView) {\n <button\n type=\"button\"\n class=\"pfx-cell-value pfx-quick-view-trigger--button\"\n [ngClass]=\"getComposeValueClasses(it)\"\n [praxisQuickView]=\"composeValueQuickView\"\n [praxisQuickViewRecord]=\"element\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"hover-and-click\"\n (click)=\"$event.stopPropagation()\"\n >{{ composeValue }}</button>\n } @else {\n <span class=\"pfx-cell-value\" [ngClass]=\"getComposeValueClasses(it)\"\n >{{ composeValue }}</span\n >\n }\n }\n } } }\n </span>\n }\n <!-- Default text rendering -->\n @default {\n @let defaultCellValue = getCellValue(element, column);\n @let defaultCellQuickView = getEffectiveQuickViewBinding(element, column);\n @if (defaultCellQuickView && defaultCellValue !== null && defaultCellValue !== undefined && defaultCellValue !== '') {\n <button\n type=\"button\"\n class=\"pfx-cell-quick-view-btn pfx-quick-view-trigger--button\"\n [praxisQuickView]=\"defaultCellQuickView\"\n [praxisQuickViewRecord]=\"element\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"hover-and-click\"\n (click)=\"$event.stopPropagation()\"\n >{{ defaultCellValue }}</button>\n } @else {\n {{ defaultCellValue }}\n }\n } }\n </div>\n </td>\n </ng-container>\n } @if (config.actions?.row?.enabled) {\n <ng-container\n matColumnDef=\"_actions\"\n [sticky]=\"config.actions?.row?.sticky === true || config.actions?.row?.sticky === 'start'\"\n [stickyEnd]=\"config.actions?.row?.sticky === 'end'\"\n >\n <th\n mat-header-cell\n *matHeaderCellDef\n #actionsHeaderCell\n [style.width]=\"getRowActionsWidthStyle()\"\n class=\"praxis-actions-header\"\n [class.align-start]=\"getActionsHeaderAlign() === 'start'\"\n [class.align-center]=\"getActionsHeaderAlign() === 'center'\"\n [class.align-end]=\"getActionsHeaderAlign() === 'end'\"\n [class.pfx-sticky-boundary-start]=\"isActionsStickyStartBoundary()\"\n [class.pfx-sticky-boundary-end]=\"isActionsStickyEndBoundary()\"\n >\n <div\n class=\"praxis-actions-header__content\"\n [matTooltip]=\"getActionsHeaderTooltip() || ''\"\n [matTooltipDisabled]=\"!getActionsHeaderTooltip()\"\n >\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 [class.pfx-sticky-boundary-start]=\"isActionsStickyStartBoundary()\"\n [class.pfx-sticky-boundary-end]=\"isActionsStickyEndBoundary()\"\n [style.width]=\"getRowActionsWidthStyle()\"\n [attr.data-praxis-card-label]=\"getActionsHeaderLabel()\"\n [style.order]=\"isMobileCardModeActive() ? getMobileCardActionsOrder() : null\"\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' ||\n !config.actions?.row?.display) { @for (a of getInlineRowActions(row);\n track trackAction($index, a)) {\n <span\n class=\"praxis-row-action-anchor\"\n [matTooltip]=\"getActionTooltip(a, row)\"\n [matTooltipDisabled]=\"!getActionTooltip(a, row)\"\n [attr.tabindex]=\"isActionDisabled(a, row) ? 0 : null\"\n [attr.role]=\"isActionDisabled(a, row) ? 'note' : null\"\n [attr.aria-label]=\"isActionDisabled(a, row) ? ((a.label || getActionId(a)) + ': ' + getActionTooltip(a, row)) : null\"\n [attr.title]=\"isActionDisabled(a, row) ? getActionTooltip(a, row) : null\"\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 [busy]=\"isRowActionBusy(a, row)\"\n [disabled]=\"isActionDisabled(a, row) || isRowActionBusy(a, row)\"\n [praxisQuickView]=\"getRowActionQuickViewBinding(a)\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"hover-only\"\n (click)=\"onRowAction(getActionId(a), row, $event, getRowActionRuntimeOptions(a, row))\"\n [attr.aria-label]=\"a.label || getActionId(a)\"\n [attr.aria-description]=\"getActionAriaDescription(a, row)\"\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 <!-- Inline actions: buttons mode (show label + icon) -->\n @if (config.actions?.row?.display === 'buttons') { @for (a of\n getInlineRowActions(row); track trackAction($index, a)) {\n <span\n class=\"praxis-row-action-anchor\"\n [matTooltip]=\"getActionTooltip(a, row)\"\n [matTooltipDisabled]=\"!getActionTooltip(a, row)\"\n [attr.tabindex]=\"isActionDisabled(a, row) ? 0 : null\"\n [attr.role]=\"isActionDisabled(a, row) ? 'note' : null\"\n [attr.aria-label]=\"isActionDisabled(a, row) ? ((a.label || getActionId(a)) + ': ' + getActionTooltip(a, row)) : null\"\n [attr.title]=\"isActionDisabled(a, row) ? getActionTooltip(a, row) : null\"\n matTooltipPosition=\"above\"\n matTooltipClass=\"praxis-tooltip\"\n >\n <button\n mat-flat-button\n class=\"praxis-row-btn\"\n [disabled]=\"isActionDisabled(a, row) || isRowActionBusy(a, row)\"\n [attr.aria-busy]=\"isRowActionBusy(a, row) ? 'true' : null\"\n [praxisQuickView]=\"getRowActionQuickViewBinding(a)\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"hover-only\"\n (click)=\"onRowAction(getActionId(a), row, $event, getRowActionRuntimeOptions(a, row))\"\n [attr.aria-label]=\"a.label || getActionId(a)\"\n [attr.aria-description]=\"getActionAriaDescription(a, row)\"\n [color]=\"a.color || null\"\n >\n <praxis-rich-content\n layout=\"inline\"\n rootClassName=\"praxis-row-action__content\"\n [nodes]=\"getRowActionRichContentNodes(a, isRowActionBusy(a, row))\"\n ></praxis-rich-content>\n </button>\n </span>\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 (mouseenter)=\"onRowOverflowMenuTriggerHover(row)\"\n (focus)=\"onRowOverflowMenuTriggerHover(row)\"\n (click)=\"setActiveRowOverflowMenuTrigger(rowMoreMenuTrigger, $event.currentTarget)\"\n (menuOpened)=\"setActiveRowOverflowMenuTrigger(rowMoreMenuTrigger); onRowOverflowMenuOpened(row)\"\n (menuClosed)=\"onRowOverflowMenuClosed(rowMoreMenuTrigger)\"\n [attr.data-praxis-focus-key]=\"getRowActionFocusOriginKey(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\" panelClass=\"praxis-table-row-menu\">\n @if (hasRowOverflowMenuLoadingState(row) && getOverflowRowActions(row).length === 0) {\n <button mat-menu-item class=\"praxis-row-overflow-menu__item\" disabled>\n <mat-icon>hourglass_empty</mat-icon>\n <praxis-rich-content\n layout=\"inline\"\n rootClassName=\"praxis-row-overflow-menu__label\"\n [nodes]=\"getTableChromeTextRichContentNodes(getRowOverflowMenuLoadingLabel(), 'praxis-row-overflow-menu__label-text')\"\n ></praxis-rich-content>\n </button>\n } @for (a of getOverflowRowActions(row); track trackAction($index,\n a)) {\n <button\n mat-menu-item\n class=\"praxis-row-overflow-menu__item\"\n (click)=\"onOverflowRowAction(getActionId(a), row, $event, getRowActionRuntimeOptions(a, row))\"\n [disabled]=\"isActionDisabled(a, row) || isRowActionBusy(a, row)\"\n [attr.aria-busy]=\"isRowActionBusy(a, row) ? 'true' : null\"\n [attr.aria-label]=\"a.label || getActionId(a)\"\n [attr.aria-description]=\"getActionAriaDescription(a, row)\"\n [attr.title]=\"getActionTooltip(a, row)\"\n [matTooltip]=\"getActionTooltip(a, row)\"\n [matTooltipDisabled]=\"!getActionTooltip(a, row)\"\n matTooltipPosition=\"left\"\n >\n <mat-icon\n [color]=\"a.color || null\"\n [praxisIcon]=\"a.icon\"\n ></mat-icon>\n <praxis-rich-content\n layout=\"inline\"\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 } @if (hasRowOverflowMenuEmptyState(row)) {\n <button mat-menu-item disabled>\n <mat-icon>info</mat-icon>\n <praxis-rich-content\n layout=\"inline\"\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 mat-header-row *matHeaderRowDef=\"displayedColumns\"></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.data-keyboard-row-identity]=\"getKeyboardRowIdentity(row, i)\"\n [attr.tabindex]=\"getRowTabIndex(row, i)\"\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 (focus)=\"onRowFocused(row, i)\"\n (keydown)=\"onRowKeydown($event, 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); @if\n (detailState.status === 'loading') {\n <div\n class=\"pfx-expansion-detail-message\"\n role=\"status\"\n aria-live=\"polite\"\n >\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 { @if (getExpansionDetailLayout(detailState.schema) ===\n 'tabs') { @let detailTabs =\n getExpansionDetailTabs(detailState.schema); @if (detailTabs.length) {\n <div\n class=\"pfx-expansion-detail-tabs\"\n role=\"tablist\"\n aria-label=\"Se\u00C3\u00A7\u00C3\u00B5es do detail\"\n >\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) { @if\n (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\n 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 { @for (childNode of getExpansionDetailNodeChildren(tab);\n track $index) {\n <ng-container\n *ngTemplateOutlet=\"\n expansionDetailNodeTemplate;\n context: { $implicit: childNode, row: row, index: i }\n \"\n ></ng-container>\n } }\n </div>\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 } } @else {\n <div class=\"pfx-expansion-detail-stack\">\n @for (node of getExpansionDetailItems(detailState.schema); track\n $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 <ng-template\n #expansionDetailNodeTemplate\n let-node\n let-row=\"row\"\n let-index=\"index\"\n >\n @if (!isExpansionDetailNodeVisible(node, row, index)) {} @else if (getExpansionDetailRichContentNodes(node, row, index); as\n richNodes) {\n <praxis-rich-content\n class=\"pfx-expansion-node-host\"\n [nodes]=\"richNodes\"\n [context]=\"getExpansionDetailRichContentContext(row, index, node)\"\n ></praxis-rich-content>\n } @else { @switch (getExpansionDetailNodeType(node)) { @case\n ('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); @let\n listEntries = getExpansionDetailListEntries(row, node); @if\n (listItems.length) {\n <ul>\n @for (entry of listEntries; track $index) {\n <li>\n @if (getExpansionDetailListItemRichContentNodes(entry); as\n 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 { {{ formatExpansionDetailListEntry(entry) }} }\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 } @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,\n node); @if (richListEntries.length) {\n <div class=\"pfx-expansion-node-rich-list__items\">\n @for (entry of richListEntries; track $index) {\n <article\n [class]=\"getExpansionDetailRichListItemClassName(node)\"\n >\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,\n row, index, entry, $index); @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 } @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\n $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 } @case ('cardGrid') {\n <section class=\"pfx-expansion-node pfx-expansion-node-card-grid\">\n @if (getExpansionDetailCardGridHeaderNodes(node); as\n cardGridHeaderNodes) { @if (cardGridHeaderNodes.length) {\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-card-grid__header\"\n [nodes]=\"cardGridHeaderNodes\"\n [context]=\"getExpansionDetailRichContentContext(row, index, node)\"\n ></praxis-rich-content>\n } } @let gridCards = getExpansionDetailCardGridCards(node); @if\n (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, node)\"\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, node)\"\n ></praxis-rich-content>\n }\n </section>\n } @case ('richContent') {\n <div\n class=\"pfx-expansion-node-rich-content\"\n (click)=\"$event.stopPropagation()\"\n >\n <praxis-rich-content\n [document]=\"getExpansionDetailRichContentDocument(node)\"\n [layout]=\"getExpansionDetailRichContentLayout(node)\"\n [rootClassName]=\"node?.rootClassName || 'pfx-expansion-node-rich-content__document'\"\n [context]=\"getExpansionDetailRichContentContext(row, index, node)\"\n [hostCapabilities]=\"getExpansionDetailRichContentHostCapabilities(row)\"\n ></praxis-rich-content>\n </div>\n } @case ('richText') {\n <div\n class=\"pfx-expansion-node pfx-expansion-node-richtext\"\n [innerHTML]=\"getExpansionDetailRichText(node)\"\n ></div>\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\n 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 } @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\n 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 } @case ('chartRef') { @if\n (getExpansionDetailInlineRendererView(node, row, index); as\n inlineRenderer) {\n <section\n class=\"pfx-expansion-node pfx-expansion-node-embed pfx-expansion-node-embed--inline pfx-expansion-node-embed--chart\"\n >\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\n 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\n 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 } } @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\n 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 } @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 {\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\">\n{{ 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 } @if (getExpansionDetailEmbedAction(node, row, index); as\n 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 } @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\n 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 } @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,\n row, index); @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 } @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(bottomDetailText('tabOutside'), 'pfx-expansion-node-placeholder__text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n </div>\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 </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 </table>\n }\n\n <!-- Virtual rows path (header preserved above) -->\n @if (shouldRenderDataSurface() && !schemaError && !dataError &&\n 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 [attr.aria-label]=\"getTableAriaLabel()\"\n [ngClass]=\"getTableElevationClassName()\"\n [class.table-stack-top]=\"hasTopToolbarStack()\"\n [class.table-rounded-bottom]=\"!hasBottomTableStack()\"\n [style.width]=\"getVirtualTableWidthStyle()\"\n >\n <tbody>\n <tr\n 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.data-keyboard-row-identity]=\"getKeyboardRowIdentity(row, i)\"\n [attr.tabindex]=\"getRowTabIndex(row, i)\"\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 (focus)=\"onRowFocused(row, i)\"\n (keydown)=\"onRowKeydown($event, row, i)\"\n >\n <!-- Selection column -->\n @if (isSelectionColumnEnabled()) {\n <td class=\"mat-mdc-cell\">\n <mat-checkbox\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleRow(row)\"\n [checked]=\"selection.isSelected(row)\"\n [aria-label]=\"getRowSelectionAriaLabel(row, i)\"\n >\n </mat-checkbox>\n </td>\n }\n <!-- Data columns -->\n @for (column of visibleColumns; track column.field) {\n <td\n 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 >\n <div\n class=\"pfx-cell-content\"\n [ngClass]=\"getCellContentClasses(row, column)\"\n [ngStyle]=\"getCellContentNgStyle(row, column)\"\n >\n @switch (getEffectiveRendererType(row, column)) { @case ('icon') {\n <span\n 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 [praxisQuickView]=\"getEffectiveQuickViewBinding(row, column)\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n >\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 } @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 } @case ('badge') { @if (shouldRenderBadge(row, column)) {\n <span\n class=\"pfx-badge\"\n [ngClass]=\"getBadgeClasses(row, column)\"\n [praxisQuickView]=\"getEffectiveQuickViewBinding(row, column)\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-badge__content\"\n [nodes]=\"getBadgeRichContentNodes(row, column)\"\n ></praxis-rich-content>\n </span>\n } } @case ('chip') { @if (shouldRenderChip(row, column)) {\n <span\n class=\"pfx-chip\"\n [ngClass]=\"getChipClasses(row, column)\"\n [praxisQuickView]=\"getEffectiveQuickViewBinding(row, column)\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-chip__content\"\n [nodes]=\"getChipRichContentNodes(row, column)\"\n ></praxis-rich-content>\n </span>\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 } @case ('microVisualization') {\n <span\n class=\"pfx-micro-viz-cell\"\n [innerHTML]=\"getMicroVisualizationHtml(row, column)\"\n ></span>\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 } @case ('link') {\n @let vLinkQuickView = getEffectiveQuickViewBinding(row, column);\n @let vLinkHref = getLinkHref(row, column);\n @if (vLinkQuickView && !vLinkHref) {\n <button\n type=\"button\"\n class=\"pfx-link pfx-quick-view-trigger--button\"\n [praxisQuickView]=\"vLinkQuickView\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"hover-and-click\"\n [attr.aria-label]=\"getLinkText(row, column) || column.header\"\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 </button>\n } @else if (vLinkQuickView && vLinkHref) {\n <span class=\"pfx-link-with-quick-view\">\n <a\n class=\"pfx-link\"\n [attr.href]=\"vLinkHref\"\n [attr.target]=\"getLinkTarget(row, column) || null\"\n [attr.rel]=\"getLinkRel(row, column) || null\"\n [praxisQuickView]=\"vLinkQuickView\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"hover-only\"\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 <button\n type=\"button\"\n class=\"pfx-quick-view-adjacent-btn\"\n [praxisQuickView]=\"vLinkQuickView\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"explicit-button\"\n [attr.aria-label]=\"getQuickViewTriggerAriaLabel(getLinkText(row, column), column)\"\n (click)=\"$event.stopPropagation()\"\n >\n <mat-icon class=\"pfx-quick-view-adjacent-btn__icon\" aria-hidden=\"true\">info_outline</mat-icon>\n </button>\n </span>\n } @else {\n <a\n class=\"pfx-link\"\n [attr.href]=\"vLinkHref || 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') { @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 } @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 } @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 } } } @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 layout=\"inline\"\n rootClassName=\"pfx-menu-item__content\"\n [nodes]=\"getMenuItemRichContentNodes(it)\"\n ></praxis-rich-content>\n </button>\n }\n </mat-menu>\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 } @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 } @case ('html') {\n <span [innerHTML]=\"getSafeHtml(row, column)\"></span>\n } @case ('compose') {\n <span\n class=\"pfx-cell-compose\"\n [ngClass]=\"getComposeClasses(row, column)\"\n [ngStyle]=\"getComposeGapStyle(row, column)\"\n >\n @for (it of getComposeItems(row, column); track\n trackComposeItem($index, it)) { @switch\n (getItemEffectiveType(row, column, it)) { @case ('icon') {\n @let vComposeIconCol = asItemColumn(column, it);\n <span\n class=\"pfx-icon-renderer\"\n [style.color]=\"getIconColor(row, vComposeIconCol) || null\"\n [ngStyle]=\"getIconStyle(row, vComposeIconCol)\"\n [attr.aria-label]=\"getIconAriaLabel(row, vComposeIconCol) || null\"\n [praxisQuickView]=\"getEffectiveQuickViewBinding(row, vComposeIconCol)\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n ><praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-icon-renderer__content\"\n [nodes]=\"getIconRichContentNodes(row, vComposeIconCol)\"\n ></praxis-rich-content\n ></span>\n } @case ('image') {\n <span class=\"pfx-cell-image\"\n ><praxis-rich-content\n rootClassName=\"pfx-cell-image__content\"\n [nodes]=\"getImageRichContentNodes(row, asItemColumn(column, it))\"\n ></praxis-rich-content\n ></span>\n } @case ('badge') {\n @let vComposeBadgeCol = asItemColumn(column, it);\n @if (shouldRenderBadge(row, vComposeBadgeCol)) {\n <span\n class=\"pfx-badge\"\n [ngClass]=\"getBadgeClasses(row, vComposeBadgeCol)\"\n [praxisQuickView]=\"getEffectiveQuickViewBinding(row, vComposeBadgeCol)\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n ><praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-badge__content\"\n [nodes]=\"getBadgeRichContentNodes(row, vComposeBadgeCol)\"\n ></praxis-rich-content\n ></span>\n } } @case ('link') {\n @let vComposeLinkCol = asItemColumn(column, it);\n @let vComposeLinkQuickView = getEffectiveQuickViewBinding(row, vComposeLinkCol);\n @let vComposeLinkHref = getLinkHref(row, vComposeLinkCol);\n @if (vComposeLinkQuickView && !vComposeLinkHref) {\n <button\n type=\"button\"\n class=\"pfx-link pfx-quick-view-trigger--button\"\n [praxisQuickView]=\"vComposeLinkQuickView\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"hover-and-click\"\n [attr.aria-label]=\"getLinkText(row, vComposeLinkCol) || column.header\"\n (click)=\"$event.stopPropagation()\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-link__content\"\n [nodes]=\"getLinkRichContentNodes(row, vComposeLinkCol)\"\n ></praxis-rich-content>\n </button>\n } @else if (vComposeLinkQuickView && vComposeLinkHref) {\n <span class=\"pfx-link-with-quick-view\">\n <a\n class=\"pfx-link\"\n [attr.href]=\"vComposeLinkHref\"\n [attr.target]=\"getLinkTarget(row, vComposeLinkCol) || null\"\n [attr.rel]=\"getLinkRel(row, vComposeLinkCol) || null\"\n [praxisQuickView]=\"vComposeLinkQuickView\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"hover-only\"\n (click)=\"$event.stopPropagation()\"\n ><praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-link__content\"\n [nodes]=\"getLinkRichContentNodes(row, vComposeLinkCol)\"\n ></praxis-rich-content\n ></a>\n <button\n type=\"button\"\n class=\"pfx-quick-view-adjacent-btn\"\n [praxisQuickView]=\"vComposeLinkQuickView\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"explicit-button\"\n [attr.aria-label]=\"getQuickViewTriggerAriaLabel(getLinkText(row, vComposeLinkCol), vComposeLinkCol)\"\n (click)=\"$event.stopPropagation()\"\n >\n <mat-icon class=\"pfx-quick-view-adjacent-btn__icon\" aria-hidden=\"true\">info_outline</mat-icon>\n </button>\n </span>\n } @else {\n <a\n class=\"pfx-link\"\n [attr.href]=\"vComposeLinkHref || null\"\n [attr.target]=\"getLinkTarget(row, vComposeLinkCol) || null\"\n [attr.rel]=\"getLinkRel(row, vComposeLinkCol) || null\"\n (click)=\"$event.stopPropagation()\"\n ><praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-link__content\"\n [nodes]=\"getLinkRichContentNodes(row, vComposeLinkCol)\"\n ></praxis-rich-content\n ></a>\n }\n } @case ('button') { @switch (getButtonVariant(row,\n asItemColumn(column, it))) { @case ('outlined') {\n <button\n mat-stroked-button\n [color]=\"getButtonColor(row, asItemColumn(column, it)) || null\"\n [disabled]=\"isButtonDisabled(row, asItemColumn(column, it))\"\n [attr.aria-label]=\"getButtonAriaLabel(row, asItemColumn(column, it)) || getButtonLabel(row, asItemColumn(column, it))\"\n (click)=\"onButtonClick(row, asItemColumn(column, it), $event)\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-button-renderer__content\"\n [nodes]=\"getButtonRichContentNodes(row, asItemColumn(column, it))\"\n ></praxis-rich-content>\n </button>\n } @case ('text') {\n <button\n mat-button\n [color]=\"getButtonColor(row, asItemColumn(column, it)) || null\"\n [disabled]=\"isButtonDisabled(row, asItemColumn(column, it))\"\n [attr.aria-label]=\"getButtonAriaLabel(row, asItemColumn(column, it)) || getButtonLabel(row, asItemColumn(column, it))\"\n (click)=\"onButtonClick(row, asItemColumn(column, it), $event)\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-button-renderer__content\"\n [nodes]=\"getButtonRichContentNodes(row, asItemColumn(column, it))\"\n ></praxis-rich-content>\n </button>\n } @default {\n <button\n mat-flat-button\n [color]=\"getButtonColor(row, asItemColumn(column, it)) || null\"\n [disabled]=\"isButtonDisabled(row, asItemColumn(column, it))\"\n [attr.aria-label]=\"getButtonAriaLabel(row, asItemColumn(column, it)) || getButtonLabel(row, asItemColumn(column, it))\"\n (click)=\"onButtonClick(row, asItemColumn(column, it), $event)\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-button-renderer__content\"\n [nodes]=\"getButtonRichContentNodes(row, asItemColumn(column, it))\"\n ></praxis-rich-content>\n </button>\n } } } @case ('chip') {\n @let vComposeChipCol = asItemColumn(column, it);\n @if (shouldRenderChip(row, vComposeChipCol)) {\n <span\n class=\"pfx-chip\"\n [ngClass]=\"getChipClasses(row, vComposeChipCol)\"\n [praxisQuickView]=\"getEffectiveQuickViewBinding(row, vComposeChipCol)\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n ><praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-chip__content\"\n [nodes]=\"getChipRichContentNodes(row, vComposeChipCol)\"\n ></praxis-rich-content\n ></span>\n } } @case ('progress') {\n <div class=\"pfx-progress\">\n <praxis-rich-content\n rootClassName=\"pfx-progress__content\"\n [context]=\"getProgressRichContentContext(row, asItemColumn(column, it))\"\n [nodes]=\"getProgressRichContentNodes(row, asItemColumn(column, it))\"\n ></praxis-rich-content>\n </div>\n } @case ('microVisualization') {\n <span\n class=\"pfx-micro-viz-cell\"\n [innerHTML]=\"getMicroVisualizationHtml(row, asItemColumn(column, it))\"\n ></span>\n } @case ('avatar') {\n <span\n class=\"pfx-avatar-renderer\"\n [ngStyle]=\"getAvatarStyle(row, asItemColumn(column, it))\"\n [class.shape-rounded]=\"getAvatarShape(row, asItemColumn(column, it)) === 'rounded'\"\n [class.shape-circle]=\"getAvatarShape(row, asItemColumn(column, it)) === 'circle'\"\n ><praxis-rich-content\n rootClassName=\"pfx-avatar-renderer__content\"\n [nodes]=\"getAvatarRichContentNodes(row, asItemColumn(column, it))\"\n ></praxis-rich-content\n ></span>\n } @case ('toggle') {\n <mat-slide-toggle\n [checked]=\"getToggleState(row, asItemColumn(column, it))\"\n [disabled]=\"isToggleDisabled(row, asItemColumn(column, it))\"\n [aria-label]=\"getToggleAriaLabel(row, asItemColumn(column, it)) || 'Alternar'\"\n (change)=\"onToggleChange(row, asItemColumn(column, it), $event)\"\n (click)=\"$event.stopPropagation()\"\n ></mat-slide-toggle>\n } @case ('menu') {\n <button\n type=\"button\"\n praxisIconButton=\"more_vert\"\n presentation=\"projected\"\n size=\"compact\"\n [matMenuTriggerFor]=\"composeMenuRef\"\n (click)=\"$event.stopPropagation()\"\n [attr.aria-label]=\"getMenuAriaLabel(row, asItemColumn(column, it)) || 'Menu'\"\n >\n <praxis-rich-content\n rootClassName=\"pfx-menu-trigger__content\"\n [nodes]=\"getMenuTriggerRichContentNodes()\"\n ></praxis-rich-content>\n </button>\n <mat-menu #composeMenuRef=\"matMenu\">\n @for (mi of getMenuItems(row, asItemColumn(column, it)); track\n mi.id) {\n <button\n mat-menu-item\n (click)=\"onMenuItemClick(mi, row, $event)\"\n [disabled]=\"!mi.__visible\"\n >\n <praxis-rich-content\n layout=\"inline\"\n rootClassName=\"pfx-menu-item__content\"\n [nodes]=\"getMenuItemRichContentNodes(mi)\"\n ></praxis-rich-content>\n </button>\n }\n </mat-menu>\n } @case ('rating') {\n <praxis-table-rating\n class=\"pfx-rating-cell\"\n [itemsCount]=\"getRatingMax(row, asItemColumn(column, it))\"\n [value]=\"getRatingValue(row, asItemColumn(column, it))\"\n [size]=\"getRatingSize(row, asItemColumn(column, it))\"\n [ratingColor]=\"getRatingColor(row, asItemColumn(column, it))\"\n [outlineColor]=\"getRatingOutlineColor(row, asItemColumn(column, it))\"\n [ariaLabel]=\"getRatingAriaLabel(row, asItemColumn(column, it)) || column.header\"\n ></praxis-table-rating>\n } @case ('html') {\n <span\n [innerHTML]=\"getSafeHtml(row, asItemColumn(column, it))\"\n ></span>\n } @case ('value') {\n @let composeValue = getComposeItemValue(row, column, it);\n @if (composeValue !== null && composeValue !== undefined && composeValue !== '') {\n @let vComposeValueQuickView = getComposeValueQuickViewBinding(row, column, it);\n @if (vComposeValueQuickView) {\n <button\n type=\"button\"\n class=\"pfx-cell-value pfx-quick-view-trigger--button\"\n [ngClass]=\"getComposeValueClasses(it)\"\n [praxisQuickView]=\"vComposeValueQuickView\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"hover-and-click\"\n (click)=\"$event.stopPropagation()\"\n >{{ composeValue }}</button>\n } @else {\n <span\n class=\"pfx-cell-value\"\n [ngClass]=\"getComposeValueClasses(it)\"\n >{{ composeValue }}</span\n >\n }\n }\n } } }\n </span>\n } @default {\n @let vDefaultCellQuickView = getEffectiveQuickViewBinding(row, column);\n @if (vDefaultCellQuickView) {\n <button\n type=\"button\"\n class=\"pfx-cell-quick-view-btn pfx-quick-view-trigger--button\"\n [praxisQuickView]=\"vDefaultCellQuickView\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"hover-and-click\"\n (click)=\"$event.stopPropagation()\"\n >{{ getCellValue(row, column) }}</button>\n } @else {\n {{ getCellValue(row, column) }}\n }\n } }\n </div>\n </td>\n }\n\n <!-- Actions column -->\n @if (config.actions?.row?.enabled) {\n <td\n class=\"mat-mdc-cell 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 @if (config.actions?.row?.display === 'icons' ||\n !config.actions?.row?.display) { @for (a of\n getInlineRowActions(row); track trackAction($index, a)) {\n <span\n class=\"praxis-row-action-anchor\"\n [matTooltip]=\"getActionTooltip(a, row)\"\n [matTooltipDisabled]=\"!getActionTooltip(a, row)\"\n [attr.tabindex]=\"isActionDisabled(a, row) ? 0 : null\"\n [attr.role]=\"isActionDisabled(a, row) ? 'note' : null\"\n [attr.aria-label]=\"isActionDisabled(a, row) ? ((a.label || getActionId(a)) + ': ' + getActionTooltip(a, row)) : null\"\n [attr.title]=\"isActionDisabled(a, row) ? getActionTooltip(a, row) : null\"\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 [busy]=\"isRowActionBusy(a, row)\"\n [disabled]=\"isActionDisabled(a, row) || isRowActionBusy(a, row)\"\n [praxisQuickView]=\"getRowActionQuickViewBinding(a)\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"hover-only\"\n (click)=\"onRowAction(getActionId(a), row, $event, getRowActionRuntimeOptions(a, row))\"\n [attr.aria-label]=\"a.label || getActionId(a)\"\n [attr.aria-description]=\"getActionAriaDescription(a, row)\"\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 } } @if (config.actions?.row?.display === 'buttons') { @for (a of\n getInlineRowActions(row); track trackAction($index, a)) {\n <span\n class=\"praxis-row-action-anchor\"\n [matTooltip]=\"getActionTooltip(a, row)\"\n [matTooltipDisabled]=\"!getActionTooltip(a, row)\"\n [attr.tabindex]=\"isActionDisabled(a, row) ? 0 : null\"\n [attr.role]=\"isActionDisabled(a, row) ? 'note' : null\"\n [attr.aria-label]=\"isActionDisabled(a, row) ? ((a.label || getActionId(a)) + ': ' + getActionTooltip(a, row)) : null\"\n [attr.title]=\"isActionDisabled(a, row) ? getActionTooltip(a, row) : null\"\n matTooltipPosition=\"above\"\n matTooltipClass=\"praxis-tooltip\"\n >\n <button\n mat-flat-button\n class=\"praxis-row-btn\"\n [disabled]=\"isActionDisabled(a, row) || isRowActionBusy(a, row)\"\n [attr.aria-busy]=\"isRowActionBusy(a, row) ? 'true' : null\"\n [praxisQuickView]=\"getRowActionQuickViewBinding(a)\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"hover-only\"\n (click)=\"onRowAction(getActionId(a), row, $event, getRowActionRuntimeOptions(a, row))\"\n [attr.aria-label]=\"a.label || getActionId(a)\"\n [attr.aria-description]=\"getActionAriaDescription(a, row)\"\n [color]=\"a.color || null\"\n >\n <praxis-rich-content\n layout=\"inline\"\n rootClassName=\"praxis-row-action__content\"\n [nodes]=\"getRowActionRichContentNodes(a, isRowActionBusy(a, row))\"\n ></praxis-rich-content>\n </button>\n </span>\n } } @if (hasOverflowRowActions(row)) {\n <button\n #rowMoreMenuTriggerV=\"matMenuTrigger\"\n type=\"button\"\n [praxisIconButton]=\"getRowMenuIcon()\"\n size=\"compact\"\n class=\"praxis-icon-btn praxis-more-btn\"\n [matMenuTriggerFor]=\"rowMoreMenuV\"\n (mouseenter)=\"onRowOverflowMenuTriggerHover(row)\"\n (focus)=\"onRowOverflowMenuTriggerHover(row)\"\n (click)=\"setActiveRowOverflowMenuTrigger(rowMoreMenuTriggerV, $event.currentTarget)\"\n (menuOpened)=\"setActiveRowOverflowMenuTrigger(rowMoreMenuTriggerV); onRowOverflowMenuOpened(row)\"\n (menuClosed)=\"onRowOverflowMenuClosed(rowMoreMenuTriggerV)\"\n [attr.data-praxis-focus-key]=\"getRowActionFocusOriginKey(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 #rowMoreMenuV=\"matMenu\" xPosition=\"before\" panelClass=\"praxis-table-row-menu\">\n @if (hasRowOverflowMenuLoadingState(row) && getOverflowRowActions(row).length === 0) {\n <button mat-menu-item class=\"praxis-row-overflow-menu__item\" disabled>\n <mat-icon>hourglass_empty</mat-icon>\n <praxis-rich-content\n layout=\"inline\"\n rootClassName=\"praxis-row-overflow-menu__label\"\n [nodes]=\"getTableChromeTextRichContentNodes(getRowOverflowMenuLoadingLabel(), 'praxis-row-overflow-menu__label-text')\"\n ></praxis-rich-content>\n </button>\n } @for (a of getOverflowRowActions(row); track\n trackAction($index, a)) {\n <button\n mat-menu-item\n class=\"praxis-row-overflow-menu__item\"\n (click)=\"onOverflowRowAction(getActionId(a), row, $event, getRowActionRuntimeOptions(a, row))\"\n [disabled]=\"isActionDisabled(a, row) || isRowActionBusy(a, row)\"\n [attr.aria-busy]=\"isRowActionBusy(a, row) ? 'true' : null\"\n [attr.aria-label]=\"a.label || getActionId(a)\"\n [attr.aria-description]=\"getActionAriaDescription(a, row)\"\n [attr.title]=\"getActionTooltip(a, row)\"\n [matTooltip]=\"getActionTooltip(a, row)\"\n [matTooltipDisabled]=\"!getActionTooltip(a, row)\"\n matTooltipPosition=\"left\"\n >\n <mat-icon\n [color]=\"a.color || null\"\n [praxisIcon]=\"a.icon\"\n ></mat-icon>\n <praxis-rich-content\n layout=\"inline\"\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 } @if (hasRowOverflowMenuEmptyState(row)) {\n <button mat-menu-item disabled>\n <mat-icon>info</mat-icon>\n <praxis-rich-content\n layout=\"inline\"\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</div>\n@if (shouldShowLoadingSurface()) {\n<div\n class=\"ptable-loading-state\"\n [class.ptable-loading-state--overlay]=\"getLoadingIndicatorPosition() === 'overlay'\"\n role=\"status\"\n aria-live=\"polite\"\n>\n @if (getLoadingIndicatorType() === 'skeleton') {\n <div\n class=\"ptable-loading-state__hero\"\n [class.ptable-loading-state__hero--static]=\"!isLoadingSkeletonAnimated()\"\n aria-hidden=\"true\"\n >\n <span\n class=\"ptable-loading-state__line ptable-loading-state__line--wide\"\n ></span>\n <span\n class=\"ptable-loading-state__line ptable-loading-state__line--short\"\n ></span>\n <div class=\"ptable-loading-state__rows\">\n @for (placeholder of getLoadingSkeletonRows(); track placeholder) {\n <div class=\"ptable-loading-state__row\">\n <span\n class=\"ptable-loading-state__cell ptable-loading-state__cell--short\"\n ></span>\n <span class=\"ptable-loading-state__cell\"></span>\n <span\n class=\"ptable-loading-state__cell ptable-loading-state__cell--wide\"\n ></span>\n </div>\n }\n </div>\n </div>\n } @else if (getLoadingIndicatorType() === 'progress') {\n <div class=\"ptable-loading-state__progress\" aria-hidden=\"true\">\n <span></span>\n </div>\n } @else {\n <span class=\"ptable-loading-state__spinner\" aria-hidden=\"true\"></span>\n }\n <div class=\"ptable-loading-state__message\">\n {{ getLoadingSurfaceMessage() }}\n </div>\n @if (canCancelLoad()) {\n <div class=\"ptable-loading-state__actions\">\n <button mat-stroked-button type=\"button\" (click)=\"cancelLoad()\">\n {{ getCancelLoadLabel() }}\n </button>\n </div>\n }\n</div>\n}\n</div>\n@if (shouldShowCancelledState()) {\n<div class=\"ptable-cancelled-state\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">\n <mat-icon aria-hidden=\"true\">pause_circle</mat-icon>\n <div class=\"ptable-cancelled-state__content\">\n <strong>{{ getCancelledLoadTitle() }}</strong>\n <span>{{ getCancelledLoadMessage() }}</span>\n </div>\n <button mat-stroked-button type=\"button\" (click)=\"retryCancelledLoad()\">\n <mat-icon aria-hidden=\"true\">refresh</mat-icon>\n {{ getTableErrorRetryLabel() }}\n </button>\n</div>\n} @if (shouldShowNoDataState()) {\n<div\n class=\"ptable-no-data-state\"\n [style.--p-table-empty-action-size]=\"getNoDataStateActionSize()\"\n [style.--p-table-empty-action-radius]=\"getNoDataStateActionRadius()\"\n>\n <span\n class=\"ptable-no-data-state__announcement\"\n role=\"status\"\n aria-live=\"polite\"\n >\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} @if ( shouldRenderDataSurface() && !schemaError && !dataError &&\nshouldRenderFloatingBulkActions() && getFloatingBulkActions().length &&\n!shouldHideFloatingBulkActions() ) {\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<ng-template #bottomDetailSurface>\n @let bottom = getBottomDetailState();\n @if (shouldRenderBottomDetailSurface(bottom)) {\n <section class=\"ptable-bottom-detail\" data-testid=\"table-bottom-detail\"\n [class.ptable-bottom-detail--dynamic]=\"isBottomDetailDynamicHeight()\"\n [class.ptable-bottom-detail--before-controls]=\"isBottomDetailBeforeControls()\"\n role=\"region\" [attr.aria-label]=\"bottom.title\" [attr.aria-busy]=\"bottom.status === 'loading'\">\n <header class=\"ptable-bottom-detail__header\">\n <span class=\"ptable-bottom-detail__identity\">\n <mat-icon aria-hidden=\"true\">dock_to_bottom</mat-icon>\n <span class=\"ptable-bottom-detail__heading\">\n <span class=\"ptable-bottom-detail__eyebrow\">{{ bottomDetailText('panelLabel') }}</span>\n <strong>{{ bottom.title }}</strong>\n </span>\n </span>\n <button type=\"button\" mat-button data-testid=\"table-bottom-detail-toggle\"\n [attr.aria-expanded]=\"!bottomDetailCollapsed()\" [attr.aria-controls]=\"tableId + '-bottom-detail-body'\"\n (click)=\"toggleBottomDetail()\">\n <mat-icon aria-hidden=\"true\">{{ bottomDetailCollapsed() ? 'expand_more' : 'expand_less' }}</mat-icon>\n {{ bottomDetailText(bottomDetailCollapsed() ? 'expand' : 'collapse') }}\n </button>\n </header>\n @if (!bottomDetailCollapsed()) {\n <div class=\"ptable-bottom-detail__body\" data-testid=\"table-bottom-detail-body\"\n [attr.id]=\"tableId + '-bottom-detail-body'\" [style.height.px]=\"getBottomDetailBodyHeight()\"\n role=\"group\" [attr.aria-label]=\"bottom.title\" tabindex=\"0\">\n @if (!bottom.detailState) {\n <span data-testid=\"table-bottom-detail-status\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">\n {{ bottom.message }}\n </span>\n }\n @if (bottom.detailState && bottom.row) {\n <ng-container *ngTemplateOutlet=\"tableDetailBodyTemplate;\n context: { detailState: bottom.detailState, row: bottom.row, index: bottom.index }\"\n ></ng-container>\n @if (bottom.status === 'blocked' || bottom.status === 'error') {\n <button type=\"button\" mat-button (click)=\"retryBottomDetail()\">{{ bottomDetailText('retry') }}</button>\n }\n }\n </div>\n }\n </section>\n }\n</ng-template>\n@if (isBottomDetailBeforeControls()) {\n <ng-container *ngTemplateOutlet=\"bottomDetailSurface\"></ng-container>\n}\n<!-- Barra de a\u00E7\u00F5es no rodap\u00E9 (opcional) -->\n@if (shouldRenderDataSurface() && !schemaError && showToolbar && shouldRenderFooterToolbar()) {\n <praxis-table-toolbar\n [config]=\"config\"\n [focusScope]=\"getFocusRestoreScope('footer')\"\n [backgroundColor]=\"getToolbarActionsBackgroundColor()\"\n [style.--pfx-filter-h]=\"getToolbarLayoutHeightHostStyle()\"\n [class.footer-flat]=\"hasSurfaceAfterFooterToolbar()\"\n class=\"praxis-toolbar-footer\"\n placement=\"footer\"\n [showMain]=\"shouldShowFooterToolbarMain()\"\n [showEndActions]=\"shouldShowFooterToolbarEndActions()\"\n [showActionsGroup]=\"shouldShowToolbarActionsBottom()\"\n [showMobileActions]=\"shouldShowToolbarActionsBottom()\"\n [evaluationContext]=\"getToolbarEvaluationContext()\"\n [activeQuickFilterId]=\"activeQuickFilterId\"\n [activeDensity]=\"resolveAppearanceDensity()\"\n [activeCrossFilters]=\"activeCrossFilters\"\n [columnVisibilityController]=\"toolbarColumnVisibilityController\"\n [exportBusy]=\"exportBusy\"\n [exportStatusMessage]=\"exportStatusMessage\"\n (toolbarAction)=\"onToolbarAction($event)\"\n (exportAction)=\"onExportAction($event)\"\n (quickFilterChange)=\"onQuickFilterChange($event)\"\n (densityChange)=\"onDensityChange($event)\"\n (clearCrossFilter)=\"onClearCrossFilter($event)\"\n (clearAllCrossFilters)=\"onClearAllCrossFilters()\"\n >\n @if (shouldShowFooterToolbarMain() && shouldRenderAdvancedFilter() && !filterTeleport) {\n <ng-container ngProjectAs=\"[advancedFilter]\" *ngTemplateOutlet=\"filterBarTemplate\" />\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 [pageIndex]=\"pageIndex\"\n [pageSize]=\"pageSize\"\n [pageSizeOptions]=\"getPaginationPageSizeOptions()\"\n [selectConfig]=\"paginatorSelectConfig\"\n [showFirstLastButtons]=\"getPaginationShowFirstLast()\"\n [disabled]=\"isTableDataLoading()\"\n (page)=\"onPageChange($event)\"\n [class.compact]=\"config.behavior?.pagination?.style === 'compact'\"\n [class.footer-stack]=\"shouldShowToolbarActionsBottom()\"\n [class.detail-stack]=\"hasBottomDetailAfterPaginator()\"\n >\n </mat-paginator>\n}\n@if (isBottomDetailAfterControls()) {\n <ng-container *ngTemplateOutlet=\"bottomDetailSurface\"></ng-container>\n}\n\n<!-- One renderer shared by row and contextual detail presentations. -->\n<ng-template #tableDetailBodyTemplate let-detailState=\"detailState\" let-row=\"row\" let-i=\"index\">\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(bottomDetailText('loading'), '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 || bottomDetailText('blocked'), '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\" [attr.aria-label]=\"bottomDetailText('sections')\">\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(bottomDetailText('tabsEmpty'), '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>\n <ng-template #expansionDetailNodeTemplate let-node let-row=\"row\" let-index=\"index\">\n @if (!isExpansionDetailNodeVisible(node, row, index)) {} @else 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, node)\"\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(getExpansionDetailListEmptyText(node), '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, bottomDetailText('collectionTitle')), '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, bottomDetailText('cardTitle')), '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 ('richContent') {\n <div\n class=\"pfx-expansion-node-rich-content\"\n (click)=\"$event.stopPropagation()\"\n >\n <praxis-rich-content\n [document]=\"getExpansionDetailRichContentDocument(node)\"\n [layout]=\"getExpansionDetailRichContentLayout(node)\"\n [rootClassName]=\"node?.rootClassName || 'pfx-expansion-node-rich-content__document'\"\n [context]=\"getExpansionDetailRichContentContext(row, index, node)\"\n [hostCapabilities]=\"getExpansionDetailRichContentHostCapabilities(row)\"\n ></praxis-rich-content>\n </div>\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, node)\"\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, node)\"\n ></praxis-rich-content>\n }\n </div>\n } @else {\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-placeholder\"\n [nodes]=\"getExpansionDetailTextRichContentNodes(bottomDetailText('itemsEmpty'), '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(bottomDetailText('tabOutside'), '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(bottomDetailText('unsupportedNode'), '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\n@if (isAnalyticalDrawerEnabled()) {\n <praxis-analytical-drawer\n [isOpen]=\"isAnalyticalDrawerOpen\"\n [drawerConfig]=\"config?.behavior?.drawer || null\"\n [resourcePath]=\"resourcePath\"\n [row]=\"analyticalDrawerRow\"\n (closeDrawer)=\"closeAnalyticalDrawer()\"\n (tabChange)=\"onAnalyticalDrawerTabChange($event)\"\n />\n}\n", styles: ["@charset \"UTF-8\";.pfx-micro-viz-cell{position:relative;display:inline-block;width:min(100%,210px);min-width:112px;max-width:240px;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) 78%,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;z-index:2;background:var(--md-sys-color-on-surface, #111827);box-shadow:0 0 0 .75px var(--md-sys-color-surface, #ffffff)}.pfx-micro-bullet__target[style*=\"left: 100%\"],.pfx-micro-bullet__target[style*=\"left: 100.00%\"]{transform:translate(-100%)}.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:static;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],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-trend__scrub-slice[data-tone=success]{color:var(--p-table-state-success-fg, #168a4a)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz[data-tone=warning],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-trend__scrub-slice[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],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-trend__scrub-slice[data-tone=danger],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-trend__scrub-slice[data-tone=critical]{color:var(--p-table-state-danger-fg, #b3261e)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz[data-tone=info],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-trend__scrub-slice[data-tone=info]{color:var(--md-sys-color-primary, #2563eb)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz[data-tone=neutral],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-trend__scrub-slice[data-tone=neutral]{color:var(--md-sys-color-secondary, #5c6b73)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz{position:relative;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{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__segments{position:static;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);transform-origin:left center;animation:pfxMicroBarGrow var(--p-table-microviz-animation-duration, .32s) cubic-bezier(.22,1,.36,1) both;transition:opacity .15s ease,filter .15s ease,transform .15s ease}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__row[data-tone=success] .pfx-micro-viz__bar,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__segment[data-tone=success],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz[data-tone=success] .pfx-micro-viz__bar{background:var(--p-table-state-success-fg, #168a4a)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__row[data-tone=warning] .pfx-micro-viz__bar,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__segment[data-tone=warning],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz[data-tone=warning] .pfx-micro-viz__bar{background:var(--p-table-state-warning-fg, #b45f06)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__row[data-tone=danger] .pfx-micro-viz__bar,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__row[data-tone=critical] .pfx-micro-viz__bar,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__segment[data-tone=danger],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__segment[data-tone=critical],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz[data-tone=danger] .pfx-micro-viz__bar,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz[data-tone=critical] .pfx-micro-viz__bar{background:var(--p-table-state-danger-fg, #b3261e)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__row[data-tone=info] .pfx-micro-viz__bar,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__segment[data-tone=info],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz[data-tone=info] .pfx-micro-viz__bar{background:var(--md-sys-color-primary, #2563eb)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__row[data-tone=neutral] .pfx-micro-viz__bar,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__segment[data-tone=neutral],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz[data-tone=neutral] .pfx-micro-viz__bar{background:var(--md-sys-color-secondary, #5c6b73)}: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) 78%,transparent)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__bullet{display:flex;align-items:center;gap:8px;width:100%}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__track{position:relative;display:block;flex:1 1 auto;min-width:48px;block-size:var(--pfx-bullet-bar-height, 8px);overflow:hidden;border-radius:var(--pfx-micro-track-radius, 999px);background:var(--pfx-micro-track-color, var(--md-sys-color-surface-container-high, #e5e7eb));transition:transform .15s ease}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__bullet:hover .pfx-micro-bullet__track{transform:scaleY(1.18)}: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:1px;inset-inline-start:0;block-size:calc(100% - 2px);border-radius:inherit;transform-origin:left center;animation:pfxMicroBarGrow var(--p-table-microviz-animation-duration, .32s) cubic-bezier(.22,1,.36,1) both}: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);transition:transform .15s ease}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__target[style*=\"left: 100%\"],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__target[style*=\"left: 100.00%\"]{transform:translate(-100%)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__compact-value{flex:0 0 auto;font-size:11px;font-weight:600;line-height:1;color:var(--md-sys-color-on-surface, #1f2937);white-space:nowrap;font-variant-numeric:tabular-nums;text-align:right}: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-bullet__range[data-tone=neutral],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__actual[data-tone=neutral]{background:var(--md-sys-color-secondary, #5c6b73)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__row{position:relative;display:grid;grid-template-columns:minmax(42px,.8fr) minmax(52px,1fr) auto;align-items:center;gap:6px;min-width:0;transition:opacity .15s ease}: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{position:static;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;animation:pfxMicroPopIn var(--p-table-microviz-animation-duration, .28s) cubic-bezier(.22,1,.36,1) both}: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);transition:transform .16s ease}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz.pfx-micro-viz__delta[data-direction=up]:hover .pfx-micro-viz__delta-symbol{transform:translateY(-2px)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz.pfx-micro-viz__delta[data-direction=down]:hover .pfx-micro-viz__delta-symbol{transform:translateY(1.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{position:static;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;transition:transform .18s ease}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz.pfx-micro-viz__radial:hover .pfx-micro-radial-svg,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz.pfx-micro-viz__harvey:hover .pfx-micro-harvey-svg{transform:scale(1.08)}: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%;animation:pfxMicroPopIn var(--p-table-microviz-animation-duration, .32s) cubic-bezier(.22,1,.36,1) both}: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;transition:transform .18s ease}: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%;animation:pfxMicroPopIn var(--p-table-microviz-animation-duration, .32s) cubic-bezier(.22,1,.36,1) both}: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{position:relative;display:inline-flex;align-items:center;justify-content:center;width:100%;min-width:112px;overflow:visible}: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{position:relative;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;stroke-dasharray:240;stroke-dashoffset:0;animation:pfxMicroLineDraw var(--p-table-microviz-animation-duration, .32s) cubic-bezier(.22,1,.36,1) both}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-area__fill{fill:currentColor;animation:pfxMicroAreaFade var(--p-table-microviz-animation-duration, .32s) ease both}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-trend__ref-line{stroke:var(--md-sys-color-on-surface-variant, #6b7280);stroke-width:1px;stroke-dasharray:2 2;opacity:.55}: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{transform-box:fill-box;transform-origin:center bottom;animation:pfxMicroColGrow var(--p-table-microviz-animation-duration, .32s) cubic-bezier(.22,1,.36,1) both;transition:opacity .14s ease,filter .14s ease}: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__fallback{display:inline-flex;align-items:center;font-size:var(--pfx-micro-fallback-font-size, 12px);color:var(--md-sys-color-on-surface-variant, #6b7280);line-height:1.2;-webkit-user-select:text;user-select:text}: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{position:static;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;animation:pfxMicroPopIn var(--p-table-microviz-animation-duration, .28s) cubic-bezier(.22,1,.36,1) both;transition:transform .15s ease,box-shadow .15s ease}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__node[data-active=true]{box-shadow:0 0 0 3px color-mix(in srgb,currentColor 22%,transparent)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__node-wrapper:hover .pfx-micro-step__node{transform:scale(1.12)}: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)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__comparison:hover .pfx-micro-viz__row:not(:hover){opacity:.45}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__segments:hover .pfx-micro-viz__segment:not(:hover){opacity:.42}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__segments .pfx-micro-viz__segment:hover{filter:brightness(1.08)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-trend__scrub-layer{position:absolute;inset:0;display:flex;align-items:stretch;z-index:2}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-trend__scrub-slice{position:static;flex:1 1 0%;height:100%;cursor:crosshair}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-trend__scrub-slice:hover:before{content:\"\";position:absolute;left:var(--pfx-scrub-x, 50%);top:var(--pfx-scrub-y, 50%);width:7px;height:7px;border-radius:50%;background:currentColor;border:1.5px solid var(--md-sys-color-surface, #ffffff);box-shadow:0 1px 4px #00000040;transform:translate(-50%,-50%);pointer-events:none;z-index:3}:host ::ng-deep .mat-mdc-cell:has(.pfx-micro-viz-cell),:host ::ng-deep .mat-mdc-cell:has(.pfx-micro-viz-cell) .pfx-cell-content{overflow:visible}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz[data-micro-readout]:hover:after,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz[data-micro-readout]:focus-visible:after,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__row[data-micro-readout]:hover:after,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__segment[data-micro-readout]:hover:after,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__node-wrapper[data-micro-readout]:hover:after,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-trend__scrub-slice[data-micro-readout]:hover:after{content:attr(data-micro-readout);position:absolute;inset-block-end:calc(100% + 4px);inset-inline-start:0;z-index:20;max-width:none;padding:3px 8px;border-radius:6px;background:var(--md-sys-color-surface-container-highest, #1e293b);color:var(--md-sys-color-on-surface, #f8fafc);border:1px solid var(--md-sys-color-outline-variant, rgba(148, 163, 184, .35));font-family:var(--md-sys-typescale-body-medium-font-family, sans-serif);font-size:10.5px;font-weight:600;font-variant-numeric:tabular-nums;line-height:1.25;white-space:nowrap;box-shadow:0 4px 12px #0f172a3d;pointer-events:none}@keyframes pfxMicroBarGrow{0%{transform:scaleX(0)}to{transform:scaleX(1)}}@keyframes pfxMicroColGrow{0%{transform:scaleY(0)}to{transform:scaleY(1)}}@keyframes pfxMicroLineDraw{0%{stroke-dashoffset:240}to{stroke-dashoffset:0}}@keyframes pfxMicroAreaFade{0%{opacity:0}to{opacity:1}}@keyframes pfxMicroPopIn{0%{opacity:.4;transform:scale(.88)}to{opacity:1;transform:scale(1)}}@media(prefers-reduced-motion:reduce),print{:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz *,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}}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{box-sizing:border-box;width:var(--p-table-visible-viewport-width, 100%);max-width:100%;position:sticky;left:0;container-type:inline-size;padding:16px 20px;border-left:3px solid var(--md-sys-color-primary);background:color-mix(in srgb,var(--md-sys-color-surface-container-low, var(--p-table-bg)) 92%,var(--md-sys-color-primary, transparent) 8%)}.ptable-bottom-detail{min-width:0;overflow:hidden;border:1px solid var(--p-table-border-color);border-top:0;border-radius:0 0 12px 12px;background:var(--p-table-bg, var(--mat-sys-surface, var(--md-sys-color-surface)));color:var(--mat-sys-on-surface, var(--md-sys-color-on-surface));box-shadow:var(--p-table-surface-shadow)}.ptable-bottom-detail--before-controls{border-radius:0;box-shadow:none}.ptable-bottom-detail__header{display:flex;align-items:center;justify-content:space-between;gap:16px;min-height:56px;padding:6px 14px 6px 16px;border-bottom:1px solid color-mix(in srgb,var(--p-table-border-color) 72%,transparent);background:color-mix(in srgb,var(--md-sys-color-primary-container, var(--p-table-bg)) 22%,var(--p-table-bg) 78%)}.ptable-bottom-detail__header button{flex-shrink:0;border-radius:999px}.ptable-bottom-detail__identity{display:flex;min-width:0;align-items:center;gap:10px}.ptable-bottom-detail__identity>mat-icon{flex:0 0 auto;color:var(--md-sys-color-primary)}.ptable-bottom-detail__heading{display:grid;min-width:0}.ptable-bottom-detail__heading strong{overflow:hidden;font-size:14px;line-height:20px;text-overflow:ellipsis;white-space:nowrap}.ptable-bottom-detail__eyebrow{color:var(--md-sys-color-on-surface-variant);font-size:11px;font-weight:700;letter-spacing:.055em;line-height:16px;text-transform:uppercase}.ptable-bottom-detail__body{box-sizing:border-box;display:grid;align-content:start;gap:16px;max-height:40dvh;overflow:auto;scrollbar-gutter:stable;overscroll-behavior:contain;padding:16px;overflow-wrap:anywhere}.ptable-bottom-detail__body>[data-testid=table-bottom-detail-status]:empty{display:none}.ptable-bottom-detail--dynamic .ptable-bottom-detail__body{height:auto;scrollbar-gutter:auto}.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:14px}.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:10px;padding:12px 14px;background:var(--md-sys-color-surface)}.pfx-expansion-node.pfx-expansion-node-card-grid,.pfx-expansion-node.pfx-expansion-node-rich-content{border:0;border-radius:0;padding:0;background:transparent}.pfx-expansion-node-card__header{margin-bottom:10px}.pfx-expansion-node-card__title{margin:0;font-size:14px;font-weight:700;line-height:1.3;letter-spacing:-.01em}.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;justify-content:space-between;flex-wrap:wrap;gap:6px 12px;padding:8px 10px;border-radius:8px;background:color-mix(in srgb,var(--md-sys-color-surface-container-low, transparent) 70%,transparent)}.pfx-expansion-node-value__label{color:var(--md-sys-color-on-surface-variant);font-size:11px;font-weight:700;letter-spacing:.04em;text-transform:uppercase}.pfx-expansion-node-value__content{font-size:13.5px;font-weight:600;color:var(--md-sys-color-on-surface);font-variant-numeric:tabular-nums}.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, var(--mat-sys-surface-container-lowest))}.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}:is(.pfx-expansion-node-action-bar__action-btn,.pfx-expansion-node-rich-list__item-action-btn,.pfx-expansion-node-embed__action-btn,.pfx-expansion-node-action button,.praxis-row-btn,.praxis-icon-btn):disabled{opacity:.56;filter:saturate(.35);box-shadow:none;cursor:not-allowed}.pfx-expansion-node-card-grid__header{display:flex;flex-wrap:wrap;align-items:baseline;justify-content:space-between;gap:4px 12px;margin:0 0 12px;padding-bottom:8px;border-bottom:1px solid color-mix(in srgb,var(--p-table-border-color) 65%,transparent)}.pfx-expansion-node-card-grid__title-text{font-size:13px;font-weight:800;letter-spacing:.04em;text-transform:uppercase;color:var(--md-sys-color-on-surface)}.pfx-expansion-node-card-grid__subtitle-text{font-size:12px;font-weight:500;color:var(--md-sys-color-on-surface-variant)}.pfx-expansion-node-card-grid__cards{display:grid;gap:12px;grid-template-columns:var(--pfx-expansion-card-grid-columns, repeat(auto-fit, minmax(min(var(--pfx-expansion-card-grid-min-width, 220px), 100%), 1fr)))}@container (max-width: 780px){.pfx-expansion-node-card-grid__cards{grid-template-columns:repeat(auto-fit,minmax(min(240px,100%),1fr))}}@container (max-width: 520px){.pfx-expansion-node-card-grid__cards{grid-template-columns:minmax(0,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%;border:0;padding:0;background:transparent}.pfx-expansion-node-rich-content{min-width:0}.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-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-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-icon-btn.destructive{color:var(--md-sys-color-error)}.praxis-row-overflow-menu__item{min-width:212px;max-width:min(320px,88vw)}.praxis-row-overflow-menu__item[disabled]{pointer-events:auto!important;cursor:default!important}.praxis-row-overflow-menu__item ::ng-deep .mat-mdc-menu-item-text{display:flex;align-items:center;min-width:0;white-space:nowrap}.praxis-row-overflow-menu__item ::ng-deep .praxis-row-overflow-menu__label,.praxis-row-overflow-menu__item ::ng-deep .praxis-row-overflow-menu__label-text,.praxis-row-overflow-menu__item ::ng-deep .praxis-row-overflow-menu__label .prx-rich-text,::ng-deep .mat-mdc-menu-panel .pfx-menu-item__content,::ng-deep .mat-mdc-menu-panel .pfx-menu-item__content .prx-rich-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;word-break:normal;overflow-wrap:normal}.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;position:relative;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;min-width:100%}: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.detail-stack{border-bottom-right-radius:0;border-bottom-left-radius:0;box-shadow:none}: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, var(--mat-sys-surface-container))!important;background-color:var(--md-sys-color-surface-container, var(--mat-sys-surface-container))!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-quick-view-trigger--button,.pfx-cell-quick-view-btn{appearance:none;border:none;background:transparent;padding:0;margin:0;font:inherit;color:inherit;text-align:inherit;line-height:inherit;cursor:pointer}.pfx-cell-quick-view-btn,.pfx-cell-value.pfx-quick-view-trigger--button{border-bottom:1px dashed color-mix(in srgb,var(--md-sys-color-primary) 52%,transparent);transition:color .14s ease,border-color .14s ease}.pfx-cell-quick-view-btn:hover,.pfx-cell-value.pfx-quick-view-trigger--button:hover{color:var(--md-sys-color-primary);border-bottom-color:var(--md-sys-color-primary)}.pfx-link-with-quick-view{display:inline-flex;align-items:center;gap:5px;min-width:0;max-width:100%}.pfx-quick-view-adjacent-btn{appearance:none;flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;padding:0;border-radius:5px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 30%,transparent);background:color-mix(in srgb,var(--md-sys-color-primary) 10%,transparent);color:var(--md-sys-color-primary);cursor:pointer;transition:background-color .14s ease,border-color .14s ease}.pfx-quick-view-adjacent-btn:hover{background:color-mix(in srgb,var(--md-sys-color-primary) 18%,transparent);border-color:color-mix(in srgb,var(--md-sys-color-primary) 52%,transparent)}.pfx-quick-view-adjacent-btn__icon{font-size:13px!important;width:13px!important;height:13px!important;line-height:13px!important}.praxis-quick-view-trigger{cursor:pointer}.praxis-quick-view-trigger:focus-visible,.pfx-quick-view-trigger--button:focus-visible,.pfx-quick-view-adjacent-btn:focus-visible{outline:2px solid var(--md-sys-color-primary);outline-offset:2px;border-radius:4px}.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{background:var(--md-sys-color-error);color:var(--md-sys-color-on-error)}.pfx-chip--filled-warning{background:var(--p-table-state-warning-bg);color:var(--p-table-state-warning-fg)}.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,.pfx-chip--filled-neutral,.pfx-chip--filled-default{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-warning{background:color-mix(in srgb,var(--p-table-state-warning-bg) 72%,transparent);color:var(--p-table-state-warning-fg);border-color:color-mix(in srgb,var(--p-table-state-warning-fg) 18%,transparent)}.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,.pfx-chip--soft-neutral,.pfx-chip--soft-default{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-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.dir-media{display:inline-grid;grid-template-columns:auto minmax(0,1fr);grid-auto-rows:auto;align-content:center;align-items:center;column-gap:var(--p-table-compose-media-gap, 10px);row-gap:1px;min-width:0;max-width:100%;line-height:1.25}.pfx-cell-compose.dir-media>:first-child{grid-column:1;grid-row:1/span 6;align-self:center}.pfx-cell-compose.dir-media>:first-child:nth-last-child(2){grid-row:1}.pfx-cell-compose.dir-media>:first-child:nth-last-child(3){grid-row:1/span 2}.pfx-cell-compose.dir-media>:first-child:nth-last-child(4){grid-row:1/span 3}.pfx-cell-compose.dir-media>:first-child:nth-last-child(5){grid-row:1/span 4}.pfx-cell-compose.dir-media>:first-child:nth-last-child(6){grid-row:1/span 5}.pfx-cell-compose.dir-media>:not(:first-child){grid-column:2;justify-self:start;min-width:0;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pfx-cell-compose.dir-media .pfx-badge,.pfx-cell-compose.dir-media .pfx-chip{padding-block:2px;font-size:11px}.pfx-cell-compose.dir-col .pfx-cell-value--subtle,.pfx-cell-compose.dir-media .pfx-cell-value--subtle{font-variant-numeric:tabular-nums}.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%;container:praxis-table-viewport/inline-size;overflow-x:auto;-webkit-overflow-scrolling:touch;overscroll-behavior-x:contain;background:var(--p-table-bg);border-radius:12px 12px 0 0;transition:box-shadow .12s ease-out}.ptable-data-surface{position:relative;min-width:0}.ptable-data-surface--loading-overlay{min-block-size:10rem}.px-scroll-viewport--can-scroll-left{box-shadow:inset 1px 0 color-mix(in srgb,var(--md-sys-color-primary, #1263b4) 42%,transparent),inset 34px 0 26px -26px color-mix(in srgb,var(--md-sys-color-on-surface, #1a1b1f) 68%,transparent)}.px-scroll-viewport--can-scroll-right{box-shadow:inset -1px 0 color-mix(in srgb,var(--md-sys-color-primary, #1263b4) 42%,transparent),inset -34px 0 26px -26px color-mix(in srgb,var(--md-sys-color-on-surface, #1a1b1f) 68%,transparent)}.px-scroll-viewport--can-scroll-left.px-scroll-viewport--can-scroll-right{box-shadow:inset 1px 0 color-mix(in srgb,var(--md-sys-color-primary, #1263b4) 42%,transparent),inset -1px 0 color-mix(in srgb,var(--md-sys-color-primary, #1263b4) 42%,transparent),inset 34px 0 26px -26px color-mix(in srgb,var(--md-sys-color-on-surface, #1a1b1f) 68%,transparent),inset -34px 0 26px -26px color-mix(in srgb,var(--md-sys-color-on-surface, #1a1b1f) 68%,transparent)}.px-scroll-viewport--can-scroll-left .pfx-sticky-boundary-start:after,.px-scroll-viewport--can-scroll-right .pfx-sticky-boundary-end:before{content:\"\";position:absolute;inset-block:0;width:1px;pointer-events:none;background:var(--p-table-border-color);z-index:1}.px-scroll-viewport--can-scroll-left .pfx-sticky-boundary-start:after{inset-inline-end:-1px;box-shadow:12px 0 16px -12px var(--p-table-text-color)}.px-scroll-viewport--can-scroll-right .pfx-sticky-boundary-end:before{inset-inline-start:-1px;box-shadow:-12px 0 16px -12px var(--p-table-text-color)}:host-context([dir=rtl]) .px-scroll-viewport--can-scroll-left .pfx-sticky-boundary-start:after{box-shadow:-12px 0 16px -12px var(--p-table-text-color)}:host-context([dir=rtl]) .px-scroll-viewport--can-scroll-right .pfx-sticky-boundary-end:before{box-shadow:12px 0 16px -12px var(--p-table-text-color)}@media(forced-colors:active){.px-scroll-viewport--can-scroll-left .pfx-sticky-boundary-start:after,.px-scroll-viewport--can-scroll-right .pfx-sticky-boundary-end:before{background:CanvasText;box-shadow:none;forced-color-adjust:none}}.px-scroll-viewport:focus-visible{outline:2px solid var(--md-sys-color-primary, #1263b4);outline-offset:-2px}.px-scroll-viewport--refreshing{cursor:progress}.px-scroll-viewport--loading-replaced{display:none}.px-scroll-viewport--refreshing .praxis-table-data--refreshing{pointer-events:none}.ptable-refresh-state{min-height:36px;display:flex;align-items:center;justify-content:center;gap:10px;padding:6px 12px;color:var(--md-sys-color-on-surface-variant, #5a5d67);background:var(--md-sys-color-surface-container-low, var(--p-table-bg));border-block:1px solid var(--md-sys-color-outline-variant, rgba(18, 99, 180, .12));font-size:.85rem;font-weight:600}.ptable-refresh-state__spinner{width:16px;height:16px;flex:0 0 16px;border:2px solid color-mix(in srgb,var(--md-sys-color-primary, #1263b4) 24%,transparent);border-top-color:var(--md-sys-color-primary, #1263b4);border-radius:50%;animation:ptable-refresh-spin .72s linear infinite}.ptable-refresh-state__progress,.ptable-refresh-state__skeleton{position:relative;display:block;width:54px;height:6px;flex:0 0 54px;overflow:hidden;border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-primary, #1263b4) 18%,transparent)}.ptable-refresh-state__progress:after,.ptable-refresh-state__skeleton:after{content:\"\";position:absolute;inset-block:0;width:45%;border-radius:inherit;background:var(--md-sys-color-primary, #1263b4);animation:ptable-loading-progress 1.1s ease-in-out infinite}.ptable-refresh-state__skeleton:after{width:100%;background:linear-gradient(90deg,transparent,color-mix(in srgb,var(--md-sys-color-primary, #1263b4) 44%,transparent),transparent);animation-name:ptable-loading-wave}@keyframes ptable-refresh-spin{to{transform:rotate(360deg)}}@keyframes ptable-loading-progress{0%{transform:translate(-110%)}to{transform:translate(225%)}}.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%}.px-scroll-viewport.pfx-mobile-card-mode{overflow-x:visible}:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode{display:block;width:100%!important;min-width:0!important;max-width:none!important;background:transparent}:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode thead{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode tbody{display:grid;gap:12px}:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode .mat-mdc-row:not(.pfx-expansion-detail-row){display:grid;grid-template-columns:minmax(0,1fr);gap:0;height:auto;min-height:0;overflow:hidden;border:1px solid var(--p-table-border-color);border-radius:12px;background:var(--p-table-row-bg);box-shadow:none}:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode .mat-mdc-row:not(.pfx-expansion-detail-row) .mat-mdc-cell[data-praxis-card-label]{display:grid;grid-template-columns:minmax(7rem,.8fr) minmax(0,1.2fr);align-items:start;gap:12px;width:auto!important;min-width:0!important;max-width:none!important;height:auto!important;min-height:var(--p-table-row-height, var(--p-table-row-height-default, 44px));position:static!important;inset:auto!important;z-index:auto!important;padding:var(--p-cell-padding, var(--p-cell-padding-default, 10px 14px));border:0;border-bottom:1px solid var(--p-table-border-color);text-align:initial!important;white-space:normal;overflow:visible;text-overflow:clip}:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode .mat-mdc-row:not(.pfx-expansion-detail-row) .mat-mdc-cell[data-praxis-card-label]:before{content:attr(data-praxis-card-label);color:var(--p-table-header-fg);font-size:.75rem;font-weight:700;line-height:1.35}:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode .mat-mdc-row:not(.pfx-expansion-detail-row) .mat-mdc-cell[data-praxis-card-label] .pfx-cell-content{min-width:0;overflow:visible;white-space:normal;justify-content:flex-start!important;text-align:start!important}:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode .pfx-chip,:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode .pfx-badge{max-width:100%;height:auto;white-space:normal;overflow-wrap:anywhere}:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode .pfx-cell-compose.dir-media>:not(:first-child){white-space:normal;overflow-wrap:anywhere;text-overflow:clip}:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode .mat-mdc-row:not(.pfx-expansion-detail-row) .mat-mdc-cell[data-praxis-card-label]:last-child{border-bottom:0}:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode .praxis-actions-cell{grid-column:1/-1}:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode .praxis-actions-cell .praxis-actions-cell__content{justify-content:flex-start;flex-wrap:wrap}:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode .mat-mdc-row:not(.pfx-expansion-detail-row) .praxis-actions-cell[data-praxis-card-label=\"\"]{grid-template-columns:minmax(0,1fr);align-items:center;padding-block:0}:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode .mat-mdc-row:not(.pfx-expansion-detail-row) .praxis-actions-cell[data-praxis-card-label=\"\"]:before{content:none}@container praxis-table-viewport (max-width: 480px){:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode .mat-mdc-row:not(.pfx-expansion-detail-row) .mat-mdc-cell[data-praxis-card-label]{grid-template-columns:minmax(0,1fr);gap:4px}:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode .mat-mdc-row:not(.pfx-expansion-detail-row) .mat-mdc-cell[data-praxis-card-label] .pfx-cell-content{width:100%;overflow:visible;overflow-wrap:anywhere}:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode .pfx-cell-content>*{min-width:0;max-width:100%}:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode .praxis-actions-cell .praxis-actions-cell__content{gap:8px}}: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):not(.praxis-header-align-center) .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:0;padding-inline-end:0}: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.pfx-row-click-selectable:focus-visible{outline:2px solid var(--praxis-theme-focus-outline, var(--md-sys-color-primary));outline-offset:-2px}: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>mat-radio-button{--mat-radio-selected-icon-color: var(--p-table-row-selected-fg);--mat-radio-selected-hover-icon-color: var(--p-table-row-selected-fg);--mat-radio-selected-focus-icon-color: var(--p-table-row-selected-fg);--mat-radio-selected-pressed-icon-color: var(--p-table-row-selected-fg)}:host ::ng-deep .mat-mdc-table:not(.pfx-mobile-card-mode) .mat-mdc-row.pfx-row-selected .mat-mdc-cell:first-child{position:relative}:host ::ng-deep .mat-mdc-table:not(.pfx-mobile-card-mode) .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 ::ng-deep .mat-mdc-table.pfx-mobile-card-mode .mat-mdc-row.pfx-row-selected{box-shadow:inset 4px 0 0 var(--p-table-row-selected-indicator)}: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{background:var(--md-sys-color-error);color:var(--md-sys-color-on-error)}.pfx-badge--filled-warning{background:var(--p-table-state-warning-bg);color:var(--p-table-state-warning-fg)}.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,.pfx-badge--filled-neutral,.pfx-badge--filled-default{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-warning{background:color-mix(in srgb,var(--p-table-state-warning-bg) 72%,transparent);color:var(--p-table-state-warning-fg);border-color:color-mix(in srgb,var(--p-table-state-warning-fg) 18%,transparent)}.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,.pfx-badge--soft-neutral,.pfx-badge--soft-default{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--overlay{position:absolute;z-index:8;inset:0;min-block-size:10rem;background:color-mix(in srgb,var(--md-sys-color-surface, #fff) 92%,transparent);-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}.ptable-loading-state__spinner{width:34px;height:34px;margin:18px auto 8px;border:3px solid color-mix(in srgb,var(--md-sys-color-primary, #1263b4) 22%,transparent);border-top-color:var(--md-sys-color-primary, #1263b4);border-radius:50%;animation:ptable-refresh-spin .72s linear infinite}.ptable-loading-state__progress{height:6px;margin:28px 12px 16px;overflow:hidden;border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-primary, #1263b4) 18%,transparent)}.ptable-loading-state__progress span{display:block;width:38%;height:100%;border-radius:inherit;background:var(--md-sys-color-primary, #1263b4);animation:ptable-loading-progress 1.1s ease-in-out infinite}.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;font-weight:550;color:var(--pdx-text-shimmer-base, var(--md-sys-color-on-surface-variant, #5a5d67));padding-inline:4px}.ptable-refresh-state__message{font-weight:550;color:var(--pdx-text-shimmer-base, var(--md-sys-color-on-surface-variant, #5a5d67))}@supports (-webkit-background-clip: text) or (background-clip: text){.ptable-loading-state__message,.ptable-refresh-state__message{background-image:var(--pdx-text-shimmer-gradient, linear-gradient(105deg, color-mix(in oklab, var(--md-sys-color-on-surface-variant, #5a5d67) 78%, var(--md-sys-color-on-surface, #0f172a) 22%) 0%, color-mix(in oklab, var(--md-sys-color-on-surface-variant, #5a5d67) 78%, var(--md-sys-color-on-surface, #0f172a) 22%) 26%, color-mix(in oklab, var(--md-sys-color-tertiary, #6366f1) 66%, #a855f7 34%) 40%, var(--pdx-text-shimmer-peak, var(--md-sys-color-on-surface, #ffffff)) 50%, color-mix(in oklab, var(--md-sys-color-primary, #006a6a) 66%, #ec4899 34%) 60%, color-mix(in oklab, var(--md-sys-color-on-surface-variant, #5a5d67) 78%, var(--md-sys-color-on-surface, #0f172a) 22%) 74%, color-mix(in oklab, var(--md-sys-color-on-surface-variant, #5a5d67) 78%, var(--md-sys-color-on-surface, #0f172a) 22%) 100%));background-size:300% 100%;background-position:100% 50%;background-repeat:no-repeat;-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;color:transparent;animation:ptable-text-shimmer-sweep var(--pdx-text-shimmer-duration, 2.6s) linear infinite;will-change:background-position}}@keyframes ptable-text-shimmer-sweep{0%{background-position:100% 50%}to{background-position:0% 50%}}.ptable-loading-state__actions{display:flex;justify-content:flex-end}.ptable-loading-state__hero--static .ptable-loading-state__line,.ptable-loading-state__hero--static .ptable-loading-state__cell{animation:none}@media(prefers-reduced-motion:reduce){.ptable-refresh-state__spinner,.ptable-refresh-state__progress:after,.ptable-refresh-state__skeleton:after,.ptable-loading-state__spinner,.ptable-loading-state__progress span,.ptable-loading-state__line,.ptable-loading-state__cell{animation:none}}@media(prefers-reduced-motion:reduce),(forced-colors:active),print{.ptable-loading-state__message,.ptable-refresh-state__message{animation:none!important;background-image:none!important;-webkit-text-fill-color:currentColor!important;color:var(--md-sys-color-primary, currentColor)!important;will-change:auto}}@media(forced-colors:active){.ptable-loading-state__message,.ptable-refresh-state__message{color:CanvasText!important;-webkit-text-fill-color:CanvasText!important}}.ptable-cancelled-state{display:flex;align-items:center;gap:12px;padding:12px 16px;border:1px solid var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface-container-low);color:var(--md-sys-color-on-surface)}.ptable-cancelled-state__content{display:grid;flex:1;gap:2px}.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{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, var(--praxis-action-control-height, 40px));--pdx-empty-state-action-radius: var(--p-table-empty-action-radius, var(--praxis-action-control-radius, 8px));--pdx-empty-state-transparent-margin: 0}.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%}.ptable-header-actions{display:flex;align-items:center;gap:8px;padding:10px 14px 6px}.ptable-header-title{margin-right:auto;font-size:.95rem;font-weight:600;letter-spacing:-.01em;color:var(--p-table-header-fg, var(--md-sys-color-on-surface))}\n"], dependencies: [{ kind: "component", type: TableCollectionOutcomeComponent, selector: "praxis-table-collection-outcome", inputs: ["result"] }, { kind: "component", type: TableBulkSyncWorkflowComponent, selector: "praxis-table-bulk-sync-workflow", inputs: ["handle", "loading"], outputs: ["closed"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i10.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i10.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }, { kind: "directive", type: i10.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i10.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: i14$1.MatBadge, selector: "[matBadge]", inputs: ["matBadgeColor", "matBadgeOverlap", "matBadgeDisabled", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i3.MatMiniFabButton, selector: "button[mat-mini-fab], a[mat-mini-fab], button[matMiniFab], a[matMiniFab]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i7$1.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.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: i23.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i23.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i23.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i23.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i23.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i23.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i23.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i23.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i23.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i23.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", "presentation", "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", "contextChange", "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", "focusScope", "showMain", "showActionsGroup", "showEndActions", "showMobileActions", "exportBusy", "exportStatusMessage", "evaluationContext", "activeQuickFilterId", "activeDensity", "activeCrossFilters", "columnVisibilityController"], outputs: ["clearCrossFilter", "clearAllCrossFilters", "toolbarAction", "exportAction", "columnVisibilityToggle", "quickFilterChange", "densityChange"] }, { kind: "component", type: PraxisRichContent, selector: "praxis-rich-content", inputs: ["document", "nodes", "context", "hostCapabilities", "layout", "rootClassName"], outputs: ["nodeAction"] }, { kind: "directive", type: PraxisQuickViewTriggerDirective, selector: "[praxisQuickView]", inputs: ["praxisQuickView", "praxisQuickViewRecord", "praxisQuickViewTriggerMode", "praxisQuickViewAnchorId", "praxisQuickViewSourceId", "praxisQuickViewEndpointKey", "praxisQuickViewApiUrlEntry", "praxisQuickViewQueryContext", "praxisQuickViewHoverOpenDelayMs", "praxisQuickViewHoverCloseDelayMs", "praxisQuickViewStopPropagation"], exportAs: ["praxisQuickView"] }, { 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"] }, { kind: "component", type: PraxisAnalyticalDrawerComponent, selector: "praxis-analytical-drawer", inputs: ["isOpen", "resourcePath", "drawerConfig", "row", "relations", "loadingRelations"], outputs: ["closeDrawer", "tabChange", "relationFetch"] }] });
|
|
44888
|
+
], queries: [{ propertyName: "toolbar", first: true, predicate: PraxisTableToolbar, descendants: true }, { propertyName: "projectedFilter", first: true, predicate: ["projectedFilter"], descendants: true }], viewQueries: [{ propertyName: "filterBarTemplate", first: true, predicate: ["filterBarTemplate"], descendants: true }, { 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: "virtualScrollViewport", first: true, predicate: CdkVirtualScrollViewport, descendants: true }, { propertyName: "scrollViewport", first: true, predicate: ["scrollViewport"], descendants: true }, { propertyName: "internalFilter", first: true, predicate: PraxisFilter, descendants: true }], usesOnChanges: true, ngImport: i0, template: "@if (collectionWorkflowOutcome && collectionWorkflowOutcome.resourcePath === resourcePath) {\n<praxis-table-collection-outcome [result]=\"collectionWorkflowOutcome\"></praxis-table-collection-outcome>\n}\n@if (bulkSyncHandle && canShowBulkSyncHandle()) {\n @for (handle of [bulkSyncHandle]; track handle) {\n <praxis-table-bulk-sync-workflow [handle]=\"handle\" [loading]=\"config?.behavior?.loading\"\n (closed)=\"closeBulkSync()\" />\n }\n}\n\n@if (shouldShowEmptyState()) {\n<praxis-empty-state-card\n icon=\"link\"\n [title]=\"getSetupEmptyStateTitle()\"\n [description]=\"getSetupEmptyStateDescription()\"\n [primaryAction]=\"getSetupEmptyStatePrimaryAction()\"\n></praxis-empty-state-card>\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} @if (isAiAssistantEnabled() && aiAssistantOpen && aiAssistantViewState) {\n @for (owner of [aiAssistantShellOwnerKey()]; track owner) {\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)=\"onAiAssistantShellPromptChange($event, owner)\"\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\n<!-- Shared template for <praxis-filter> (inline toolbar or teleported via <praxis-filter-outlet>) -->\n<ng-template #filterBarTemplate>\n @if (shouldRenderAdvancedFilter()) {\n <praxis-filter\n advancedFilter\n [resourcePath]=\"getAdvancedFilterResourcePath()\"\n [filterId]=\"tableId\"\n [formId]=\"getAdvancedFilterFormId()\"\n [persistenceKey]=\"getAdvancedFilterPersistenceKey()\"\n [disablePersistence]=\"configPersistenceStrategy === 'volatile'\"\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 [tags]=\"config.behavior?.filtering?.advancedFilters?.settings?.tags\"\n [advancedOpenMode]=\"getAdvancedFilterOpenMode()\"\n [presentation]=\"config.behavior?.filtering?.advancedFilters?.settings?.presentation\"\n [advancedClearButtonsEnabled]=\"config.behavior?.filtering?.advancedFilters?.settings?.advancedClearButtonsEnabled\"\n [useInlineSearchableSelectVariant]=\"config.behavior?.filtering?.advancedFilters?.settings?.useInlineSearchableSelectVariant ?? true\"\n [useInlineRangeVariant]=\"config.behavior?.filtering?.advancedFilters?.settings?.useInlineRangeVariant ?? true\"\n [useInlineDateVariant]=\"config.behavior?.filtering?.advancedFilters?.settings?.useInlineDateVariant ?? true\"\n [useInlineDateRangeVariant]=\"config.behavior?.filtering?.advancedFilters?.settings?.useInlineDateRangeVariant ?? true\"\n [useInlineTimeVariant]=\"config.behavior?.filtering?.advancedFilters?.settings?.useInlineTimeVariant ?? true\"\n [useInlineTimeRangeVariant]=\"config.behavior?.filtering?.advancedFilters?.settings?.useInlineTimeRangeVariant ?? true\"\n [useInlineTreeSelectVariant]=\"config.behavior?.filtering?.advancedFilters?.settings?.useInlineTreeSelectVariant ?? true\"\n [changeDebounceMs]=\"config.behavior?.filtering?.advancedFilters?.settings?.changeDebounceMs ?? 300\"\n [i18n]=\"getFilterI18n()\"\n [mode]=\"'filter'\"\n [showAddButton]=\"shouldShowAdvancedFilterAddButton()\"\n [showAdvancedButton]=\"config.toolbar?.filters?.showAdvancedButton !== false\"\n [showFilterSettings]=\"shouldShowAdvancedFilterSettings()\"\n (change)=\"onAdvancedFilterChange($event)\"\n (requestSearch)=\"onAdvancedFilterSubmit($event)\"\n (clear)=\"onAdvancedFilterClear()\"\n ></praxis-filter>\n }\n</ng-template>\n\n@if (shouldRenderDataSurface() && !schemaError && toolbarV2) {\n<div\n class=\"praxis-table-header\"\n [class.edit-mode]=\"isCustomizationAvailable()\"\n [class.stacked]=\"hasTopToolbarStack()\"\n>\n @if (showToolbar && shouldShowToolbarTopPlacement()) {\n <praxis-table-toolbar\n class=\"praxis-toolbar-stack-top\"\n [config]=\"config\"\n [focusScope]=\"getFocusRestoreScope('header')\"\n [backgroundColor]=\"getToolbarActionsBackgroundColor()\"\n [style.--pfx-filter-h]=\"getToolbarLayoutHeightHostStyle()\"\n [evaluationContext]=\"getToolbarEvaluationContext()\"\n [activeQuickFilterId]=\"activeQuickFilterId\"\n [activeDensity]=\"resolveAppearanceDensity()\"\n [activeCrossFilters]=\"activeCrossFilters\"\n [columnVisibilityController]=\"toolbarColumnVisibilityController\"\n [showActionsGroup]=\"shouldShowToolbarActionsTop()\"\n [showMobileActions]=\"shouldShowToolbarActionsTop()\"\n [exportBusy]=\"exportBusy\"\n [exportStatusMessage]=\"exportStatusMessage\"\n (toolbarAction)=\"onToolbarAction($event)\"\n (exportAction)=\"onExportAction($event)\"\n (quickFilterChange)=\"onQuickFilterChange($event)\"\n (densityChange)=\"onDensityChange($event)\"\n (clearCrossFilter)=\"onClearCrossFilter($event)\"\n (clearAllCrossFilters)=\"onClearAllCrossFilters()\"\n >\n @if (shouldRenderAdvancedFilter() && !filterTeleport) {\n <ng-container ngProjectAs=\"[advancedFilter]\" *ngTemplateOutlet=\"filterBarTemplate\" />\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 } @if (isCustomizationAvailable()) {\n <button\n end-actions\n type=\"button\"\n praxisIconButton=\"settings\"\n size=\"compact\"\n class=\"praxis-table-toolbar-action--configuration\"\n data-role=\"table-settings\"\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 } @if (!showToolbar && isCustomizationAvailable()) {\n <div class=\"ptable-header-actions\">\n @if ($any(config)?.title) {\n <span class=\"ptable-header-title\">{{ $any(config).title }}</span>\n }\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\n type=\"button\"\n praxisIconButton=\"settings\"\n size=\"compact\"\n class=\"praxis-table-toolbar-action--configuration\"\n data-role=\"table-settings\"\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 @if (isRemoteMode()) {\n <button\n type=\"button\"\n praxisIconButton=\"link_off\"\n size=\"compact\"\n (click)=\"disconnect()\"\n [attr.aria-label]=\"getDisconnectLabel()\"\n [matTooltip]=\"getDisconnectTooltip()\"\n ></button>\n }\n </div>\n }\n</div>\n} @else { @if (shouldRenderDataSurface() && !schemaError) { @if\n(showToolbar && shouldShowToolbarTopPlacement()) {\n<praxis-table-toolbar\n class=\"praxis-toolbar-stack-top\"\n [config]=\"config\"\n [focusScope]=\"getFocusRestoreScope('header')\"\n [backgroundColor]=\"getToolbarActionsBackgroundColor()\"\n [style.--pfx-filter-h]=\"getToolbarLayoutHeightHostStyle()\"\n [evaluationContext]=\"getToolbarEvaluationContext()\"\n [activeQuickFilterId]=\"activeQuickFilterId\"\n [activeDensity]=\"resolveAppearanceDensity()\"\n [activeCrossFilters]=\"activeCrossFilters\"\n [showActionsGroup]=\"shouldShowToolbarActionsTop()\"\n [showMobileActions]=\"shouldShowToolbarActionsTop()\"\n [exportBusy]=\"exportBusy\"\n [exportStatusMessage]=\"exportStatusMessage\"\n (toolbarAction)=\"onToolbarAction($event)\"\n (exportAction)=\"onExportAction($event)\"\n (quickFilterChange)=\"onQuickFilterChange($event)\"\n (densityChange)=\"onDensityChange($event)\"\n (clearCrossFilter)=\"onClearCrossFilter($event)\"\n (clearAllCrossFilters)=\"onClearAllCrossFilters()\"\n>\n @if (shouldRenderAdvancedFilter() && !filterTeleport) {\n <ng-container ngProjectAs=\"[advancedFilter]\" *ngTemplateOutlet=\"filterBarTemplate\" />\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 } @if (isCustomizationAvailable()) {\n <button\n end-actions\n type=\"button\"\n praxisIconButton=\"settings\"\n size=\"compact\"\n class=\"praxis-table-toolbar-action--configuration\"\n data-role=\"table-settings\"\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} @if (!showToolbar && isCustomizationAvailable()) {\n<div class=\"ptable-header-actions\">\n @if ($any(config)?.title) {\n <span class=\"ptable-header-title\">{{ $any(config).title }}</span>\n }\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\n type=\"button\"\n praxisIconButton=\"settings\"\n size=\"compact\"\n class=\"praxis-table-toolbar-action--configuration\"\n data-role=\"table-settings\"\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</div>\n} } }\n<!-- Operational error state; authoring actions remain capability-gated when toolbar cannot render. -->\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\n mat-flat-button\n color=\"primary\"\n [disabled]=\"isErrorRetryInProgress()\"\n (click)=\"retryTableError()\"\n >\n <mat-icon\n [class.ptable-error__retry-icon--active]=\"isErrorRetryInProgress()\"\n >refresh</mat-icon\n >\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 (canCancelLoad()) {\n <button mat-stroked-button type=\"button\" (click)=\"cancelLoad()\">\n {{ getCancelLoadLabel() }}\n </button>\n }\n @if (isCustomizationAvailable() && schemaError) {\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\n type=\"button\"\n praxisIconButton=\"settings\"\n size=\"compact\"\n class=\"praxis-table-toolbar-action--configuration\"\n data-role=\"table-settings\"\n data-testid=\"table-settings-trigger\"\n (click)=\"openTableSettings()\"\n [attr.aria-label]=\"getTableSettingsLabel()\"\n [matTooltip]=\"getTableSettingsLabel()\"\n matTooltipPosition=\"below\"\n >\n >\n </button>\n }\n </div>\n</div>\n}\n<!-- Paginador superior -->\n@if (shouldRenderDataSurface() && !schemaError && !dataError &&\ngetPaginationEnabled() && (config.behavior?.pagination?.position === 'top' ||\nconfig.behavior?.pagination?.position === 'both')) {\n<mat-paginator\n [length]=\"getPaginationLength()\"\n [pageIndex]=\"pageIndex\"\n [pageSize]=\"pageSize\"\n [pageSizeOptions]=\"getPaginationPageSizeOptions()\"\n [selectConfig]=\"paginatorSelectConfig\"\n [showFirstLastButtons]=\"getPaginationShowFirstLast()\"\n [disabled]=\"isTableDataLoading()\"\n (page)=\"onPageChange($event)\"\n [class.compact]=\"config.behavior?.pagination?.style === 'compact'\"\n>\n</mat-paginator>\n} @if (shouldShowRefreshingState()) {\n<div\n class=\"ptable-refresh-state\"\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n>\n @if (getLoadingIndicatorType() === 'progress') {\n <span class=\"ptable-refresh-state__progress\" aria-hidden=\"true\"></span>\n } @else if (getLoadingIndicatorType() === 'skeleton') {\n <span class=\"ptable-refresh-state__skeleton\" aria-hidden=\"true\"></span>\n } @else {\n <span class=\"ptable-refresh-state__spinner\" aria-hidden=\"true\"></span>\n }\n <span class=\"ptable-refresh-state__message\">{{ getLoadingSurfaceMessage() }}</span>\n @if (canCancelLoad()) {\n <button mat-button type=\"button\" (click)=\"cancelLoad()\">\n {{ getCancelLoadLabel() }}\n </button>\n }\n</div>\n}\n<div\n class=\"ptable-data-surface\"\n [class.ptable-data-surface--loading-overlay]=\"\n shouldShowLoadingSurface() && getLoadingIndicatorPosition() === 'overlay'\n \"\n>\n<div\n #scrollViewport\n class=\"px-scroll-viewport\"\n cdkScrollable\n (scroll)=\"onHorizontalViewportScroll($event)\"\n (keydown)=\"onHorizontalViewportKeydown($event)\"\n [attr.aria-busy]=\"isTableDataLoading() ? 'true' : 'false'\"\n [attr.role]=\"horizontalScroll === 'auto' ? 'region' : null\"\n [attr.aria-label]=\"horizontalScroll === 'auto' ? getScrollViewportAriaLabel() : null\"\n [attr.tabindex]=\"horizontalScroll === 'auto' ? 0 : null\"\n [class.px-scroll-viewport--refreshing]=\"shouldShowRefreshingState()\"\n [class.px-scroll-viewport--loading-replaced]=\"shouldReplaceDataWithLoading()\"\n [class.scroll-auto]=\"horizontalScroll === 'auto'\"\n [class.scroll-wrap]=\"horizontalScroll === 'wrap'\"\n [class.scroll-none]=\"horizontalScroll === 'none'\"\n [class.px-scroll-viewport--overflowing]=\"hasHorizontalOverflow\"\n [class.px-scroll-viewport--can-scroll-left]=\"canScrollHorizontallyLeft\"\n [class.px-scroll-viewport--can-scroll-right]=\"canScrollHorizontallyRight\"\n [class.pfx-mobile-card-mode]=\"isMobileCardModeActive()\"\n [class.table-rounded-bottom]=\"!hasBottomTableStack()\"\n>\n @if (shouldRenderDataSurface() && !schemaError && !dataError) {\n <div\n class=\"praxis-visually-hidden-status\"\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >\n {{ columnReorderStatusMessage }} {{ columnResizeStatusMessage }}\n </div>\n @if (selectionStatusMessage) {\n <div\n class=\"praxis-visually-hidden-status\"\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >\n {{ selectionStatusMessage }}\n </div>\n }\n @if (exportStatusMessage) {\n <div\n class=\"praxis-visually-hidden-status\"\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >\n {{ exportStatusMessage }}\n </div>\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 [attr.aria-label]=\"getTableAriaLabel()\"\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() || isTableDataLoading()\"\n [class.praxis-table-data--refreshing]=\"shouldShowRefreshingState()\"\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 [class.pfx-mobile-card-mode]=\"isMobileCardModeActive()\"\n [style.width]=\"getColumnResizeTableWidthStyle()\"\n >\n @if (isSelectionColumnEnabled()) {\n <ng-container matColumnDef=\"_select\">\n <th mat-header-cell *matHeaderCellDef>\n @if (canSelectAll()) {\n <mat-checkbox\n (change)=\"masterToggle()\"\n [checked]=\"isAllSelected()\"\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\"\n [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(); onSingleSelectionChanged(row)\"\n (change)=\"onSingleSelectionChanged(row)\"\n (keydown.space)=\"onSingleSelectionSpace($event, row)\"\n [checked]=\"selection.isSelected(row)\"\n [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 [aria-label]=\"getRowSelectionAriaLabel(row, i)\"\n ></mat-checkbox>\n }\n </td>\n </ng-container>\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\"\n >Expandir detalhes da linha</span\n >\n </th>\n <td\n mat-cell\n *matCellDef=\"let row; let i = index\"\n class=\"pfx-expansion-col-cell\"\n >\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 [attr.title]=\"!isRowExpandable(row, i) ? getRowExpansionToggleAriaLabel(row, i) : null\"\n (click)=\"onExpansionToggleFromIcon(row, i, $event)\"\n (keydown)=\"onExpansionToggleKeydown($event, row, i)\"\n ></button>\n </td>\n </ng-container>\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 [class.pfx-sticky-boundary-start]=\"isStickyStartBoundary(column)\"\n [class.pfx-sticky-boundary-end]=\"isStickyEndBoundary(column)\"\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 (lostpointercapture)=\"onColumnResizeLostPointerCapture($event)\"\n (dblclick)=\"onColumnResizeHandleDoubleClick($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 [class.pfx-sticky-boundary-start]=\"isStickyStartBoundary(column)\"\n [class.pfx-sticky-boundary-end]=\"isStickyEndBoundary(column)\"\n [matTooltip]=\"getCellTooltip(element, column) || ''\"\n [matTooltipPosition]=\"getCellTooltipPosition(element, column)\"\n [matTooltipDisabled]=\"!getCellTooltip(element, column)\"\n [attr.title]=\"getCellTooltip(element, column) || null\"\n [attr.data-praxis-card-label]=\"column.header || column.field\"\n [style.order]=\"isMobileCardModeActive() ? getMobileCardColumnOrder(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 [praxisQuickView]=\"getEffectiveQuickViewBinding(element, column)\"\n [praxisQuickViewRecord]=\"element\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\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') { @if (shouldRenderBadge(element, column)) {\n <span\n class=\"pfx-badge\"\n [ngClass]=\"getBadgeClasses(element, column)\"\n [praxisQuickView]=\"getEffectiveQuickViewBinding(element, column)\"\n [praxisQuickViewRecord]=\"element\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n >\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 <!-- Link renderer -->\n @case ('link') {\n @let linkQuickView = getEffectiveQuickViewBinding(element, column);\n @let linkHref = getLinkHref(element, column);\n @if (linkQuickView && !linkHref) {\n <button\n type=\"button\"\n class=\"pfx-link pfx-quick-view-trigger--button\"\n [praxisQuickView]=\"linkQuickView\"\n [praxisQuickViewRecord]=\"element\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"hover-and-click\"\n [attr.aria-label]=\"getLinkText(element, column) || column.header\"\n (click)=\"$event.stopPropagation()\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-link__content\"\n [nodes]=\"getLinkRichContentNodes(element, column)\"\n ></praxis-rich-content>\n </button>\n } @else if (linkQuickView && linkHref) {\n <span class=\"pfx-link-with-quick-view\">\n <a\n class=\"pfx-link\"\n [attr.href]=\"linkHref\"\n [attr.target]=\"getLinkTarget(element, column) || null\"\n [attr.rel]=\"getLinkRel(element, column) || null\"\n [praxisQuickView]=\"linkQuickView\"\n [praxisQuickViewRecord]=\"element\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"hover-only\"\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\n ></a>\n <button\n type=\"button\"\n class=\"pfx-quick-view-adjacent-btn\"\n [praxisQuickView]=\"linkQuickView\"\n [praxisQuickViewRecord]=\"element\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"explicit-button\"\n [attr.aria-label]=\"getQuickViewTriggerAriaLabel(getLinkText(element, column), column)\"\n (click)=\"$event.stopPropagation()\"\n >\n <mat-icon class=\"pfx-quick-view-adjacent-btn__icon\" aria-hidden=\"true\">info_outline</mat-icon>\n </button>\n </span>\n } @else {\n <a\n class=\"pfx-link\"\n [attr.href]=\"linkHref || 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\n ></a>\n }\n }\n <!-- Button renderer -->\n @case ('button') { @switch (getButtonVariant(element, column)) { @case\n ('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 } @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 } @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 <!-- Chip renderer -->\n @case ('chip') { @if (shouldRenderChip(element, column)) {\n <span\n class=\"pfx-chip\"\n [ngClass]=\"getChipClasses(element, column)\"\n [praxisQuickView]=\"getEffectiveQuickViewBinding(element, column)\"\n [praxisQuickViewRecord]=\"element\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n >\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 <!-- 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\n class=\"pfx-micro-viz-cell\"\n [innerHTML]=\"getMicroVisualizationHtml(element, column)\"\n ></span>\n }\n <!-- Avatar renderer -->\n @case ('avatar') {\n <span\n 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 [praxisQuickView]=\"getEffectiveQuickViewBinding(element, column)\"\n [praxisQuickViewRecord]=\"element\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n >\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\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(element, 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(element, column); track it.id) {\n <button\n mat-menu-item\n (click)=\"onMenuItemClick(it, element, $event)\"\n [disabled]=\"!it.__visible\"\n >\n <praxis-rich-content\n layout=\"inline\"\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 >\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\n class=\"pfx-cell-compose\"\n [ngClass]=\"getComposeClasses(element, column)\"\n [ngStyle]=\"getComposeGapStyle(element, column)\"\n >\n @for (it of getComposeItems(element, column); track\n trackComposeItem($index, it)) { @switch\n (getItemEffectiveType(element, column, it)) {\n <!-- Reuse helpers by projecting item as faux column -->\n @case ('icon') {\n @let composeIconCol = asItemColumn(column, it);\n <span\n class=\"pfx-icon-renderer\"\n [style.color]=\"getIconColor(element, composeIconCol) || null\"\n [ngStyle]=\"getIconStyle(element, composeIconCol)\"\n [attr.aria-label]=\"getIconAriaLabel(element, composeIconCol) || null\"\n [praxisQuickView]=\"getEffectiveQuickViewBinding(element, composeIconCol)\"\n [praxisQuickViewRecord]=\"element\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n ><praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-icon-renderer__content\"\n [nodes]=\"getIconRichContentNodes(element, composeIconCol)\"\n ></praxis-rich-content\n ></span>\n } @case ('image') {\n <span class=\"pfx-cell-image\"\n ><praxis-rich-content\n rootClassName=\"pfx-cell-image__content\"\n [nodes]=\"getImageRichContentNodes(element, asItemColumn(column, it))\"\n ></praxis-rich-content\n ></span>\n } @case ('badge') {\n @let composeBadgeCol = asItemColumn(column, it);\n @if (shouldRenderBadge(element, composeBadgeCol)) {\n <span\n class=\"pfx-badge\"\n [ngClass]=\"getBadgeClasses(element, composeBadgeCol)\"\n [praxisQuickView]=\"getEffectiveQuickViewBinding(element, composeBadgeCol)\"\n [praxisQuickViewRecord]=\"element\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n ><praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-badge__content\"\n [nodes]=\"getBadgeRichContentNodes(element, composeBadgeCol)\"\n ></praxis-rich-content\n ></span>\n } } @case ('link') {\n @let composeLinkCol = asItemColumn(column, it);\n @let composeLinkQuickView = getEffectiveQuickViewBinding(element, composeLinkCol);\n @let composeLinkHref = getLinkHref(element, composeLinkCol);\n @if (composeLinkQuickView && !composeLinkHref) {\n <button\n type=\"button\"\n class=\"pfx-link pfx-quick-view-trigger--button\"\n [praxisQuickView]=\"composeLinkQuickView\"\n [praxisQuickViewRecord]=\"element\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"hover-and-click\"\n [attr.aria-label]=\"getLinkText(element, composeLinkCol) || column.header\"\n (click)=\"$event.stopPropagation()\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-link__content\"\n [nodes]=\"getLinkRichContentNodes(element, composeLinkCol)\"\n ></praxis-rich-content>\n </button>\n } @else if (composeLinkQuickView && composeLinkHref) {\n <span class=\"pfx-link-with-quick-view\">\n <a\n class=\"pfx-link\"\n [attr.href]=\"composeLinkHref\"\n [attr.target]=\"getLinkTarget(element, composeLinkCol) || null\"\n [attr.rel]=\"getLinkRel(element, composeLinkCol) || null\"\n [praxisQuickView]=\"composeLinkQuickView\"\n [praxisQuickViewRecord]=\"element\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"hover-only\"\n (click)=\"$event.stopPropagation()\"\n ><praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-link__content\"\n [nodes]=\"getLinkRichContentNodes(element, composeLinkCol)\"\n ></praxis-rich-content\n ></a>\n <button\n type=\"button\"\n class=\"pfx-quick-view-adjacent-btn\"\n [praxisQuickView]=\"composeLinkQuickView\"\n [praxisQuickViewRecord]=\"element\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"explicit-button\"\n [attr.aria-label]=\"getQuickViewTriggerAriaLabel(getLinkText(element, composeLinkCol), composeLinkCol)\"\n (click)=\"$event.stopPropagation()\"\n >\n <mat-icon class=\"pfx-quick-view-adjacent-btn__icon\" aria-hidden=\"true\">info_outline</mat-icon>\n </button>\n </span>\n } @else {\n <a\n class=\"pfx-link\"\n [attr.href]=\"composeLinkHref || null\"\n [attr.target]=\"getLinkTarget(element, composeLinkCol) || null\"\n [attr.rel]=\"getLinkRel(element, composeLinkCol) || null\"\n (click)=\"$event.stopPropagation()\"\n ><praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-link__content\"\n [nodes]=\"getLinkRichContentNodes(element, composeLinkCol)\"\n ></praxis-rich-content\n ></a>\n }\n } @case ('button') { @switch (getButtonVariant(element,\n asItemColumn(column, it))) { @case ('outlined') {\n <button\n mat-stroked-button\n [color]=\"getButtonColor(element, asItemColumn(column, it)) || null\"\n [disabled]=\"isButtonDisabled(element, asItemColumn(column, it))\"\n [attr.aria-label]=\"getButtonAriaLabel(element, asItemColumn(column, it)) || getButtonLabel(element, asItemColumn(column, it))\"\n (click)=\"onButtonClick(element, asItemColumn(column, it), $event)\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-button-renderer__content\"\n [nodes]=\"getButtonRichContentNodes(element, asItemColumn(column, it))\"\n ></praxis-rich-content>\n </button>\n } @case ('text') {\n <button\n mat-button\n [color]=\"getButtonColor(element, asItemColumn(column, it)) || null\"\n [disabled]=\"isButtonDisabled(element, asItemColumn(column, it))\"\n [attr.aria-label]=\"getButtonAriaLabel(element, asItemColumn(column, it)) || getButtonLabel(element, asItemColumn(column, it))\"\n (click)=\"onButtonClick(element, asItemColumn(column, it), $event)\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-button-renderer__content\"\n [nodes]=\"getButtonRichContentNodes(element, asItemColumn(column, it))\"\n ></praxis-rich-content>\n </button>\n } @default {\n <button\n mat-flat-button\n [color]=\"getButtonColor(element, asItemColumn(column, it)) || null\"\n [disabled]=\"isButtonDisabled(element, asItemColumn(column, it))\"\n [attr.aria-label]=\"getButtonAriaLabel(element, asItemColumn(column, it)) || getButtonLabel(element, asItemColumn(column, it))\"\n (click)=\"onButtonClick(element, asItemColumn(column, it), $event)\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-button-renderer__content\"\n [nodes]=\"getButtonRichContentNodes(element, asItemColumn(column, it))\"\n ></praxis-rich-content>\n </button>\n } } } @case ('chip') {\n @let composeChipCol = asItemColumn(column, it);\n @if (shouldRenderChip(element, composeChipCol)) {\n <span\n class=\"pfx-chip\"\n [ngClass]=\"getChipClasses(element, composeChipCol)\"\n [praxisQuickView]=\"getEffectiveQuickViewBinding(element, composeChipCol)\"\n [praxisQuickViewRecord]=\"element\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n ><praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-chip__content\"\n [nodes]=\"getChipRichContentNodes(element, composeChipCol)\"\n ></praxis-rich-content\n ></span>\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 } @case ('microVisualization') {\n <span\n class=\"pfx-micro-viz-cell\"\n [innerHTML]=\"getMicroVisualizationHtml(element, asItemColumn(column, it))\"\n ></span>\n } @case ('avatar') {\n @let composeAvatarCol = asItemColumn(column, it);\n <span\n class=\"pfx-avatar-renderer\"\n [ngStyle]=\"getAvatarStyle(element, composeAvatarCol)\"\n [class.shape-rounded]=\"getAvatarShape(element, composeAvatarCol) === 'rounded'\"\n [class.shape-circle]=\"getAvatarShape(element, composeAvatarCol) === 'circle'\"\n [praxisQuickView]=\"getEffectiveQuickViewBinding(element, composeAvatarCol)\"\n [praxisQuickViewRecord]=\"element\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n ><praxis-rich-content\n rootClassName=\"pfx-avatar-renderer__content\"\n [nodes]=\"getAvatarRichContentNodes(element, composeAvatarCol)\"\n ></praxis-rich-content\n ></span>\n } @case ('toggle') {\n <mat-slide-toggle\n [checked]=\"getToggleState(element, asItemColumn(column, it))\"\n [disabled]=\"isToggleDisabled(element, asItemColumn(column, it))\"\n [aria-label]=\"getToggleAriaLabel(element, asItemColumn(column, it)) || 'Alternar'\"\n (change)=\"onToggleChange(element, asItemColumn(column, it), $event)\"\n (click)=\"$event.stopPropagation()\"\n ></mat-slide-toggle>\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(element, asItemColumn(column, it)) || '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 (mi of getMenuItems(element, asItemColumn(column, it)); track\n mi.id) {\n <button\n mat-menu-item\n (click)=\"onMenuItemClick(mi, element, $event)\"\n [disabled]=\"!mi.__visible\"\n >\n <praxis-rich-content\n layout=\"inline\"\n rootClassName=\"pfx-menu-item__content\"\n [nodes]=\"getMenuItemRichContentNodes(mi)\"\n ></praxis-rich-content>\n </button>\n }\n </mat-menu>\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 >\n </praxis-table-rating>\n } @case ('html') {\n <span\n [innerHTML]=\"getSafeHtml(element, asItemColumn(column, it))\"\n ></span>\n }\n <!-- Value item: render base cell text alongside visuals -->\n @case ('value') {\n @let composeValue = getComposeItemValue(element, column, it);\n @if (composeValue !== null && composeValue !== undefined && composeValue !== '') {\n @let composeValueQuickView = getComposeValueQuickViewBinding(element, column, it);\n @if (composeValueQuickView) {\n <button\n type=\"button\"\n class=\"pfx-cell-value pfx-quick-view-trigger--button\"\n [ngClass]=\"getComposeValueClasses(it)\"\n [praxisQuickView]=\"composeValueQuickView\"\n [praxisQuickViewRecord]=\"element\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"hover-and-click\"\n (click)=\"$event.stopPropagation()\"\n >{{ composeValue }}</button>\n } @else {\n <span class=\"pfx-cell-value\" [ngClass]=\"getComposeValueClasses(it)\"\n >{{ composeValue }}</span\n >\n }\n }\n } } }\n </span>\n }\n <!-- Default text rendering -->\n @default {\n @let defaultCellValue = getCellValue(element, column);\n @let defaultCellQuickView = getEffectiveQuickViewBinding(element, column);\n @if (defaultCellQuickView && defaultCellValue !== null && defaultCellValue !== undefined && defaultCellValue !== '') {\n <button\n type=\"button\"\n class=\"pfx-cell-quick-view-btn pfx-quick-view-trigger--button\"\n [praxisQuickView]=\"defaultCellQuickView\"\n [praxisQuickViewRecord]=\"element\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"hover-and-click\"\n (click)=\"$event.stopPropagation()\"\n >{{ defaultCellValue }}</button>\n } @else {\n {{ defaultCellValue }}\n }\n } }\n </div>\n </td>\n </ng-container>\n } @if (config.actions?.row?.enabled) {\n <ng-container\n matColumnDef=\"_actions\"\n [sticky]=\"config.actions?.row?.sticky === true || config.actions?.row?.sticky === 'start'\"\n [stickyEnd]=\"config.actions?.row?.sticky === 'end'\"\n >\n <th\n mat-header-cell\n *matHeaderCellDef\n #actionsHeaderCell\n [style.width]=\"getRowActionsWidthStyle()\"\n class=\"praxis-actions-header\"\n [class.align-start]=\"getActionsHeaderAlign() === 'start'\"\n [class.align-center]=\"getActionsHeaderAlign() === 'center'\"\n [class.align-end]=\"getActionsHeaderAlign() === 'end'\"\n [class.pfx-sticky-boundary-start]=\"isActionsStickyStartBoundary()\"\n [class.pfx-sticky-boundary-end]=\"isActionsStickyEndBoundary()\"\n >\n <div\n class=\"praxis-actions-header__content\"\n [matTooltip]=\"getActionsHeaderTooltip() || ''\"\n [matTooltipDisabled]=\"!getActionsHeaderTooltip()\"\n >\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 [class.pfx-sticky-boundary-start]=\"isActionsStickyStartBoundary()\"\n [class.pfx-sticky-boundary-end]=\"isActionsStickyEndBoundary()\"\n [style.width]=\"getRowActionsWidthStyle()\"\n [attr.data-praxis-card-label]=\"getActionsHeaderLabel()\"\n [style.order]=\"isMobileCardModeActive() ? getMobileCardActionsOrder() : null\"\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' ||\n !config.actions?.row?.display) { @for (a of getInlineRowActions(row);\n track trackAction($index, a)) {\n <span\n class=\"praxis-row-action-anchor\"\n [matTooltip]=\"getActionTooltip(a, row)\"\n [matTooltipDisabled]=\"!getActionTooltip(a, row)\"\n [attr.tabindex]=\"isActionDisabled(a, row) ? 0 : null\"\n [attr.role]=\"isActionDisabled(a, row) ? 'note' : null\"\n [attr.aria-label]=\"isActionDisabled(a, row) ? ((a.label || getActionId(a)) + ': ' + getActionTooltip(a, row)) : null\"\n [attr.title]=\"isActionDisabled(a, row) ? getActionTooltip(a, row) : null\"\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 [busy]=\"isRowActionBusy(a, row)\"\n [disabled]=\"isActionDisabled(a, row) || isRowActionBusy(a, row)\"\n [praxisQuickView]=\"getRowActionQuickViewBinding(a)\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"hover-only\"\n (click)=\"onRowAction(getActionId(a), row, $event, getRowActionRuntimeOptions(a, row))\"\n [attr.aria-label]=\"a.label || getActionId(a)\"\n [attr.aria-description]=\"getActionAriaDescription(a, row)\"\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 <!-- Inline actions: buttons mode (show label + icon) -->\n @if (config.actions?.row?.display === 'buttons') { @for (a of\n getInlineRowActions(row); track trackAction($index, a)) {\n <span\n class=\"praxis-row-action-anchor\"\n [matTooltip]=\"getActionTooltip(a, row)\"\n [matTooltipDisabled]=\"!getActionTooltip(a, row)\"\n [attr.tabindex]=\"isActionDisabled(a, row) ? 0 : null\"\n [attr.role]=\"isActionDisabled(a, row) ? 'note' : null\"\n [attr.aria-label]=\"isActionDisabled(a, row) ? ((a.label || getActionId(a)) + ': ' + getActionTooltip(a, row)) : null\"\n [attr.title]=\"isActionDisabled(a, row) ? getActionTooltip(a, row) : null\"\n matTooltipPosition=\"above\"\n matTooltipClass=\"praxis-tooltip\"\n >\n <button\n mat-flat-button\n class=\"praxis-row-btn\"\n [disabled]=\"isActionDisabled(a, row) || isRowActionBusy(a, row)\"\n [attr.aria-busy]=\"isRowActionBusy(a, row) ? 'true' : null\"\n [praxisQuickView]=\"getRowActionQuickViewBinding(a)\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"hover-only\"\n (click)=\"onRowAction(getActionId(a), row, $event, getRowActionRuntimeOptions(a, row))\"\n [attr.aria-label]=\"a.label || getActionId(a)\"\n [attr.aria-description]=\"getActionAriaDescription(a, row)\"\n [color]=\"a.color || null\"\n >\n <praxis-rich-content\n layout=\"inline\"\n rootClassName=\"praxis-row-action__content\"\n [nodes]=\"getRowActionRichContentNodes(a, isRowActionBusy(a, row))\"\n ></praxis-rich-content>\n </button>\n </span>\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 (mouseenter)=\"onRowOverflowMenuTriggerHover(row)\"\n (focus)=\"onRowOverflowMenuTriggerHover(row)\"\n (click)=\"setActiveRowOverflowMenuTrigger(rowMoreMenuTrigger, $event.currentTarget)\"\n (menuOpened)=\"setActiveRowOverflowMenuTrigger(rowMoreMenuTrigger); onRowOverflowMenuOpened(row)\"\n (menuClosed)=\"onRowOverflowMenuClosed(rowMoreMenuTrigger)\"\n [attr.data-praxis-focus-key]=\"getRowActionFocusOriginKey(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\" panelClass=\"praxis-table-row-menu\">\n @if (hasRowOverflowMenuLoadingState(row) && getOverflowRowActions(row).length === 0) {\n <button mat-menu-item class=\"praxis-row-overflow-menu__item\" disabled>\n <mat-icon>hourglass_empty</mat-icon>\n <praxis-rich-content\n layout=\"inline\"\n rootClassName=\"praxis-row-overflow-menu__label\"\n [nodes]=\"getTableChromeTextRichContentNodes(getRowOverflowMenuLoadingLabel(), 'praxis-row-overflow-menu__label-text')\"\n ></praxis-rich-content>\n </button>\n } @for (a of getOverflowRowActions(row); track trackAction($index,\n a)) {\n <button\n mat-menu-item\n class=\"praxis-row-overflow-menu__item\"\n (click)=\"onOverflowRowAction(getActionId(a), row, $event, getRowActionRuntimeOptions(a, row))\"\n [disabled]=\"isActionDisabled(a, row) || isRowActionBusy(a, row)\"\n [attr.aria-busy]=\"isRowActionBusy(a, row) ? 'true' : null\"\n [attr.aria-label]=\"a.label || getActionId(a)\"\n [attr.aria-description]=\"getActionAriaDescription(a, row)\"\n [attr.title]=\"getActionTooltip(a, row)\"\n [matTooltip]=\"getActionTooltip(a, row)\"\n [matTooltipDisabled]=\"!getActionTooltip(a, row)\"\n matTooltipPosition=\"left\"\n >\n <mat-icon\n [color]=\"a.color || null\"\n [praxisIcon]=\"a.icon\"\n ></mat-icon>\n <praxis-rich-content\n layout=\"inline\"\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 } @if (hasRowOverflowMenuEmptyState(row)) {\n <button mat-menu-item disabled>\n <mat-icon>info</mat-icon>\n <praxis-rich-content\n layout=\"inline\"\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 mat-header-row *matHeaderRowDef=\"displayedColumns\"></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.data-keyboard-row-identity]=\"getKeyboardRowIdentity(row, i)\"\n [attr.tabindex]=\"getRowTabIndex(row, i)\"\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 (focus)=\"onRowFocused(row, i)\"\n (keydown)=\"onRowKeydown($event, 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); @if\n (detailState.status === 'loading') {\n <div\n class=\"pfx-expansion-detail-message\"\n role=\"status\"\n aria-live=\"polite\"\n >\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 { @if (getExpansionDetailLayout(detailState.schema) ===\n 'tabs') { @let detailTabs =\n getExpansionDetailTabs(detailState.schema); @if (detailTabs.length) {\n <div\n class=\"pfx-expansion-detail-tabs\"\n role=\"tablist\"\n aria-label=\"Se\u00C3\u00A7\u00C3\u00B5es do detail\"\n >\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) { @if\n (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\n 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 { @for (childNode of getExpansionDetailNodeChildren(tab);\n track $index) {\n <ng-container\n *ngTemplateOutlet=\"\n expansionDetailNodeTemplate;\n context: { $implicit: childNode, row: row, index: i }\n \"\n ></ng-container>\n } }\n </div>\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 } } @else {\n <div class=\"pfx-expansion-detail-stack\">\n @for (node of getExpansionDetailItems(detailState.schema); track\n $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 <ng-template\n #expansionDetailNodeTemplate\n let-node\n let-row=\"row\"\n let-index=\"index\"\n >\n @if (!isExpansionDetailNodeVisible(node, row, index)) {} @else if (getExpansionDetailRichContentNodes(node, row, index); as\n richNodes) {\n <praxis-rich-content\n class=\"pfx-expansion-node-host\"\n [nodes]=\"richNodes\"\n [context]=\"getExpansionDetailRichContentContext(row, index, node)\"\n ></praxis-rich-content>\n } @else { @switch (getExpansionDetailNodeType(node)) { @case\n ('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); @let\n listEntries = getExpansionDetailListEntries(row, node); @if\n (listItems.length) {\n <ul>\n @for (entry of listEntries; track $index) {\n <li>\n @if (getExpansionDetailListItemRichContentNodes(entry); as\n 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 { {{ formatExpansionDetailListEntry(entry) }} }\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 } @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,\n node); @if (richListEntries.length) {\n <div class=\"pfx-expansion-node-rich-list__items\">\n @for (entry of richListEntries; track $index) {\n <article\n [class]=\"getExpansionDetailRichListItemClassName(node)\"\n >\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,\n row, index, entry, $index); @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 } @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\n $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 } @case ('cardGrid') {\n <section class=\"pfx-expansion-node pfx-expansion-node-card-grid\">\n @if (getExpansionDetailCardGridHeaderNodes(node); as\n cardGridHeaderNodes) { @if (cardGridHeaderNodes.length) {\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-card-grid__header\"\n [nodes]=\"cardGridHeaderNodes\"\n [context]=\"getExpansionDetailRichContentContext(row, index, node)\"\n ></praxis-rich-content>\n } } @let gridCards = getExpansionDetailCardGridCards(node); @if\n (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, node)\"\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, node)\"\n ></praxis-rich-content>\n }\n </section>\n } @case ('richContent') {\n <div\n class=\"pfx-expansion-node-rich-content\"\n (click)=\"$event.stopPropagation()\"\n >\n <praxis-rich-content\n [document]=\"getExpansionDetailRichContentDocument(node)\"\n [layout]=\"getExpansionDetailRichContentLayout(node)\"\n [rootClassName]=\"node?.rootClassName || 'pfx-expansion-node-rich-content__document'\"\n [context]=\"getExpansionDetailRichContentContext(row, index, node)\"\n [hostCapabilities]=\"getExpansionDetailRichContentHostCapabilities(row)\"\n ></praxis-rich-content>\n </div>\n } @case ('richText') {\n <div\n class=\"pfx-expansion-node pfx-expansion-node-richtext\"\n [innerHTML]=\"getExpansionDetailRichText(node)\"\n ></div>\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\n 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 } @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\n 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 } @case ('chartRef') { @if\n (getExpansionDetailInlineRendererView(node, row, index); as\n inlineRenderer) {\n <section\n class=\"pfx-expansion-node pfx-expansion-node-embed pfx-expansion-node-embed--inline pfx-expansion-node-embed--chart\"\n >\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\n 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\n 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 } } @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\n 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 } @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 {\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\">\n{{ 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 } @if (getExpansionDetailEmbedAction(node, row, index); as\n 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 } @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\n 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 } @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,\n row, index); @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 } @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(bottomDetailText('tabOutside'), 'pfx-expansion-node-placeholder__text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n </div>\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 </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 </table>\n }\n\n <!-- Virtual rows path (header preserved above) -->\n @if (shouldRenderDataSurface() && !schemaError && !dataError &&\n 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 [attr.aria-label]=\"getTableAriaLabel()\"\n [ngClass]=\"getTableElevationClassName()\"\n [class.table-stack-top]=\"hasTopToolbarStack()\"\n [class.table-rounded-bottom]=\"!hasBottomTableStack()\"\n [style.width]=\"getVirtualTableWidthStyle()\"\n >\n <tbody>\n <tr\n 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.data-keyboard-row-identity]=\"getKeyboardRowIdentity(row, i)\"\n [attr.tabindex]=\"getRowTabIndex(row, i)\"\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 (focus)=\"onRowFocused(row, i)\"\n (keydown)=\"onRowKeydown($event, row, i)\"\n >\n <!-- Selection column -->\n @if (isSelectionColumnEnabled()) {\n <td class=\"mat-mdc-cell\">\n <mat-checkbox\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleRow(row)\"\n [checked]=\"selection.isSelected(row)\"\n [aria-label]=\"getRowSelectionAriaLabel(row, i)\"\n >\n </mat-checkbox>\n </td>\n }\n <!-- Data columns -->\n @for (column of visibleColumns; track column.field) {\n <td\n 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 >\n <div\n class=\"pfx-cell-content\"\n [ngClass]=\"getCellContentClasses(row, column)\"\n [ngStyle]=\"getCellContentNgStyle(row, column)\"\n >\n @switch (getEffectiveRendererType(row, column)) { @case ('icon') {\n <span\n 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 [praxisQuickView]=\"getEffectiveQuickViewBinding(row, column)\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n >\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 } @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 } @case ('badge') { @if (shouldRenderBadge(row, column)) {\n <span\n class=\"pfx-badge\"\n [ngClass]=\"getBadgeClasses(row, column)\"\n [praxisQuickView]=\"getEffectiveQuickViewBinding(row, column)\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-badge__content\"\n [nodes]=\"getBadgeRichContentNodes(row, column)\"\n ></praxis-rich-content>\n </span>\n } } @case ('chip') { @if (shouldRenderChip(row, column)) {\n <span\n class=\"pfx-chip\"\n [ngClass]=\"getChipClasses(row, column)\"\n [praxisQuickView]=\"getEffectiveQuickViewBinding(row, column)\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-chip__content\"\n [nodes]=\"getChipRichContentNodes(row, column)\"\n ></praxis-rich-content>\n </span>\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 } @case ('microVisualization') {\n <span\n class=\"pfx-micro-viz-cell\"\n [innerHTML]=\"getMicroVisualizationHtml(row, column)\"\n ></span>\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 } @case ('link') {\n @let vLinkQuickView = getEffectiveQuickViewBinding(row, column);\n @let vLinkHref = getLinkHref(row, column);\n @if (vLinkQuickView && !vLinkHref) {\n <button\n type=\"button\"\n class=\"pfx-link pfx-quick-view-trigger--button\"\n [praxisQuickView]=\"vLinkQuickView\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"hover-and-click\"\n [attr.aria-label]=\"getLinkText(row, column) || column.header\"\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 </button>\n } @else if (vLinkQuickView && vLinkHref) {\n <span class=\"pfx-link-with-quick-view\">\n <a\n class=\"pfx-link\"\n [attr.href]=\"vLinkHref\"\n [attr.target]=\"getLinkTarget(row, column) || null\"\n [attr.rel]=\"getLinkRel(row, column) || null\"\n [praxisQuickView]=\"vLinkQuickView\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"hover-only\"\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 <button\n type=\"button\"\n class=\"pfx-quick-view-adjacent-btn\"\n [praxisQuickView]=\"vLinkQuickView\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"explicit-button\"\n [attr.aria-label]=\"getQuickViewTriggerAriaLabel(getLinkText(row, column), column)\"\n (click)=\"$event.stopPropagation()\"\n >\n <mat-icon class=\"pfx-quick-view-adjacent-btn__icon\" aria-hidden=\"true\">info_outline</mat-icon>\n </button>\n </span>\n } @else {\n <a\n class=\"pfx-link\"\n [attr.href]=\"vLinkHref || 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') { @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 } @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 } @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 } } } @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 layout=\"inline\"\n rootClassName=\"pfx-menu-item__content\"\n [nodes]=\"getMenuItemRichContentNodes(it)\"\n ></praxis-rich-content>\n </button>\n }\n </mat-menu>\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 } @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 } @case ('html') {\n <span [innerHTML]=\"getSafeHtml(row, column)\"></span>\n } @case ('compose') {\n <span\n class=\"pfx-cell-compose\"\n [ngClass]=\"getComposeClasses(row, column)\"\n [ngStyle]=\"getComposeGapStyle(row, column)\"\n >\n @for (it of getComposeItems(row, column); track\n trackComposeItem($index, it)) { @switch\n (getItemEffectiveType(row, column, it)) { @case ('icon') {\n @let vComposeIconCol = asItemColumn(column, it);\n <span\n class=\"pfx-icon-renderer\"\n [style.color]=\"getIconColor(row, vComposeIconCol) || null\"\n [ngStyle]=\"getIconStyle(row, vComposeIconCol)\"\n [attr.aria-label]=\"getIconAriaLabel(row, vComposeIconCol) || null\"\n [praxisQuickView]=\"getEffectiveQuickViewBinding(row, vComposeIconCol)\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n ><praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-icon-renderer__content\"\n [nodes]=\"getIconRichContentNodes(row, vComposeIconCol)\"\n ></praxis-rich-content\n ></span>\n } @case ('image') {\n <span class=\"pfx-cell-image\"\n ><praxis-rich-content\n rootClassName=\"pfx-cell-image__content\"\n [nodes]=\"getImageRichContentNodes(row, asItemColumn(column, it))\"\n ></praxis-rich-content\n ></span>\n } @case ('badge') {\n @let vComposeBadgeCol = asItemColumn(column, it);\n @if (shouldRenderBadge(row, vComposeBadgeCol)) {\n <span\n class=\"pfx-badge\"\n [ngClass]=\"getBadgeClasses(row, vComposeBadgeCol)\"\n [praxisQuickView]=\"getEffectiveQuickViewBinding(row, vComposeBadgeCol)\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n ><praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-badge__content\"\n [nodes]=\"getBadgeRichContentNodes(row, vComposeBadgeCol)\"\n ></praxis-rich-content\n ></span>\n } } @case ('link') {\n @let vComposeLinkCol = asItemColumn(column, it);\n @let vComposeLinkQuickView = getEffectiveQuickViewBinding(row, vComposeLinkCol);\n @let vComposeLinkHref = getLinkHref(row, vComposeLinkCol);\n @if (vComposeLinkQuickView && !vComposeLinkHref) {\n <button\n type=\"button\"\n class=\"pfx-link pfx-quick-view-trigger--button\"\n [praxisQuickView]=\"vComposeLinkQuickView\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"hover-and-click\"\n [attr.aria-label]=\"getLinkText(row, vComposeLinkCol) || column.header\"\n (click)=\"$event.stopPropagation()\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-link__content\"\n [nodes]=\"getLinkRichContentNodes(row, vComposeLinkCol)\"\n ></praxis-rich-content>\n </button>\n } @else if (vComposeLinkQuickView && vComposeLinkHref) {\n <span class=\"pfx-link-with-quick-view\">\n <a\n class=\"pfx-link\"\n [attr.href]=\"vComposeLinkHref\"\n [attr.target]=\"getLinkTarget(row, vComposeLinkCol) || null\"\n [attr.rel]=\"getLinkRel(row, vComposeLinkCol) || null\"\n [praxisQuickView]=\"vComposeLinkQuickView\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"hover-only\"\n (click)=\"$event.stopPropagation()\"\n ><praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-link__content\"\n [nodes]=\"getLinkRichContentNodes(row, vComposeLinkCol)\"\n ></praxis-rich-content\n ></a>\n <button\n type=\"button\"\n class=\"pfx-quick-view-adjacent-btn\"\n [praxisQuickView]=\"vComposeLinkQuickView\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"explicit-button\"\n [attr.aria-label]=\"getQuickViewTriggerAriaLabel(getLinkText(row, vComposeLinkCol), vComposeLinkCol)\"\n (click)=\"$event.stopPropagation()\"\n >\n <mat-icon class=\"pfx-quick-view-adjacent-btn__icon\" aria-hidden=\"true\">info_outline</mat-icon>\n </button>\n </span>\n } @else {\n <a\n class=\"pfx-link\"\n [attr.href]=\"vComposeLinkHref || null\"\n [attr.target]=\"getLinkTarget(row, vComposeLinkCol) || null\"\n [attr.rel]=\"getLinkRel(row, vComposeLinkCol) || null\"\n (click)=\"$event.stopPropagation()\"\n ><praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-link__content\"\n [nodes]=\"getLinkRichContentNodes(row, vComposeLinkCol)\"\n ></praxis-rich-content\n ></a>\n }\n } @case ('button') { @switch (getButtonVariant(row,\n asItemColumn(column, it))) { @case ('outlined') {\n <button\n mat-stroked-button\n [color]=\"getButtonColor(row, asItemColumn(column, it)) || null\"\n [disabled]=\"isButtonDisabled(row, asItemColumn(column, it))\"\n [attr.aria-label]=\"getButtonAriaLabel(row, asItemColumn(column, it)) || getButtonLabel(row, asItemColumn(column, it))\"\n (click)=\"onButtonClick(row, asItemColumn(column, it), $event)\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-button-renderer__content\"\n [nodes]=\"getButtonRichContentNodes(row, asItemColumn(column, it))\"\n ></praxis-rich-content>\n </button>\n } @case ('text') {\n <button\n mat-button\n [color]=\"getButtonColor(row, asItemColumn(column, it)) || null\"\n [disabled]=\"isButtonDisabled(row, asItemColumn(column, it))\"\n [attr.aria-label]=\"getButtonAriaLabel(row, asItemColumn(column, it)) || getButtonLabel(row, asItemColumn(column, it))\"\n (click)=\"onButtonClick(row, asItemColumn(column, it), $event)\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-button-renderer__content\"\n [nodes]=\"getButtonRichContentNodes(row, asItemColumn(column, it))\"\n ></praxis-rich-content>\n </button>\n } @default {\n <button\n mat-flat-button\n [color]=\"getButtonColor(row, asItemColumn(column, it)) || null\"\n [disabled]=\"isButtonDisabled(row, asItemColumn(column, it))\"\n [attr.aria-label]=\"getButtonAriaLabel(row, asItemColumn(column, it)) || getButtonLabel(row, asItemColumn(column, it))\"\n (click)=\"onButtonClick(row, asItemColumn(column, it), $event)\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-button-renderer__content\"\n [nodes]=\"getButtonRichContentNodes(row, asItemColumn(column, it))\"\n ></praxis-rich-content>\n </button>\n } } } @case ('chip') {\n @let vComposeChipCol = asItemColumn(column, it);\n @if (shouldRenderChip(row, vComposeChipCol)) {\n <span\n class=\"pfx-chip\"\n [ngClass]=\"getChipClasses(row, vComposeChipCol)\"\n [praxisQuickView]=\"getEffectiveQuickViewBinding(row, vComposeChipCol)\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n ><praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-chip__content\"\n [nodes]=\"getChipRichContentNodes(row, vComposeChipCol)\"\n ></praxis-rich-content\n ></span>\n } } @case ('progress') {\n <div class=\"pfx-progress\">\n <praxis-rich-content\n rootClassName=\"pfx-progress__content\"\n [context]=\"getProgressRichContentContext(row, asItemColumn(column, it))\"\n [nodes]=\"getProgressRichContentNodes(row, asItemColumn(column, it))\"\n ></praxis-rich-content>\n </div>\n } @case ('microVisualization') {\n <span\n class=\"pfx-micro-viz-cell\"\n [innerHTML]=\"getMicroVisualizationHtml(row, asItemColumn(column, it))\"\n ></span>\n } @case ('avatar') {\n <span\n class=\"pfx-avatar-renderer\"\n [ngStyle]=\"getAvatarStyle(row, asItemColumn(column, it))\"\n [class.shape-rounded]=\"getAvatarShape(row, asItemColumn(column, it)) === 'rounded'\"\n [class.shape-circle]=\"getAvatarShape(row, asItemColumn(column, it)) === 'circle'\"\n ><praxis-rich-content\n rootClassName=\"pfx-avatar-renderer__content\"\n [nodes]=\"getAvatarRichContentNodes(row, asItemColumn(column, it))\"\n ></praxis-rich-content\n ></span>\n } @case ('toggle') {\n <mat-slide-toggle\n [checked]=\"getToggleState(row, asItemColumn(column, it))\"\n [disabled]=\"isToggleDisabled(row, asItemColumn(column, it))\"\n [aria-label]=\"getToggleAriaLabel(row, asItemColumn(column, it)) || 'Alternar'\"\n (change)=\"onToggleChange(row, asItemColumn(column, it), $event)\"\n (click)=\"$event.stopPropagation()\"\n ></mat-slide-toggle>\n } @case ('menu') {\n <button\n type=\"button\"\n praxisIconButton=\"more_vert\"\n presentation=\"projected\"\n size=\"compact\"\n [matMenuTriggerFor]=\"composeMenuRef\"\n (click)=\"$event.stopPropagation()\"\n [attr.aria-label]=\"getMenuAriaLabel(row, asItemColumn(column, it)) || 'Menu'\"\n >\n <praxis-rich-content\n rootClassName=\"pfx-menu-trigger__content\"\n [nodes]=\"getMenuTriggerRichContentNodes()\"\n ></praxis-rich-content>\n </button>\n <mat-menu #composeMenuRef=\"matMenu\">\n @for (mi of getMenuItems(row, asItemColumn(column, it)); track\n mi.id) {\n <button\n mat-menu-item\n (click)=\"onMenuItemClick(mi, row, $event)\"\n [disabled]=\"!mi.__visible\"\n >\n <praxis-rich-content\n layout=\"inline\"\n rootClassName=\"pfx-menu-item__content\"\n [nodes]=\"getMenuItemRichContentNodes(mi)\"\n ></praxis-rich-content>\n </button>\n }\n </mat-menu>\n } @case ('rating') {\n <praxis-table-rating\n class=\"pfx-rating-cell\"\n [itemsCount]=\"getRatingMax(row, asItemColumn(column, it))\"\n [value]=\"getRatingValue(row, asItemColumn(column, it))\"\n [size]=\"getRatingSize(row, asItemColumn(column, it))\"\n [ratingColor]=\"getRatingColor(row, asItemColumn(column, it))\"\n [outlineColor]=\"getRatingOutlineColor(row, asItemColumn(column, it))\"\n [ariaLabel]=\"getRatingAriaLabel(row, asItemColumn(column, it)) || column.header\"\n ></praxis-table-rating>\n } @case ('html') {\n <span\n [innerHTML]=\"getSafeHtml(row, asItemColumn(column, it))\"\n ></span>\n } @case ('value') {\n @let composeValue = getComposeItemValue(row, column, it);\n @if (composeValue !== null && composeValue !== undefined && composeValue !== '') {\n @let vComposeValueQuickView = getComposeValueQuickViewBinding(row, column, it);\n @if (vComposeValueQuickView) {\n <button\n type=\"button\"\n class=\"pfx-cell-value pfx-quick-view-trigger--button\"\n [ngClass]=\"getComposeValueClasses(it)\"\n [praxisQuickView]=\"vComposeValueQuickView\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"hover-and-click\"\n (click)=\"$event.stopPropagation()\"\n >{{ composeValue }}</button>\n } @else {\n <span\n class=\"pfx-cell-value\"\n [ngClass]=\"getComposeValueClasses(it)\"\n >{{ composeValue }}</span\n >\n }\n }\n } } }\n </span>\n } @default {\n @let vDefaultCellQuickView = getEffectiveQuickViewBinding(row, column);\n @if (vDefaultCellQuickView) {\n <button\n type=\"button\"\n class=\"pfx-cell-quick-view-btn pfx-quick-view-trigger--button\"\n [praxisQuickView]=\"vDefaultCellQuickView\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"hover-and-click\"\n (click)=\"$event.stopPropagation()\"\n >{{ getCellValue(row, column) }}</button>\n } @else {\n {{ getCellValue(row, column) }}\n }\n } }\n </div>\n </td>\n }\n\n <!-- Actions column -->\n @if (config.actions?.row?.enabled) {\n <td\n class=\"mat-mdc-cell 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 @if (config.actions?.row?.display === 'icons' ||\n !config.actions?.row?.display) { @for (a of\n getInlineRowActions(row); track trackAction($index, a)) {\n <span\n class=\"praxis-row-action-anchor\"\n [matTooltip]=\"getActionTooltip(a, row)\"\n [matTooltipDisabled]=\"!getActionTooltip(a, row)\"\n [attr.tabindex]=\"isActionDisabled(a, row) ? 0 : null\"\n [attr.role]=\"isActionDisabled(a, row) ? 'note' : null\"\n [attr.aria-label]=\"isActionDisabled(a, row) ? ((a.label || getActionId(a)) + ': ' + getActionTooltip(a, row)) : null\"\n [attr.title]=\"isActionDisabled(a, row) ? getActionTooltip(a, row) : null\"\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 [busy]=\"isRowActionBusy(a, row)\"\n [disabled]=\"isActionDisabled(a, row) || isRowActionBusy(a, row)\"\n [praxisQuickView]=\"getRowActionQuickViewBinding(a)\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"hover-only\"\n (click)=\"onRowAction(getActionId(a), row, $event, getRowActionRuntimeOptions(a, row))\"\n [attr.aria-label]=\"a.label || getActionId(a)\"\n [attr.aria-description]=\"getActionAriaDescription(a, row)\"\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 } } @if (config.actions?.row?.display === 'buttons') { @for (a of\n getInlineRowActions(row); track trackAction($index, a)) {\n <span\n class=\"praxis-row-action-anchor\"\n [matTooltip]=\"getActionTooltip(a, row)\"\n [matTooltipDisabled]=\"!getActionTooltip(a, row)\"\n [attr.tabindex]=\"isActionDisabled(a, row) ? 0 : null\"\n [attr.role]=\"isActionDisabled(a, row) ? 'note' : null\"\n [attr.aria-label]=\"isActionDisabled(a, row) ? ((a.label || getActionId(a)) + ': ' + getActionTooltip(a, row)) : null\"\n [attr.title]=\"isActionDisabled(a, row) ? getActionTooltip(a, row) : null\"\n matTooltipPosition=\"above\"\n matTooltipClass=\"praxis-tooltip\"\n >\n <button\n mat-flat-button\n class=\"praxis-row-btn\"\n [disabled]=\"isActionDisabled(a, row) || isRowActionBusy(a, row)\"\n [attr.aria-busy]=\"isRowActionBusy(a, row) ? 'true' : null\"\n [praxisQuickView]=\"getRowActionQuickViewBinding(a)\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"hover-only\"\n (click)=\"onRowAction(getActionId(a), row, $event, getRowActionRuntimeOptions(a, row))\"\n [attr.aria-label]=\"a.label || getActionId(a)\"\n [attr.aria-description]=\"getActionAriaDescription(a, row)\"\n [color]=\"a.color || null\"\n >\n <praxis-rich-content\n layout=\"inline\"\n rootClassName=\"praxis-row-action__content\"\n [nodes]=\"getRowActionRichContentNodes(a, isRowActionBusy(a, row))\"\n ></praxis-rich-content>\n </button>\n </span>\n } } @if (hasOverflowRowActions(row)) {\n <button\n #rowMoreMenuTriggerV=\"matMenuTrigger\"\n type=\"button\"\n [praxisIconButton]=\"getRowMenuIcon()\"\n size=\"compact\"\n class=\"praxis-icon-btn praxis-more-btn\"\n [matMenuTriggerFor]=\"rowMoreMenuV\"\n (mouseenter)=\"onRowOverflowMenuTriggerHover(row)\"\n (focus)=\"onRowOverflowMenuTriggerHover(row)\"\n (click)=\"setActiveRowOverflowMenuTrigger(rowMoreMenuTriggerV, $event.currentTarget)\"\n (menuOpened)=\"setActiveRowOverflowMenuTrigger(rowMoreMenuTriggerV); onRowOverflowMenuOpened(row)\"\n (menuClosed)=\"onRowOverflowMenuClosed(rowMoreMenuTriggerV)\"\n [attr.data-praxis-focus-key]=\"getRowActionFocusOriginKey(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 #rowMoreMenuV=\"matMenu\" xPosition=\"before\" panelClass=\"praxis-table-row-menu\">\n @if (hasRowOverflowMenuLoadingState(row) && getOverflowRowActions(row).length === 0) {\n <button mat-menu-item class=\"praxis-row-overflow-menu__item\" disabled>\n <mat-icon>hourglass_empty</mat-icon>\n <praxis-rich-content\n layout=\"inline\"\n rootClassName=\"praxis-row-overflow-menu__label\"\n [nodes]=\"getTableChromeTextRichContentNodes(getRowOverflowMenuLoadingLabel(), 'praxis-row-overflow-menu__label-text')\"\n ></praxis-rich-content>\n </button>\n } @for (a of getOverflowRowActions(row); track\n trackAction($index, a)) {\n <button\n mat-menu-item\n class=\"praxis-row-overflow-menu__item\"\n (click)=\"onOverflowRowAction(getActionId(a), row, $event, getRowActionRuntimeOptions(a, row))\"\n [disabled]=\"isActionDisabled(a, row) || isRowActionBusy(a, row)\"\n [attr.aria-busy]=\"isRowActionBusy(a, row) ? 'true' : null\"\n [attr.aria-label]=\"a.label || getActionId(a)\"\n [attr.aria-description]=\"getActionAriaDescription(a, row)\"\n [attr.title]=\"getActionTooltip(a, row)\"\n [matTooltip]=\"getActionTooltip(a, row)\"\n [matTooltipDisabled]=\"!getActionTooltip(a, row)\"\n matTooltipPosition=\"left\"\n >\n <mat-icon\n [color]=\"a.color || null\"\n [praxisIcon]=\"a.icon\"\n ></mat-icon>\n <praxis-rich-content\n layout=\"inline\"\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 } @if (hasRowOverflowMenuEmptyState(row)) {\n <button mat-menu-item disabled>\n <mat-icon>info</mat-icon>\n <praxis-rich-content\n layout=\"inline\"\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</div>\n@if (shouldShowLoadingSurface()) {\n<div\n class=\"ptable-loading-state\"\n [class.ptable-loading-state--overlay]=\"getLoadingIndicatorPosition() === 'overlay'\"\n role=\"status\"\n aria-live=\"polite\"\n>\n @if (getLoadingIndicatorType() === 'skeleton') {\n <div\n class=\"ptable-loading-state__hero\"\n [class.ptable-loading-state__hero--static]=\"!isLoadingSkeletonAnimated()\"\n aria-hidden=\"true\"\n >\n <span\n class=\"ptable-loading-state__line ptable-loading-state__line--wide\"\n ></span>\n <span\n class=\"ptable-loading-state__line ptable-loading-state__line--short\"\n ></span>\n <div class=\"ptable-loading-state__rows\">\n @for (placeholder of getLoadingSkeletonRows(); track placeholder) {\n <div class=\"ptable-loading-state__row\">\n <span\n class=\"ptable-loading-state__cell ptable-loading-state__cell--short\"\n ></span>\n <span class=\"ptable-loading-state__cell\"></span>\n <span\n class=\"ptable-loading-state__cell ptable-loading-state__cell--wide\"\n ></span>\n </div>\n }\n </div>\n </div>\n } @else if (getLoadingIndicatorType() === 'progress') {\n <div class=\"ptable-loading-state__progress\" aria-hidden=\"true\">\n <span></span>\n </div>\n } @else {\n <span class=\"ptable-loading-state__spinner\" aria-hidden=\"true\"></span>\n }\n <div class=\"ptable-loading-state__message\">\n {{ getLoadingSurfaceMessage() }}\n </div>\n @if (canCancelLoad()) {\n <div class=\"ptable-loading-state__actions\">\n <button mat-stroked-button type=\"button\" (click)=\"cancelLoad()\">\n {{ getCancelLoadLabel() }}\n </button>\n </div>\n }\n</div>\n}\n</div>\n@if (shouldShowCancelledState()) {\n<div class=\"ptable-cancelled-state\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">\n <mat-icon aria-hidden=\"true\">pause_circle</mat-icon>\n <div class=\"ptable-cancelled-state__content\">\n <strong>{{ getCancelledLoadTitle() }}</strong>\n <span>{{ getCancelledLoadMessage() }}</span>\n </div>\n <button mat-stroked-button type=\"button\" (click)=\"retryCancelledLoad()\">\n <mat-icon aria-hidden=\"true\">refresh</mat-icon>\n {{ getTableErrorRetryLabel() }}\n </button>\n</div>\n} @if (shouldShowNoDataState()) {\n<div\n class=\"ptable-no-data-state\"\n [style.--p-table-empty-action-size]=\"getNoDataStateActionSize()\"\n [style.--p-table-empty-action-radius]=\"getNoDataStateActionRadius()\"\n>\n <span\n class=\"ptable-no-data-state__announcement\"\n role=\"status\"\n aria-live=\"polite\"\n >\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} @if ( shouldRenderDataSurface() && !schemaError && !dataError &&\nshouldRenderFloatingBulkActions() && getFloatingBulkActions().length &&\n!shouldHideFloatingBulkActions() ) {\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<ng-template #bottomDetailSurface>\n @let bottom = getBottomDetailState();\n @if (shouldRenderBottomDetailSurface(bottom)) {\n <section class=\"ptable-bottom-detail\" data-testid=\"table-bottom-detail\"\n [class.ptable-bottom-detail--dynamic]=\"isBottomDetailDynamicHeight()\"\n [class.ptable-bottom-detail--before-controls]=\"isBottomDetailBeforeControls()\"\n role=\"region\" [attr.aria-label]=\"bottom.title\" [attr.aria-busy]=\"bottom.status === 'loading'\">\n <header class=\"ptable-bottom-detail__header\">\n <span class=\"ptable-bottom-detail__identity\">\n <mat-icon aria-hidden=\"true\">dock_to_bottom</mat-icon>\n <span class=\"ptable-bottom-detail__heading\">\n <span class=\"ptable-bottom-detail__eyebrow\">{{ bottomDetailText('panelLabel') }}</span>\n <strong>{{ bottom.title }}</strong>\n </span>\n </span>\n <button type=\"button\" mat-button data-testid=\"table-bottom-detail-toggle\"\n [attr.aria-expanded]=\"!bottomDetailCollapsed()\" [attr.aria-controls]=\"tableId + '-bottom-detail-body'\"\n (click)=\"toggleBottomDetail()\">\n <mat-icon aria-hidden=\"true\">{{ bottomDetailCollapsed() ? 'expand_more' : 'expand_less' }}</mat-icon>\n {{ bottomDetailText(bottomDetailCollapsed() ? 'expand' : 'collapse') }}\n </button>\n </header>\n @if (!bottomDetailCollapsed()) {\n <div class=\"ptable-bottom-detail__body\" data-testid=\"table-bottom-detail-body\"\n [attr.id]=\"tableId + '-bottom-detail-body'\" [style.height.px]=\"getBottomDetailBodyHeight()\"\n role=\"group\" [attr.aria-label]=\"bottom.title\" tabindex=\"0\">\n @if (!bottom.detailState) {\n <span data-testid=\"table-bottom-detail-status\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">\n {{ bottom.message }}\n </span>\n }\n @if (bottom.detailState && bottom.row) {\n <ng-container *ngTemplateOutlet=\"tableDetailBodyTemplate;\n context: { detailState: bottom.detailState, row: bottom.row, index: bottom.index }\"\n ></ng-container>\n @if (bottom.status === 'blocked' || bottom.status === 'error') {\n <button type=\"button\" mat-button (click)=\"retryBottomDetail()\">{{ bottomDetailText('retry') }}</button>\n }\n }\n </div>\n }\n </section>\n }\n</ng-template>\n@if (isBottomDetailBeforeControls()) {\n <ng-container *ngTemplateOutlet=\"bottomDetailSurface\"></ng-container>\n}\n<!-- Barra de a\u00E7\u00F5es no rodap\u00E9 (opcional) -->\n@if (shouldRenderDataSurface() && !schemaError && showToolbar && shouldRenderFooterToolbar()) {\n <praxis-table-toolbar\n [config]=\"config\"\n [focusScope]=\"getFocusRestoreScope('footer')\"\n [backgroundColor]=\"getToolbarActionsBackgroundColor()\"\n [style.--pfx-filter-h]=\"getToolbarLayoutHeightHostStyle()\"\n [class.footer-flat]=\"hasSurfaceAfterFooterToolbar()\"\n class=\"praxis-toolbar-footer\"\n placement=\"footer\"\n [showMain]=\"shouldShowFooterToolbarMain()\"\n [showEndActions]=\"shouldShowFooterToolbarEndActions()\"\n [showActionsGroup]=\"shouldShowToolbarActionsBottom()\"\n [showMobileActions]=\"shouldShowToolbarActionsBottom()\"\n [evaluationContext]=\"getToolbarEvaluationContext()\"\n [activeQuickFilterId]=\"activeQuickFilterId\"\n [activeDensity]=\"resolveAppearanceDensity()\"\n [activeCrossFilters]=\"activeCrossFilters\"\n [columnVisibilityController]=\"toolbarColumnVisibilityController\"\n [exportBusy]=\"exportBusy\"\n [exportStatusMessage]=\"exportStatusMessage\"\n (toolbarAction)=\"onToolbarAction($event)\"\n (exportAction)=\"onExportAction($event)\"\n (quickFilterChange)=\"onQuickFilterChange($event)\"\n (densityChange)=\"onDensityChange($event)\"\n (clearCrossFilter)=\"onClearCrossFilter($event)\"\n (clearAllCrossFilters)=\"onClearAllCrossFilters()\"\n >\n @if (shouldShowFooterToolbarMain() && shouldRenderAdvancedFilter() && !filterTeleport) {\n <ng-container ngProjectAs=\"[advancedFilter]\" *ngTemplateOutlet=\"filterBarTemplate\" />\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 [pageIndex]=\"pageIndex\"\n [pageSize]=\"pageSize\"\n [pageSizeOptions]=\"getPaginationPageSizeOptions()\"\n [selectConfig]=\"paginatorSelectConfig\"\n [showFirstLastButtons]=\"getPaginationShowFirstLast()\"\n [disabled]=\"isTableDataLoading()\"\n (page)=\"onPageChange($event)\"\n [class.compact]=\"config.behavior?.pagination?.style === 'compact'\"\n [class.footer-stack]=\"shouldShowToolbarActionsBottom()\"\n [class.detail-stack]=\"hasBottomDetailAfterPaginator()\"\n >\n </mat-paginator>\n}\n@if (isBottomDetailAfterControls()) {\n <ng-container *ngTemplateOutlet=\"bottomDetailSurface\"></ng-container>\n}\n\n<!-- One renderer shared by row and contextual detail presentations. -->\n<ng-template #tableDetailBodyTemplate let-detailState=\"detailState\" let-row=\"row\" let-i=\"index\">\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(bottomDetailText('loading'), '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 || bottomDetailText('blocked'), '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\" [attr.aria-label]=\"bottomDetailText('sections')\">\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(bottomDetailText('tabsEmpty'), '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>\n <ng-template #expansionDetailNodeTemplate let-node let-row=\"row\" let-index=\"index\">\n @if (!isExpansionDetailNodeVisible(node, row, index)) {} @else 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, node)\"\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(getExpansionDetailListEmptyText(node), '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, bottomDetailText('collectionTitle')), '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, bottomDetailText('cardTitle')), '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 ('richContent') {\n <div\n class=\"pfx-expansion-node-rich-content\"\n (click)=\"$event.stopPropagation()\"\n >\n <praxis-rich-content\n [document]=\"getExpansionDetailRichContentDocument(node)\"\n [layout]=\"getExpansionDetailRichContentLayout(node)\"\n [rootClassName]=\"node?.rootClassName || 'pfx-expansion-node-rich-content__document'\"\n [context]=\"getExpansionDetailRichContentContext(row, index, node)\"\n [hostCapabilities]=\"getExpansionDetailRichContentHostCapabilities(row)\"\n ></praxis-rich-content>\n </div>\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, node)\"\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, node)\"\n ></praxis-rich-content>\n }\n </div>\n } @else {\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-placeholder\"\n [nodes]=\"getExpansionDetailTextRichContentNodes(bottomDetailText('itemsEmpty'), '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(bottomDetailText('tabOutside'), '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(bottomDetailText('unsupportedNode'), '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\n@if (isAnalyticalDrawerEnabled()) {\n <praxis-analytical-drawer\n [isOpen]=\"isAnalyticalDrawerOpen\"\n [drawerConfig]=\"config?.behavior?.drawer || null\"\n [resourcePath]=\"resourcePath\"\n [row]=\"analyticalDrawerRow\"\n (closeDrawer)=\"closeAnalyticalDrawer()\"\n (tabChange)=\"onAnalyticalDrawerTabChange($event)\"\n />\n}\n", styles: ["@charset \"UTF-8\";.pfx-micro-viz-cell{position:relative;display:inline-block;width:min(100%,210px);min-width:112px;max-width:240px;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) 78%,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;z-index:2;background:var(--md-sys-color-on-surface, #111827);box-shadow:0 0 0 .75px var(--md-sys-color-surface, #ffffff)}.pfx-micro-bullet__target[style*=\"left: 100%\"],.pfx-micro-bullet__target[style*=\"left: 100.00%\"]{transform:translate(-100%)}.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:static;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],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-trend__scrub-slice[data-tone=success]{color:var(--p-table-state-success-fg, #168a4a)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz[data-tone=warning],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-trend__scrub-slice[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],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-trend__scrub-slice[data-tone=danger],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-trend__scrub-slice[data-tone=critical]{color:var(--p-table-state-danger-fg, #b3261e)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz[data-tone=info],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-trend__scrub-slice[data-tone=info]{color:var(--md-sys-color-primary, #2563eb)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz[data-tone=neutral],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-trend__scrub-slice[data-tone=neutral]{color:var(--md-sys-color-secondary, #5c6b73)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz{position:relative;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{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__segments{position:static;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);transform-origin:left center;animation:pfxMicroBarGrow var(--p-table-microviz-animation-duration, .32s) cubic-bezier(.22,1,.36,1) both;transition:opacity .15s ease,filter .15s ease,transform .15s ease}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__row[data-tone=success] .pfx-micro-viz__bar,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__segment[data-tone=success],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz[data-tone=success] .pfx-micro-viz__bar{background:var(--p-table-state-success-fg, #168a4a)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__row[data-tone=warning] .pfx-micro-viz__bar,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__segment[data-tone=warning],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz[data-tone=warning] .pfx-micro-viz__bar{background:var(--p-table-state-warning-fg, #b45f06)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__row[data-tone=danger] .pfx-micro-viz__bar,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__row[data-tone=critical] .pfx-micro-viz__bar,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__segment[data-tone=danger],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__segment[data-tone=critical],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz[data-tone=danger] .pfx-micro-viz__bar,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz[data-tone=critical] .pfx-micro-viz__bar{background:var(--p-table-state-danger-fg, #b3261e)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__row[data-tone=info] .pfx-micro-viz__bar,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__segment[data-tone=info],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz[data-tone=info] .pfx-micro-viz__bar{background:var(--md-sys-color-primary, #2563eb)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__row[data-tone=neutral] .pfx-micro-viz__bar,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__segment[data-tone=neutral],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz[data-tone=neutral] .pfx-micro-viz__bar{background:var(--md-sys-color-secondary, #5c6b73)}: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) 78%,transparent)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__bullet{display:flex;align-items:center;gap:8px;width:100%}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__track{position:relative;display:block;flex:1 1 auto;min-width:48px;block-size:var(--pfx-bullet-bar-height, 8px);overflow:hidden;border-radius:var(--pfx-micro-track-radius, 999px);background:var(--pfx-micro-track-color, var(--md-sys-color-surface-container-high, #e5e7eb));transition:transform .15s ease}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__bullet:hover .pfx-micro-bullet__track{transform:scaleY(1.18)}: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:1px;inset-inline-start:0;block-size:calc(100% - 2px);border-radius:inherit;transform-origin:left center;animation:pfxMicroBarGrow var(--p-table-microviz-animation-duration, .32s) cubic-bezier(.22,1,.36,1) both}: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);transition:transform .15s ease}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__target[style*=\"left: 100%\"],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__target[style*=\"left: 100.00%\"]{transform:translate(-100%)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__compact-value{flex:0 0 auto;font-size:11px;font-weight:600;line-height:1;color:var(--md-sys-color-on-surface, #1f2937);white-space:nowrap;font-variant-numeric:tabular-nums;text-align:right}: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-bullet__range[data-tone=neutral],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__actual[data-tone=neutral]{background:var(--md-sys-color-secondary, #5c6b73)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__row{position:relative;display:grid;grid-template-columns:minmax(42px,.8fr) minmax(52px,1fr) auto;align-items:center;gap:6px;min-width:0;transition:opacity .15s ease}: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{position:static;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;animation:pfxMicroPopIn var(--p-table-microviz-animation-duration, .28s) cubic-bezier(.22,1,.36,1) both}: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);transition:transform .16s ease}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz.pfx-micro-viz__delta[data-direction=up]:hover .pfx-micro-viz__delta-symbol{transform:translateY(-2px)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz.pfx-micro-viz__delta[data-direction=down]:hover .pfx-micro-viz__delta-symbol{transform:translateY(1.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{position:static;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;transition:transform .18s ease}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz.pfx-micro-viz__radial:hover .pfx-micro-radial-svg,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz.pfx-micro-viz__harvey:hover .pfx-micro-harvey-svg{transform:scale(1.08)}: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%;animation:pfxMicroPopIn var(--p-table-microviz-animation-duration, .32s) cubic-bezier(.22,1,.36,1) both}: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;transition:transform .18s ease}: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%;animation:pfxMicroPopIn var(--p-table-microviz-animation-duration, .32s) cubic-bezier(.22,1,.36,1) both}: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{position:relative;display:inline-flex;align-items:center;justify-content:center;width:100%;min-width:112px;overflow:visible}: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{position:relative;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;stroke-dasharray:240;stroke-dashoffset:0;animation:pfxMicroLineDraw var(--p-table-microviz-animation-duration, .32s) cubic-bezier(.22,1,.36,1) both}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-area__fill{fill:currentColor;animation:pfxMicroAreaFade var(--p-table-microviz-animation-duration, .32s) ease both}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-trend__ref-line{stroke:var(--md-sys-color-on-surface-variant, #6b7280);stroke-width:1px;stroke-dasharray:2 2;opacity:.55}: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{transform-box:fill-box;transform-origin:center bottom;animation:pfxMicroColGrow var(--p-table-microviz-animation-duration, .32s) cubic-bezier(.22,1,.36,1) both;transition:opacity .14s ease,filter .14s ease}: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__fallback{display:inline-flex;align-items:center;font-size:var(--pfx-micro-fallback-font-size, 12px);color:var(--md-sys-color-on-surface-variant, #6b7280);line-height:1.2;-webkit-user-select:text;user-select:text}: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{position:static;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;animation:pfxMicroPopIn var(--p-table-microviz-animation-duration, .28s) cubic-bezier(.22,1,.36,1) both;transition:transform .15s ease,box-shadow .15s ease}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__node[data-active=true]{box-shadow:0 0 0 3px color-mix(in srgb,currentColor 22%,transparent)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__node-wrapper:hover .pfx-micro-step__node{transform:scale(1.12)}: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)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__comparison:hover .pfx-micro-viz__row:not(:hover){opacity:.45}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__segments:hover .pfx-micro-viz__segment:not(:hover){opacity:.42}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__segments .pfx-micro-viz__segment:hover{filter:brightness(1.08)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-trend__scrub-layer{position:absolute;inset:0;display:flex;align-items:stretch;z-index:2}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-trend__scrub-slice{position:static;flex:1 1 0%;height:100%;cursor:crosshair}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-trend__scrub-slice:hover:before{content:\"\";position:absolute;left:var(--pfx-scrub-x, 50%);top:var(--pfx-scrub-y, 50%);width:7px;height:7px;border-radius:50%;background:currentColor;border:1.5px solid var(--md-sys-color-surface, #ffffff);box-shadow:0 1px 4px #00000040;transform:translate(-50%,-50%);pointer-events:none;z-index:3}:host ::ng-deep .mat-mdc-cell:has(.pfx-micro-viz-cell),:host ::ng-deep .mat-mdc-cell:has(.pfx-micro-viz-cell) .pfx-cell-content{overflow:visible}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz[data-micro-readout]:hover:after,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz[data-micro-readout]:focus-visible:after,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__row[data-micro-readout]:hover:after,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__segment[data-micro-readout]:hover:after,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__node-wrapper[data-micro-readout]:hover:after,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-trend__scrub-slice[data-micro-readout]:hover:after{content:attr(data-micro-readout);position:absolute;inset-block-end:calc(100% + 4px);inset-inline-start:0;z-index:20;max-width:none;padding:3px 8px;border-radius:6px;background:var(--md-sys-color-surface-container-highest, #1e293b);color:var(--md-sys-color-on-surface, #f8fafc);border:1px solid var(--md-sys-color-outline-variant, rgba(148, 163, 184, .35));font-family:var(--md-sys-typescale-body-medium-font-family, sans-serif);font-size:10.5px;font-weight:600;font-variant-numeric:tabular-nums;line-height:1.25;white-space:nowrap;box-shadow:0 4px 12px #0f172a3d;pointer-events:none}@keyframes pfxMicroBarGrow{0%{transform:scaleX(0)}to{transform:scaleX(1)}}@keyframes pfxMicroColGrow{0%{transform:scaleY(0)}to{transform:scaleY(1)}}@keyframes pfxMicroLineDraw{0%{stroke-dashoffset:240}to{stroke-dashoffset:0}}@keyframes pfxMicroAreaFade{0%{opacity:0}to{opacity:1}}@keyframes pfxMicroPopIn{0%{opacity:.4;transform:scale(.88)}to{opacity:1;transform:scale(1)}}@media(prefers-reduced-motion:reduce),print{:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz *,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}}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{box-sizing:border-box;width:var(--p-table-visible-viewport-width, 100%);max-width:100%;position:sticky;left:0;container-type:inline-size;padding:16px 20px;border-left:3px solid var(--md-sys-color-primary);background:color-mix(in srgb,var(--md-sys-color-surface-container-low, var(--p-table-bg)) 92%,var(--md-sys-color-primary, transparent) 8%)}.ptable-bottom-detail{min-width:0;overflow:hidden;border:1px solid var(--p-table-border-color);border-top:0;border-radius:0 0 12px 12px;background:var(--p-table-bg, var(--mat-sys-surface, var(--md-sys-color-surface)));color:var(--mat-sys-on-surface, var(--md-sys-color-on-surface));box-shadow:var(--p-table-surface-shadow)}.ptable-bottom-detail--before-controls{border-radius:0;box-shadow:none}.ptable-bottom-detail__header{display:flex;align-items:center;justify-content:space-between;gap:16px;min-height:56px;padding:6px 14px 6px 16px;border-bottom:1px solid color-mix(in srgb,var(--p-table-border-color) 72%,transparent);background:color-mix(in srgb,var(--md-sys-color-primary-container, var(--p-table-bg)) 22%,var(--p-table-bg) 78%)}.ptable-bottom-detail__header button{flex-shrink:0;border-radius:999px}.ptable-bottom-detail__identity{display:flex;min-width:0;align-items:center;gap:10px}.ptable-bottom-detail__identity>mat-icon{flex:0 0 auto;color:var(--md-sys-color-primary)}.ptable-bottom-detail__heading{display:grid;min-width:0}.ptable-bottom-detail__heading strong{overflow:hidden;font-size:14px;line-height:20px;text-overflow:ellipsis;white-space:nowrap}.ptable-bottom-detail__eyebrow{color:var(--md-sys-color-on-surface-variant);font-size:11px;font-weight:700;letter-spacing:.055em;line-height:16px;text-transform:uppercase}.ptable-bottom-detail__body{box-sizing:border-box;display:grid;align-content:start;gap:16px;max-height:40dvh;overflow:auto;scrollbar-gutter:stable;overscroll-behavior:contain;padding:16px;overflow-wrap:anywhere}.ptable-bottom-detail__body>[data-testid=table-bottom-detail-status]:empty{display:none}.ptable-bottom-detail--dynamic .ptable-bottom-detail__body{height:auto;scrollbar-gutter:auto}.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:14px}.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:10px;padding:12px 14px;background:var(--md-sys-color-surface)}.pfx-expansion-node.pfx-expansion-node-card-grid,.pfx-expansion-node.pfx-expansion-node-rich-content{border:0;border-radius:0;padding:0;background:transparent}.pfx-expansion-node-card__header{margin-bottom:10px}.pfx-expansion-node-card__title{margin:0;font-size:14px;font-weight:700;line-height:1.3;letter-spacing:-.01em}.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;justify-content:space-between;flex-wrap:wrap;gap:6px 12px;padding:8px 10px;border-radius:8px;background:color-mix(in srgb,var(--md-sys-color-surface-container-low, transparent) 70%,transparent)}.pfx-expansion-node-value__label{color:var(--md-sys-color-on-surface-variant);font-size:11px;font-weight:700;letter-spacing:.04em;text-transform:uppercase}.pfx-expansion-node-value__content{font-size:13.5px;font-weight:600;color:var(--md-sys-color-on-surface);font-variant-numeric:tabular-nums}.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, var(--mat-sys-surface-container-lowest))}.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}:is(.pfx-expansion-node-action-bar__action-btn,.pfx-expansion-node-rich-list__item-action-btn,.pfx-expansion-node-embed__action-btn,.pfx-expansion-node-action button,.praxis-row-btn,.praxis-icon-btn):disabled{opacity:.56;filter:saturate(.35);box-shadow:none;cursor:not-allowed}.pfx-expansion-node-card-grid__header{display:flex;flex-wrap:wrap;align-items:baseline;justify-content:space-between;gap:4px 12px;margin:0 0 12px;padding-bottom:8px;border-bottom:1px solid color-mix(in srgb,var(--p-table-border-color) 65%,transparent)}.pfx-expansion-node-card-grid__title-text{font-size:13px;font-weight:800;letter-spacing:.04em;text-transform:uppercase;color:var(--md-sys-color-on-surface)}.pfx-expansion-node-card-grid__subtitle-text{font-size:12px;font-weight:500;color:var(--md-sys-color-on-surface-variant)}.pfx-expansion-node-card-grid__cards{display:grid;gap:12px;grid-template-columns:var(--pfx-expansion-card-grid-columns, repeat(auto-fit, minmax(min(var(--pfx-expansion-card-grid-min-width, 220px), 100%), 1fr)))}@container (max-width: 780px){.pfx-expansion-node-card-grid__cards{grid-template-columns:repeat(auto-fit,minmax(min(240px,100%),1fr))}}@container (max-width: 520px){.pfx-expansion-node-card-grid__cards{grid-template-columns:minmax(0,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%;border:0;padding:0;background:transparent}.pfx-expansion-node-rich-content{min-width:0}.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-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-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-icon-btn.destructive{color:var(--md-sys-color-error)}.praxis-row-overflow-menu__item{min-width:212px;max-width:min(320px,88vw)}.praxis-row-overflow-menu__item[disabled]{pointer-events:auto!important;cursor:default!important}.praxis-row-overflow-menu__item ::ng-deep .mat-mdc-menu-item-text{display:flex;align-items:center;min-width:0;white-space:nowrap}.praxis-row-overflow-menu__item ::ng-deep .praxis-row-overflow-menu__label,.praxis-row-overflow-menu__item ::ng-deep .praxis-row-overflow-menu__label-text,.praxis-row-overflow-menu__item ::ng-deep .praxis-row-overflow-menu__label .prx-rich-text,::ng-deep .mat-mdc-menu-panel .pfx-menu-item__content,::ng-deep .mat-mdc-menu-panel .pfx-menu-item__content .prx-rich-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;word-break:normal;overflow-wrap:normal}.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;position:relative;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;min-width:100%}: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.detail-stack{border-bottom-right-radius:0;border-bottom-left-radius:0;box-shadow:none}: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, var(--mat-sys-surface-container))!important;background-color:var(--md-sys-color-surface-container, var(--mat-sys-surface-container))!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-quick-view-trigger--button,.pfx-cell-quick-view-btn{appearance:none;border:none;background:transparent;padding:0;margin:0;font:inherit;color:inherit;text-align:inherit;line-height:inherit;cursor:pointer}.pfx-cell-quick-view-btn,.pfx-cell-value.pfx-quick-view-trigger--button{border-bottom:1px dashed color-mix(in srgb,var(--md-sys-color-primary) 52%,transparent);transition:color .14s ease,border-color .14s ease}.pfx-cell-quick-view-btn:hover,.pfx-cell-value.pfx-quick-view-trigger--button:hover{color:var(--md-sys-color-primary);border-bottom-color:var(--md-sys-color-primary)}.pfx-link-with-quick-view{display:inline-flex;align-items:center;gap:5px;min-width:0;max-width:100%}.pfx-quick-view-adjacent-btn{appearance:none;flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;padding:0;border-radius:5px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 30%,transparent);background:color-mix(in srgb,var(--md-sys-color-primary) 10%,transparent);color:var(--md-sys-color-primary);cursor:pointer;transition:background-color .14s ease,border-color .14s ease}.pfx-quick-view-adjacent-btn:hover{background:color-mix(in srgb,var(--md-sys-color-primary) 18%,transparent);border-color:color-mix(in srgb,var(--md-sys-color-primary) 52%,transparent)}.pfx-quick-view-adjacent-btn__icon{font-size:13px!important;width:13px!important;height:13px!important;line-height:13px!important}.praxis-quick-view-trigger{cursor:pointer}.praxis-quick-view-trigger:focus-visible,.pfx-quick-view-trigger--button:focus-visible,.pfx-quick-view-adjacent-btn:focus-visible{outline:2px solid var(--md-sys-color-primary);outline-offset:2px;border-radius:4px}.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{background:var(--md-sys-color-error);color:var(--md-sys-color-on-error)}.pfx-chip--filled-warning{background:var(--p-table-state-warning-bg);color:var(--p-table-state-warning-fg)}.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,.pfx-chip--filled-neutral,.pfx-chip--filled-default{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-warning{background:color-mix(in srgb,var(--p-table-state-warning-bg) 72%,transparent);color:var(--p-table-state-warning-fg);border-color:color-mix(in srgb,var(--p-table-state-warning-fg) 18%,transparent)}.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,.pfx-chip--soft-neutral,.pfx-chip--soft-default{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-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.dir-media{display:inline-grid;grid-template-columns:auto minmax(0,1fr);grid-auto-rows:auto;align-content:center;align-items:center;column-gap:var(--p-table-compose-media-gap, 10px);row-gap:1px;min-width:0;max-width:100%;line-height:1.25}.pfx-cell-compose.dir-media>:first-child{grid-column:1;grid-row:1/span 6;align-self:center}.pfx-cell-compose.dir-media>:first-child:nth-last-child(2){grid-row:1}.pfx-cell-compose.dir-media>:first-child:nth-last-child(3){grid-row:1/span 2}.pfx-cell-compose.dir-media>:first-child:nth-last-child(4){grid-row:1/span 3}.pfx-cell-compose.dir-media>:first-child:nth-last-child(5){grid-row:1/span 4}.pfx-cell-compose.dir-media>:first-child:nth-last-child(6){grid-row:1/span 5}.pfx-cell-compose.dir-media>:not(:first-child){grid-column:2;justify-self:start;min-width:0;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pfx-cell-compose.dir-media .pfx-badge,.pfx-cell-compose.dir-media .pfx-chip{padding-block:2px;font-size:11px}.pfx-cell-compose.dir-col .pfx-cell-value--subtle,.pfx-cell-compose.dir-media .pfx-cell-value--subtle{font-variant-numeric:tabular-nums}.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%;container:praxis-table-viewport/inline-size;overflow-x:auto;-webkit-overflow-scrolling:touch;overscroll-behavior-x:contain;background:var(--p-table-bg);border-radius:12px 12px 0 0;transition:box-shadow .12s ease-out}.ptable-data-surface{position:relative;min-width:0}.ptable-data-surface--loading-overlay{min-block-size:10rem}.px-scroll-viewport--can-scroll-left{box-shadow:inset 1px 0 color-mix(in srgb,var(--md-sys-color-primary, #1263b4) 42%,transparent),inset 34px 0 26px -26px color-mix(in srgb,var(--md-sys-color-on-surface, #1a1b1f) 68%,transparent)}.px-scroll-viewport--can-scroll-right{box-shadow:inset -1px 0 color-mix(in srgb,var(--md-sys-color-primary, #1263b4) 42%,transparent),inset -34px 0 26px -26px color-mix(in srgb,var(--md-sys-color-on-surface, #1a1b1f) 68%,transparent)}.px-scroll-viewport--can-scroll-left.px-scroll-viewport--can-scroll-right{box-shadow:inset 1px 0 color-mix(in srgb,var(--md-sys-color-primary, #1263b4) 42%,transparent),inset -1px 0 color-mix(in srgb,var(--md-sys-color-primary, #1263b4) 42%,transparent),inset 34px 0 26px -26px color-mix(in srgb,var(--md-sys-color-on-surface, #1a1b1f) 68%,transparent),inset -34px 0 26px -26px color-mix(in srgb,var(--md-sys-color-on-surface, #1a1b1f) 68%,transparent)}.px-scroll-viewport--can-scroll-left .pfx-sticky-boundary-start:after,.px-scroll-viewport--can-scroll-right .pfx-sticky-boundary-end:before{content:\"\";position:absolute;inset-block:0;width:1px;pointer-events:none;background:var(--p-table-border-color);z-index:1}.px-scroll-viewport--can-scroll-left .pfx-sticky-boundary-start:after{inset-inline-end:-1px;box-shadow:12px 0 16px -12px var(--p-table-text-color)}.px-scroll-viewport--can-scroll-right .pfx-sticky-boundary-end:before{inset-inline-start:-1px;box-shadow:-12px 0 16px -12px var(--p-table-text-color)}:host-context([dir=rtl]) .px-scroll-viewport--can-scroll-left .pfx-sticky-boundary-start:after{box-shadow:-12px 0 16px -12px var(--p-table-text-color)}:host-context([dir=rtl]) .px-scroll-viewport--can-scroll-right .pfx-sticky-boundary-end:before{box-shadow:12px 0 16px -12px var(--p-table-text-color)}@media(forced-colors:active){.px-scroll-viewport--can-scroll-left .pfx-sticky-boundary-start:after,.px-scroll-viewport--can-scroll-right .pfx-sticky-boundary-end:before{background:CanvasText;box-shadow:none;forced-color-adjust:none}}.px-scroll-viewport:focus-visible{outline:2px solid var(--md-sys-color-primary, #1263b4);outline-offset:-2px}.px-scroll-viewport--refreshing{cursor:progress}.px-scroll-viewport--loading-replaced{display:none}.px-scroll-viewport--refreshing .praxis-table-data--refreshing{pointer-events:none}.ptable-refresh-state{min-height:36px;display:flex;align-items:center;justify-content:center;gap:10px;padding:6px 12px;color:var(--md-sys-color-on-surface-variant, #5a5d67);background:var(--md-sys-color-surface-container-low, var(--p-table-bg));border-block:1px solid var(--md-sys-color-outline-variant, rgba(18, 99, 180, .12));font-size:.85rem;font-weight:600}.ptable-refresh-state__spinner{width:16px;height:16px;flex:0 0 16px;border:2px solid color-mix(in srgb,var(--md-sys-color-primary, #1263b4) 24%,transparent);border-top-color:var(--md-sys-color-primary, #1263b4);border-radius:50%;animation:ptable-refresh-spin .72s linear infinite}.ptable-refresh-state__progress,.ptable-refresh-state__skeleton{position:relative;display:block;width:54px;height:6px;flex:0 0 54px;overflow:hidden;border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-primary, #1263b4) 18%,transparent)}.ptable-refresh-state__progress:after,.ptable-refresh-state__skeleton:after{content:\"\";position:absolute;inset-block:0;width:45%;border-radius:inherit;background:var(--md-sys-color-primary, #1263b4);animation:ptable-loading-progress 1.1s ease-in-out infinite}.ptable-refresh-state__skeleton:after{width:100%;background:linear-gradient(90deg,transparent,color-mix(in srgb,var(--md-sys-color-primary, #1263b4) 44%,transparent),transparent);animation-name:ptable-loading-wave}@keyframes ptable-refresh-spin{to{transform:rotate(360deg)}}@keyframes ptable-loading-progress{0%{transform:translate(-110%)}to{transform:translate(225%)}}.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%}.px-scroll-viewport.pfx-mobile-card-mode{overflow-x:visible}:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode{display:block;width:100%!important;min-width:0!important;max-width:none!important;background:transparent}:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode thead{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode tbody{display:grid;gap:12px}:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode .mat-mdc-row:not(.pfx-expansion-detail-row){display:grid;grid-template-columns:minmax(0,1fr);gap:0;height:auto;min-height:0;overflow:hidden;border:1px solid var(--p-table-border-color);border-radius:12px;background:var(--p-table-row-bg);box-shadow:none}:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode .mat-mdc-row:not(.pfx-expansion-detail-row) .mat-mdc-cell[data-praxis-card-label]{display:grid;grid-template-columns:minmax(7rem,.8fr) minmax(0,1.2fr);align-items:start;gap:12px;width:auto!important;min-width:0!important;max-width:none!important;height:auto!important;min-height:var(--p-table-row-height, var(--p-table-row-height-default, 44px));position:static!important;inset:auto!important;z-index:auto!important;padding:var(--p-cell-padding, var(--p-cell-padding-default, 10px 14px));border:0;border-bottom:1px solid var(--p-table-border-color);text-align:initial!important;white-space:normal;overflow:visible;text-overflow:clip}:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode .mat-mdc-row:not(.pfx-expansion-detail-row) .mat-mdc-cell[data-praxis-card-label]:before{content:attr(data-praxis-card-label);color:var(--p-table-header-fg);font-size:.75rem;font-weight:700;line-height:1.35}:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode .mat-mdc-row:not(.pfx-expansion-detail-row) .mat-mdc-cell[data-praxis-card-label] .pfx-cell-content{min-width:0;overflow:visible;white-space:normal;justify-content:flex-start!important;text-align:start!important}:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode .pfx-chip,:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode .pfx-badge{max-width:100%;height:auto;white-space:normal;overflow-wrap:anywhere}:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode .pfx-cell-compose.dir-media>:not(:first-child){white-space:normal;overflow-wrap:anywhere;text-overflow:clip}:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode .mat-mdc-row:not(.pfx-expansion-detail-row) .mat-mdc-cell[data-praxis-card-label]:last-child{border-bottom:0}:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode .praxis-actions-cell{grid-column:1/-1}:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode .praxis-actions-cell .praxis-actions-cell__content{justify-content:flex-start;flex-wrap:wrap}:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode .mat-mdc-row:not(.pfx-expansion-detail-row) .praxis-actions-cell[data-praxis-card-label=\"\"]{grid-template-columns:minmax(0,1fr);align-items:center;padding-block:0}:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode .mat-mdc-row:not(.pfx-expansion-detail-row) .praxis-actions-cell[data-praxis-card-label=\"\"]:before{content:none}@container praxis-table-viewport (max-width: 480px){:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode .mat-mdc-row:not(.pfx-expansion-detail-row) .mat-mdc-cell[data-praxis-card-label]{grid-template-columns:minmax(0,1fr);gap:4px}:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode .mat-mdc-row:not(.pfx-expansion-detail-row) .mat-mdc-cell[data-praxis-card-label] .pfx-cell-content{width:100%;overflow:visible;overflow-wrap:anywhere}:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode .pfx-cell-content>*{min-width:0;max-width:100%}:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode .praxis-actions-cell .praxis-actions-cell__content{gap:8px}}: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{color:inherit;font-weight:inherit}: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):not(.praxis-header-align-center) .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:0;padding-inline-end:0}: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.pfx-row-click-selectable:focus-visible{outline:2px solid var(--praxis-theme-focus-outline, var(--md-sys-color-primary));outline-offset:-2px}: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>mat-radio-button{--mat-radio-selected-icon-color: var(--p-table-row-selected-fg);--mat-radio-selected-hover-icon-color: var(--p-table-row-selected-fg);--mat-radio-selected-focus-icon-color: var(--p-table-row-selected-fg);--mat-radio-selected-pressed-icon-color: var(--p-table-row-selected-fg)}:host ::ng-deep .mat-mdc-table:not(.pfx-mobile-card-mode) .mat-mdc-row.pfx-row-selected .mat-mdc-cell:first-child{position:relative}:host ::ng-deep .mat-mdc-table:not(.pfx-mobile-card-mode) .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 ::ng-deep .mat-mdc-table.pfx-mobile-card-mode .mat-mdc-row.pfx-row-selected{box-shadow:inset 4px 0 0 var(--p-table-row-selected-indicator)}: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{background:var(--md-sys-color-error);color:var(--md-sys-color-on-error)}.pfx-badge--filled-warning{background:var(--p-table-state-warning-bg);color:var(--p-table-state-warning-fg)}.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,.pfx-badge--filled-neutral,.pfx-badge--filled-default{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-warning{background:color-mix(in srgb,var(--p-table-state-warning-bg) 72%,transparent);color:var(--p-table-state-warning-fg);border-color:color-mix(in srgb,var(--p-table-state-warning-fg) 18%,transparent)}.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,.pfx-badge--soft-neutral,.pfx-badge--soft-default{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--overlay{position:absolute;z-index:8;inset:0;min-block-size:10rem;background:color-mix(in srgb,var(--md-sys-color-surface, #fff) 92%,transparent);-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}.ptable-loading-state__spinner{width:34px;height:34px;margin:18px auto 8px;border:3px solid color-mix(in srgb,var(--md-sys-color-primary, #1263b4) 22%,transparent);border-top-color:var(--md-sys-color-primary, #1263b4);border-radius:50%;animation:ptable-refresh-spin .72s linear infinite}.ptable-loading-state__progress{height:6px;margin:28px 12px 16px;overflow:hidden;border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-primary, #1263b4) 18%,transparent)}.ptable-loading-state__progress span{display:block;width:38%;height:100%;border-radius:inherit;background:var(--md-sys-color-primary, #1263b4);animation:ptable-loading-progress 1.1s ease-in-out infinite}.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;font-weight:550;color:var(--pdx-text-shimmer-base, var(--md-sys-color-on-surface-variant, #5a5d67));padding-inline:4px}.ptable-refresh-state__message{font-weight:550;color:var(--pdx-text-shimmer-base, var(--md-sys-color-on-surface-variant, #5a5d67))}@supports (-webkit-background-clip: text) or (background-clip: text){.ptable-loading-state__message,.ptable-refresh-state__message{background-image:var(--pdx-text-shimmer-gradient, linear-gradient(105deg, color-mix(in oklab, var(--md-sys-color-on-surface-variant, #5a5d67) 78%, var(--md-sys-color-on-surface, #0f172a) 22%) 0%, color-mix(in oklab, var(--md-sys-color-on-surface-variant, #5a5d67) 78%, var(--md-sys-color-on-surface, #0f172a) 22%) 26%, color-mix(in oklab, var(--md-sys-color-tertiary, #6366f1) 66%, #a855f7 34%) 40%, var(--pdx-text-shimmer-peak, var(--md-sys-color-on-surface, #ffffff)) 50%, color-mix(in oklab, var(--md-sys-color-primary, #006a6a) 66%, #ec4899 34%) 60%, color-mix(in oklab, var(--md-sys-color-on-surface-variant, #5a5d67) 78%, var(--md-sys-color-on-surface, #0f172a) 22%) 74%, color-mix(in oklab, var(--md-sys-color-on-surface-variant, #5a5d67) 78%, var(--md-sys-color-on-surface, #0f172a) 22%) 100%));background-size:300% 100%;background-position:100% 50%;background-repeat:no-repeat;-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;color:transparent;animation:ptable-text-shimmer-sweep var(--pdx-text-shimmer-duration, 2.6s) linear infinite;will-change:background-position}}@keyframes ptable-text-shimmer-sweep{0%{background-position:100% 50%}to{background-position:0% 50%}}.ptable-loading-state__actions{display:flex;justify-content:flex-end}.ptable-loading-state__hero--static .ptable-loading-state__line,.ptable-loading-state__hero--static .ptable-loading-state__cell{animation:none}@media(prefers-reduced-motion:reduce){.ptable-refresh-state__spinner,.ptable-refresh-state__progress:after,.ptable-refresh-state__skeleton:after,.ptable-loading-state__spinner,.ptable-loading-state__progress span,.ptable-loading-state__line,.ptable-loading-state__cell{animation:none}}@media(prefers-reduced-motion:reduce),(forced-colors:active),print{.ptable-loading-state__message,.ptable-refresh-state__message{animation:none!important;background-image:none!important;-webkit-text-fill-color:currentColor!important;color:var(--md-sys-color-primary, currentColor)!important;will-change:auto}}@media(forced-colors:active){.ptable-loading-state__message,.ptable-refresh-state__message{color:CanvasText!important;-webkit-text-fill-color:CanvasText!important}}.ptable-cancelled-state{display:flex;align-items:center;gap:12px;padding:12px 16px;border:1px solid var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface-container-low);color:var(--md-sys-color-on-surface)}.ptable-cancelled-state__content{display:grid;flex:1;gap:2px}.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{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, var(--praxis-action-control-height, 40px));--pdx-empty-state-action-radius: var(--p-table-empty-action-radius, var(--praxis-action-control-radius, 8px));--pdx-empty-state-transparent-margin: 0}.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%}.ptable-header-actions{display:flex;align-items:center;gap:8px;padding:10px 14px 6px}.ptable-header-title{margin-right:auto;font-size:.95rem;font-weight:600;letter-spacing:-.01em;color:var(--p-table-header-fg, var(--md-sys-color-on-surface))}\n"], dependencies: [{ kind: "component", type: TableCollectionOutcomeComponent, selector: "praxis-table-collection-outcome", inputs: ["result"] }, { kind: "component", type: TableBulkSyncWorkflowComponent, selector: "praxis-table-bulk-sync-workflow", inputs: ["handle", "loading"], outputs: ["closed"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i10.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i10.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }, { kind: "directive", type: i10.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i10.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: i14$1.MatBadge, selector: "[matBadge]", inputs: ["matBadgeColor", "matBadgeOverlap", "matBadgeDisabled", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i3.MatMiniFabButton, selector: "button[mat-mini-fab], a[mat-mini-fab], button[matMiniFab], a[matMiniFab]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i7$1.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.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: i23.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i23.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i23.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i23.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i23.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i23.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i23.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i23.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i23.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i23.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", "preview", "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", "presentation", "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", "contextChange", "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", "focusScope", "showMain", "showActionsGroup", "showEndActions", "showMobileActions", "exportBusy", "exportStatusMessage", "evaluationContext", "activeQuickFilterId", "activeDensity", "activeCrossFilters", "columnVisibilityController"], outputs: ["clearCrossFilter", "clearAllCrossFilters", "toolbarAction", "exportAction", "columnVisibilityToggle", "quickFilterChange", "densityChange"] }, { kind: "component", type: PraxisRichContent, selector: "praxis-rich-content", inputs: ["document", "nodes", "context", "hostCapabilities", "layout", "rootClassName"], outputs: ["nodeAction"] }, { kind: "directive", type: PraxisQuickViewTriggerDirective, selector: "[praxisQuickView]", inputs: ["praxisQuickView", "praxisQuickViewRecord", "praxisQuickViewTriggerMode", "praxisQuickViewAnchorId", "praxisQuickViewSourceId", "praxisQuickViewEndpointKey", "praxisQuickViewApiUrlEntry", "praxisQuickViewQueryContext", "praxisQuickViewHoverOpenDelayMs", "praxisQuickViewHoverCloseDelayMs", "praxisQuickViewStopPropagation"], exportAs: ["praxisQuickView"] }, { 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"] }, { kind: "component", type: PraxisAnalyticalDrawerComponent, selector: "praxis-analytical-drawer", inputs: ["isOpen", "resourcePath", "drawerConfig", "row", "relations", "loadingRelations"], outputs: ["closeDrawer", "tabChange", "relationFetch"] }] });
|
|
44733
44889
|
}
|
|
44734
44890
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisTable, decorators: [{
|
|
44735
44891
|
type: Component,
|
|
@@ -44770,7 +44926,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
44770
44926
|
TableDefaultsProvider,
|
|
44771
44927
|
FilterConfigService,
|
|
44772
44928
|
DataFormattingService
|
|
44773
|
-
], template: "@if (collectionWorkflowOutcome && collectionWorkflowOutcome.resourcePath === resourcePath) {\n<praxis-table-collection-outcome [result]=\"collectionWorkflowOutcome\"></praxis-table-collection-outcome>\n}\n@if (bulkSyncHandle && canShowBulkSyncHandle()) {\n @for (handle of [bulkSyncHandle]; track handle) {\n <praxis-table-bulk-sync-workflow [handle]=\"handle\" [loading]=\"config?.behavior?.loading\"\n (closed)=\"closeBulkSync()\" />\n }\n}\n\n@if (shouldShowEmptyState()) {\n<praxis-empty-state-card\n icon=\"link\"\n [title]=\"getSetupEmptyStateTitle()\"\n [description]=\"getSetupEmptyStateDescription()\"\n [primaryAction]=\"getSetupEmptyStatePrimaryAction()\"\n></praxis-empty-state-card>\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} @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<!-- Shared template for <praxis-filter> (inline toolbar or teleported via <praxis-filter-outlet>) -->\n<ng-template #filterBarTemplate>\n @if (shouldRenderAdvancedFilter()) {\n <praxis-filter\n advancedFilter\n [resourcePath]=\"getAdvancedFilterResourcePath()\"\n [filterId]=\"tableId\"\n [formId]=\"getAdvancedFilterFormId()\"\n [persistenceKey]=\"getAdvancedFilterPersistenceKey()\"\n [disablePersistence]=\"configPersistenceStrategy === 'volatile'\"\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 [tags]=\"config.behavior?.filtering?.advancedFilters?.settings?.tags\"\n [advancedOpenMode]=\"getAdvancedFilterOpenMode()\"\n [presentation]=\"config.behavior?.filtering?.advancedFilters?.settings?.presentation\"\n [advancedClearButtonsEnabled]=\"config.behavior?.filtering?.advancedFilters?.settings?.advancedClearButtonsEnabled\"\n [useInlineSearchableSelectVariant]=\"config.behavior?.filtering?.advancedFilters?.settings?.useInlineSearchableSelectVariant ?? true\"\n [useInlineRangeVariant]=\"config.behavior?.filtering?.advancedFilters?.settings?.useInlineRangeVariant ?? true\"\n [useInlineDateVariant]=\"config.behavior?.filtering?.advancedFilters?.settings?.useInlineDateVariant ?? true\"\n [useInlineDateRangeVariant]=\"config.behavior?.filtering?.advancedFilters?.settings?.useInlineDateRangeVariant ?? true\"\n [useInlineTimeVariant]=\"config.behavior?.filtering?.advancedFilters?.settings?.useInlineTimeVariant ?? true\"\n [useInlineTimeRangeVariant]=\"config.behavior?.filtering?.advancedFilters?.settings?.useInlineTimeRangeVariant ?? true\"\n [useInlineTreeSelectVariant]=\"config.behavior?.filtering?.advancedFilters?.settings?.useInlineTreeSelectVariant ?? true\"\n [changeDebounceMs]=\"config.behavior?.filtering?.advancedFilters?.settings?.changeDebounceMs ?? 300\"\n [i18n]=\"getFilterI18n()\"\n [mode]=\"'filter'\"\n [showAddButton]=\"shouldShowAdvancedFilterAddButton()\"\n [showAdvancedButton]=\"config.toolbar?.filters?.showAdvancedButton !== false\"\n [showFilterSettings]=\"shouldShowAdvancedFilterSettings()\"\n (change)=\"onAdvancedFilterChange($event)\"\n (requestSearch)=\"onAdvancedFilterSubmit($event)\"\n (clear)=\"onAdvancedFilterClear()\"\n ></praxis-filter>\n }\n</ng-template>\n\n@if (shouldRenderDataSurface() && !schemaError && toolbarV2) {\n<div\n class=\"praxis-table-header\"\n [class.edit-mode]=\"isCustomizationAvailable()\"\n [class.stacked]=\"hasTopToolbarStack()\"\n>\n @if (showToolbar && shouldShowToolbarTopPlacement()) {\n <praxis-table-toolbar\n class=\"praxis-toolbar-stack-top\"\n [config]=\"config\"\n [focusScope]=\"getFocusRestoreScope('header')\"\n [backgroundColor]=\"getToolbarActionsBackgroundColor()\"\n [style.--pfx-filter-h]=\"getToolbarLayoutHeightHostStyle()\"\n [evaluationContext]=\"getToolbarEvaluationContext()\"\n [activeQuickFilterId]=\"activeQuickFilterId\"\n [activeDensity]=\"resolveAppearanceDensity()\"\n [activeCrossFilters]=\"activeCrossFilters\"\n [columnVisibilityController]=\"toolbarColumnVisibilityController\"\n [showActionsGroup]=\"shouldShowToolbarActionsTop()\"\n [showMobileActions]=\"shouldShowToolbarActionsTop()\"\n [exportBusy]=\"exportBusy\"\n [exportStatusMessage]=\"exportStatusMessage\"\n (toolbarAction)=\"onToolbarAction($event)\"\n (exportAction)=\"onExportAction($event)\"\n (quickFilterChange)=\"onQuickFilterChange($event)\"\n (densityChange)=\"onDensityChange($event)\"\n (clearCrossFilter)=\"onClearCrossFilter($event)\"\n (clearAllCrossFilters)=\"onClearAllCrossFilters()\"\n >\n @if (shouldRenderAdvancedFilter() && !filterTeleport) {\n <ng-container ngProjectAs=\"[advancedFilter]\" *ngTemplateOutlet=\"filterBarTemplate\" />\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 } @if (isCustomizationAvailable()) {\n <button\n end-actions\n type=\"button\"\n praxisIconButton=\"settings\"\n size=\"compact\"\n class=\"praxis-table-toolbar-action--configuration\"\n data-role=\"table-settings\"\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 } @if (!showToolbar && isCustomizationAvailable()) {\n <div class=\"ptable-header-actions\">\n @if ($any(config)?.title) {\n <span class=\"ptable-header-title\">{{ $any(config).title }}</span>\n }\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\n type=\"button\"\n praxisIconButton=\"settings\"\n size=\"compact\"\n class=\"praxis-table-toolbar-action--configuration\"\n data-role=\"table-settings\"\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 @if (isRemoteMode()) {\n <button\n type=\"button\"\n praxisIconButton=\"link_off\"\n size=\"compact\"\n (click)=\"disconnect()\"\n [attr.aria-label]=\"getDisconnectLabel()\"\n [matTooltip]=\"getDisconnectTooltip()\"\n ></button>\n }\n </div>\n }\n</div>\n} @else { @if (shouldRenderDataSurface() && !schemaError) { @if\n(showToolbar && shouldShowToolbarTopPlacement()) {\n<praxis-table-toolbar\n class=\"praxis-toolbar-stack-top\"\n [config]=\"config\"\n [focusScope]=\"getFocusRestoreScope('header')\"\n [backgroundColor]=\"getToolbarActionsBackgroundColor()\"\n [style.--pfx-filter-h]=\"getToolbarLayoutHeightHostStyle()\"\n [evaluationContext]=\"getToolbarEvaluationContext()\"\n [activeQuickFilterId]=\"activeQuickFilterId\"\n [activeDensity]=\"resolveAppearanceDensity()\"\n [activeCrossFilters]=\"activeCrossFilters\"\n [showActionsGroup]=\"shouldShowToolbarActionsTop()\"\n [showMobileActions]=\"shouldShowToolbarActionsTop()\"\n [exportBusy]=\"exportBusy\"\n [exportStatusMessage]=\"exportStatusMessage\"\n (toolbarAction)=\"onToolbarAction($event)\"\n (exportAction)=\"onExportAction($event)\"\n (quickFilterChange)=\"onQuickFilterChange($event)\"\n (densityChange)=\"onDensityChange($event)\"\n (clearCrossFilter)=\"onClearCrossFilter($event)\"\n (clearAllCrossFilters)=\"onClearAllCrossFilters()\"\n>\n @if (shouldRenderAdvancedFilter() && !filterTeleport) {\n <ng-container ngProjectAs=\"[advancedFilter]\" *ngTemplateOutlet=\"filterBarTemplate\" />\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 } @if (isCustomizationAvailable()) {\n <button\n end-actions\n type=\"button\"\n praxisIconButton=\"settings\"\n size=\"compact\"\n class=\"praxis-table-toolbar-action--configuration\"\n data-role=\"table-settings\"\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} @if (!showToolbar && isCustomizationAvailable()) {\n<div class=\"ptable-header-actions\">\n @if ($any(config)?.title) {\n <span class=\"ptable-header-title\">{{ $any(config).title }}</span>\n }\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\n type=\"button\"\n praxisIconButton=\"settings\"\n size=\"compact\"\n class=\"praxis-table-toolbar-action--configuration\"\n data-role=\"table-settings\"\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</div>\n} } }\n<!-- Operational error state; authoring actions remain capability-gated when toolbar cannot render. -->\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\n mat-flat-button\n color=\"primary\"\n [disabled]=\"isErrorRetryInProgress()\"\n (click)=\"retryTableError()\"\n >\n <mat-icon\n [class.ptable-error__retry-icon--active]=\"isErrorRetryInProgress()\"\n >refresh</mat-icon\n >\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 (canCancelLoad()) {\n <button mat-stroked-button type=\"button\" (click)=\"cancelLoad()\">\n {{ getCancelLoadLabel() }}\n </button>\n }\n @if (isCustomizationAvailable() && schemaError) {\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\n type=\"button\"\n praxisIconButton=\"settings\"\n size=\"compact\"\n class=\"praxis-table-toolbar-action--configuration\"\n data-role=\"table-settings\"\n data-testid=\"table-settings-trigger\"\n (click)=\"openTableSettings()\"\n [attr.aria-label]=\"getTableSettingsLabel()\"\n [matTooltip]=\"getTableSettingsLabel()\"\n matTooltipPosition=\"below\"\n >\n >\n </button>\n }\n </div>\n</div>\n}\n<!-- Paginador superior -->\n@if (shouldRenderDataSurface() && !schemaError && !dataError &&\ngetPaginationEnabled() && (config.behavior?.pagination?.position === 'top' ||\nconfig.behavior?.pagination?.position === 'both')) {\n<mat-paginator\n [length]=\"getPaginationLength()\"\n [pageIndex]=\"pageIndex\"\n [pageSize]=\"pageSize\"\n [pageSizeOptions]=\"getPaginationPageSizeOptions()\"\n [selectConfig]=\"paginatorSelectConfig\"\n [showFirstLastButtons]=\"getPaginationShowFirstLast()\"\n [disabled]=\"isTableDataLoading()\"\n (page)=\"onPageChange($event)\"\n [class.compact]=\"config.behavior?.pagination?.style === 'compact'\"\n>\n</mat-paginator>\n} @if (shouldShowRefreshingState()) {\n<div\n class=\"ptable-refresh-state\"\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n>\n @if (getLoadingIndicatorType() === 'progress') {\n <span class=\"ptable-refresh-state__progress\" aria-hidden=\"true\"></span>\n } @else if (getLoadingIndicatorType() === 'skeleton') {\n <span class=\"ptable-refresh-state__skeleton\" aria-hidden=\"true\"></span>\n } @else {\n <span class=\"ptable-refresh-state__spinner\" aria-hidden=\"true\"></span>\n }\n <span class=\"ptable-refresh-state__message\">{{ getLoadingSurfaceMessage() }}</span>\n @if (canCancelLoad()) {\n <button mat-button type=\"button\" (click)=\"cancelLoad()\">\n {{ getCancelLoadLabel() }}\n </button>\n }\n</div>\n}\n<div\n class=\"ptable-data-surface\"\n [class.ptable-data-surface--loading-overlay]=\"\n shouldShowLoadingSurface() && getLoadingIndicatorPosition() === 'overlay'\n \"\n>\n<div\n #scrollViewport\n class=\"px-scroll-viewport\"\n cdkScrollable\n (scroll)=\"onHorizontalViewportScroll($event)\"\n (keydown)=\"onHorizontalViewportKeydown($event)\"\n [attr.aria-busy]=\"isTableDataLoading() ? 'true' : 'false'\"\n [attr.role]=\"horizontalScroll === 'auto' ? 'region' : null\"\n [attr.aria-label]=\"horizontalScroll === 'auto' ? getScrollViewportAriaLabel() : null\"\n [attr.tabindex]=\"horizontalScroll === 'auto' ? 0 : null\"\n [class.px-scroll-viewport--refreshing]=\"shouldShowRefreshingState()\"\n [class.px-scroll-viewport--loading-replaced]=\"shouldReplaceDataWithLoading()\"\n [class.scroll-auto]=\"horizontalScroll === 'auto'\"\n [class.scroll-wrap]=\"horizontalScroll === 'wrap'\"\n [class.scroll-none]=\"horizontalScroll === 'none'\"\n [class.px-scroll-viewport--overflowing]=\"hasHorizontalOverflow\"\n [class.px-scroll-viewport--can-scroll-left]=\"canScrollHorizontallyLeft\"\n [class.px-scroll-viewport--can-scroll-right]=\"canScrollHorizontallyRight\"\n [class.pfx-mobile-card-mode]=\"isMobileCardModeActive()\"\n [class.table-rounded-bottom]=\"!hasBottomTableStack()\"\n>\n @if (shouldRenderDataSurface() && !schemaError && !dataError) {\n <div\n class=\"praxis-visually-hidden-status\"\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >\n {{ columnReorderStatusMessage }} {{ columnResizeStatusMessage }}\n </div>\n @if (selectionStatusMessage) {\n <div\n class=\"praxis-visually-hidden-status\"\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >\n {{ selectionStatusMessage }}\n </div>\n }\n @if (exportStatusMessage) {\n <div\n class=\"praxis-visually-hidden-status\"\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >\n {{ exportStatusMessage }}\n </div>\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 [attr.aria-label]=\"getTableAriaLabel()\"\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() || isTableDataLoading()\"\n [class.praxis-table-data--refreshing]=\"shouldShowRefreshingState()\"\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 [class.pfx-mobile-card-mode]=\"isMobileCardModeActive()\"\n [style.width]=\"getColumnResizeTableWidthStyle()\"\n >\n @if (isSelectionColumnEnabled()) {\n <ng-container matColumnDef=\"_select\">\n <th mat-header-cell *matHeaderCellDef>\n @if (canSelectAll()) {\n <mat-checkbox\n (change)=\"masterToggle()\"\n [checked]=\"isAllSelected()\"\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\"\n [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(); onSingleSelectionChanged(row)\"\n (change)=\"onSingleSelectionChanged(row)\"\n (keydown.space)=\"onSingleSelectionSpace($event, row)\"\n [checked]=\"selection.isSelected(row)\"\n [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 [aria-label]=\"getRowSelectionAriaLabel(row, i)\"\n ></mat-checkbox>\n }\n </td>\n </ng-container>\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\"\n >Expandir detalhes da linha</span\n >\n </th>\n <td\n mat-cell\n *matCellDef=\"let row; let i = index\"\n class=\"pfx-expansion-col-cell\"\n >\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 [attr.title]=\"!isRowExpandable(row, i) ? getRowExpansionToggleAriaLabel(row, i) : null\"\n (click)=\"onExpansionToggleFromIcon(row, i, $event)\"\n (keydown)=\"onExpansionToggleKeydown($event, row, i)\"\n ></button>\n </td>\n </ng-container>\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 [class.pfx-sticky-boundary-start]=\"isStickyStartBoundary(column)\"\n [class.pfx-sticky-boundary-end]=\"isStickyEndBoundary(column)\"\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 (lostpointercapture)=\"onColumnResizeLostPointerCapture($event)\"\n (dblclick)=\"onColumnResizeHandleDoubleClick($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 [class.pfx-sticky-boundary-start]=\"isStickyStartBoundary(column)\"\n [class.pfx-sticky-boundary-end]=\"isStickyEndBoundary(column)\"\n [matTooltip]=\"getCellTooltip(element, column) || ''\"\n [matTooltipPosition]=\"getCellTooltipPosition(element, column)\"\n [matTooltipDisabled]=\"!getCellTooltip(element, column)\"\n [attr.title]=\"getCellTooltip(element, column) || null\"\n [attr.data-praxis-card-label]=\"column.header || column.field\"\n [style.order]=\"isMobileCardModeActive() ? getMobileCardColumnOrder(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 [praxisQuickView]=\"getEffectiveQuickViewBinding(element, column)\"\n [praxisQuickViewRecord]=\"element\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\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') { @if (shouldRenderBadge(element, column)) {\n <span\n class=\"pfx-badge\"\n [ngClass]=\"getBadgeClasses(element, column)\"\n [praxisQuickView]=\"getEffectiveQuickViewBinding(element, column)\"\n [praxisQuickViewRecord]=\"element\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n >\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 <!-- Link renderer -->\n @case ('link') {\n @let linkQuickView = getEffectiveQuickViewBinding(element, column);\n @let linkHref = getLinkHref(element, column);\n @if (linkQuickView && !linkHref) {\n <button\n type=\"button\"\n class=\"pfx-link pfx-quick-view-trigger--button\"\n [praxisQuickView]=\"linkQuickView\"\n [praxisQuickViewRecord]=\"element\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"hover-and-click\"\n [attr.aria-label]=\"getLinkText(element, column) || column.header\"\n (click)=\"$event.stopPropagation()\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-link__content\"\n [nodes]=\"getLinkRichContentNodes(element, column)\"\n ></praxis-rich-content>\n </button>\n } @else if (linkQuickView && linkHref) {\n <span class=\"pfx-link-with-quick-view\">\n <a\n class=\"pfx-link\"\n [attr.href]=\"linkHref\"\n [attr.target]=\"getLinkTarget(element, column) || null\"\n [attr.rel]=\"getLinkRel(element, column) || null\"\n [praxisQuickView]=\"linkQuickView\"\n [praxisQuickViewRecord]=\"element\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"hover-only\"\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\n ></a>\n <button\n type=\"button\"\n class=\"pfx-quick-view-adjacent-btn\"\n [praxisQuickView]=\"linkQuickView\"\n [praxisQuickViewRecord]=\"element\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"explicit-button\"\n [attr.aria-label]=\"getQuickViewTriggerAriaLabel(getLinkText(element, column), column)\"\n (click)=\"$event.stopPropagation()\"\n >\n <mat-icon class=\"pfx-quick-view-adjacent-btn__icon\" aria-hidden=\"true\">info_outline</mat-icon>\n </button>\n </span>\n } @else {\n <a\n class=\"pfx-link\"\n [attr.href]=\"linkHref || 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\n ></a>\n }\n }\n <!-- Button renderer -->\n @case ('button') { @switch (getButtonVariant(element, column)) { @case\n ('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 } @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 } @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 <!-- Chip renderer -->\n @case ('chip') { @if (shouldRenderChip(element, column)) {\n <span\n class=\"pfx-chip\"\n [ngClass]=\"getChipClasses(element, column)\"\n [praxisQuickView]=\"getEffectiveQuickViewBinding(element, column)\"\n [praxisQuickViewRecord]=\"element\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n >\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 <!-- 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\n class=\"pfx-micro-viz-cell\"\n [innerHTML]=\"getMicroVisualizationHtml(element, column)\"\n ></span>\n }\n <!-- Avatar renderer -->\n @case ('avatar') {\n <span\n 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 [praxisQuickView]=\"getEffectiveQuickViewBinding(element, column)\"\n [praxisQuickViewRecord]=\"element\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n >\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\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(element, 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(element, column); track it.id) {\n <button\n mat-menu-item\n (click)=\"onMenuItemClick(it, element, $event)\"\n [disabled]=\"!it.__visible\"\n >\n <praxis-rich-content\n layout=\"inline\"\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 >\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\n class=\"pfx-cell-compose\"\n [ngClass]=\"getComposeClasses(element, column)\"\n [ngStyle]=\"getComposeGapStyle(element, column)\"\n >\n @for (it of getComposeItems(element, column); track\n trackComposeItem($index, it)) { @switch\n (getItemEffectiveType(element, column, it)) {\n <!-- Reuse helpers by projecting item as faux column -->\n @case ('icon') {\n @let composeIconCol = asItemColumn(column, it);\n <span\n class=\"pfx-icon-renderer\"\n [style.color]=\"getIconColor(element, composeIconCol) || null\"\n [ngStyle]=\"getIconStyle(element, composeIconCol)\"\n [attr.aria-label]=\"getIconAriaLabel(element, composeIconCol) || null\"\n [praxisQuickView]=\"getEffectiveQuickViewBinding(element, composeIconCol)\"\n [praxisQuickViewRecord]=\"element\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n ><praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-icon-renderer__content\"\n [nodes]=\"getIconRichContentNodes(element, composeIconCol)\"\n ></praxis-rich-content\n ></span>\n } @case ('image') {\n <span class=\"pfx-cell-image\"\n ><praxis-rich-content\n rootClassName=\"pfx-cell-image__content\"\n [nodes]=\"getImageRichContentNodes(element, asItemColumn(column, it))\"\n ></praxis-rich-content\n ></span>\n } @case ('badge') {\n @let composeBadgeCol = asItemColumn(column, it);\n @if (shouldRenderBadge(element, composeBadgeCol)) {\n <span\n class=\"pfx-badge\"\n [ngClass]=\"getBadgeClasses(element, composeBadgeCol)\"\n [praxisQuickView]=\"getEffectiveQuickViewBinding(element, composeBadgeCol)\"\n [praxisQuickViewRecord]=\"element\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n ><praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-badge__content\"\n [nodes]=\"getBadgeRichContentNodes(element, composeBadgeCol)\"\n ></praxis-rich-content\n ></span>\n } } @case ('link') {\n @let composeLinkCol = asItemColumn(column, it);\n @let composeLinkQuickView = getEffectiveQuickViewBinding(element, composeLinkCol);\n @let composeLinkHref = getLinkHref(element, composeLinkCol);\n @if (composeLinkQuickView && !composeLinkHref) {\n <button\n type=\"button\"\n class=\"pfx-link pfx-quick-view-trigger--button\"\n [praxisQuickView]=\"composeLinkQuickView\"\n [praxisQuickViewRecord]=\"element\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"hover-and-click\"\n [attr.aria-label]=\"getLinkText(element, composeLinkCol) || column.header\"\n (click)=\"$event.stopPropagation()\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-link__content\"\n [nodes]=\"getLinkRichContentNodes(element, composeLinkCol)\"\n ></praxis-rich-content>\n </button>\n } @else if (composeLinkQuickView && composeLinkHref) {\n <span class=\"pfx-link-with-quick-view\">\n <a\n class=\"pfx-link\"\n [attr.href]=\"composeLinkHref\"\n [attr.target]=\"getLinkTarget(element, composeLinkCol) || null\"\n [attr.rel]=\"getLinkRel(element, composeLinkCol) || null\"\n [praxisQuickView]=\"composeLinkQuickView\"\n [praxisQuickViewRecord]=\"element\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"hover-only\"\n (click)=\"$event.stopPropagation()\"\n ><praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-link__content\"\n [nodes]=\"getLinkRichContentNodes(element, composeLinkCol)\"\n ></praxis-rich-content\n ></a>\n <button\n type=\"button\"\n class=\"pfx-quick-view-adjacent-btn\"\n [praxisQuickView]=\"composeLinkQuickView\"\n [praxisQuickViewRecord]=\"element\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"explicit-button\"\n [attr.aria-label]=\"getQuickViewTriggerAriaLabel(getLinkText(element, composeLinkCol), composeLinkCol)\"\n (click)=\"$event.stopPropagation()\"\n >\n <mat-icon class=\"pfx-quick-view-adjacent-btn__icon\" aria-hidden=\"true\">info_outline</mat-icon>\n </button>\n </span>\n } @else {\n <a\n class=\"pfx-link\"\n [attr.href]=\"composeLinkHref || null\"\n [attr.target]=\"getLinkTarget(element, composeLinkCol) || null\"\n [attr.rel]=\"getLinkRel(element, composeLinkCol) || null\"\n (click)=\"$event.stopPropagation()\"\n ><praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-link__content\"\n [nodes]=\"getLinkRichContentNodes(element, composeLinkCol)\"\n ></praxis-rich-content\n ></a>\n }\n } @case ('button') { @switch (getButtonVariant(element,\n asItemColumn(column, it))) { @case ('outlined') {\n <button\n mat-stroked-button\n [color]=\"getButtonColor(element, asItemColumn(column, it)) || null\"\n [disabled]=\"isButtonDisabled(element, asItemColumn(column, it))\"\n [attr.aria-label]=\"getButtonAriaLabel(element, asItemColumn(column, it)) || getButtonLabel(element, asItemColumn(column, it))\"\n (click)=\"onButtonClick(element, asItemColumn(column, it), $event)\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-button-renderer__content\"\n [nodes]=\"getButtonRichContentNodes(element, asItemColumn(column, it))\"\n ></praxis-rich-content>\n </button>\n } @case ('text') {\n <button\n mat-button\n [color]=\"getButtonColor(element, asItemColumn(column, it)) || null\"\n [disabled]=\"isButtonDisabled(element, asItemColumn(column, it))\"\n [attr.aria-label]=\"getButtonAriaLabel(element, asItemColumn(column, it)) || getButtonLabel(element, asItemColumn(column, it))\"\n (click)=\"onButtonClick(element, asItemColumn(column, it), $event)\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-button-renderer__content\"\n [nodes]=\"getButtonRichContentNodes(element, asItemColumn(column, it))\"\n ></praxis-rich-content>\n </button>\n } @default {\n <button\n mat-flat-button\n [color]=\"getButtonColor(element, asItemColumn(column, it)) || null\"\n [disabled]=\"isButtonDisabled(element, asItemColumn(column, it))\"\n [attr.aria-label]=\"getButtonAriaLabel(element, asItemColumn(column, it)) || getButtonLabel(element, asItemColumn(column, it))\"\n (click)=\"onButtonClick(element, asItemColumn(column, it), $event)\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-button-renderer__content\"\n [nodes]=\"getButtonRichContentNodes(element, asItemColumn(column, it))\"\n ></praxis-rich-content>\n </button>\n } } } @case ('chip') {\n @let composeChipCol = asItemColumn(column, it);\n @if (shouldRenderChip(element, composeChipCol)) {\n <span\n class=\"pfx-chip\"\n [ngClass]=\"getChipClasses(element, composeChipCol)\"\n [praxisQuickView]=\"getEffectiveQuickViewBinding(element, composeChipCol)\"\n [praxisQuickViewRecord]=\"element\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n ><praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-chip__content\"\n [nodes]=\"getChipRichContentNodes(element, composeChipCol)\"\n ></praxis-rich-content\n ></span>\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 } @case ('microVisualization') {\n <span\n class=\"pfx-micro-viz-cell\"\n [innerHTML]=\"getMicroVisualizationHtml(element, asItemColumn(column, it))\"\n ></span>\n } @case ('avatar') {\n @let composeAvatarCol = asItemColumn(column, it);\n <span\n class=\"pfx-avatar-renderer\"\n [ngStyle]=\"getAvatarStyle(element, composeAvatarCol)\"\n [class.shape-rounded]=\"getAvatarShape(element, composeAvatarCol) === 'rounded'\"\n [class.shape-circle]=\"getAvatarShape(element, composeAvatarCol) === 'circle'\"\n [praxisQuickView]=\"getEffectiveQuickViewBinding(element, composeAvatarCol)\"\n [praxisQuickViewRecord]=\"element\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n ><praxis-rich-content\n rootClassName=\"pfx-avatar-renderer__content\"\n [nodes]=\"getAvatarRichContentNodes(element, composeAvatarCol)\"\n ></praxis-rich-content\n ></span>\n } @case ('toggle') {\n <mat-slide-toggle\n [checked]=\"getToggleState(element, asItemColumn(column, it))\"\n [disabled]=\"isToggleDisabled(element, asItemColumn(column, it))\"\n [aria-label]=\"getToggleAriaLabel(element, asItemColumn(column, it)) || 'Alternar'\"\n (change)=\"onToggleChange(element, asItemColumn(column, it), $event)\"\n (click)=\"$event.stopPropagation()\"\n ></mat-slide-toggle>\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(element, asItemColumn(column, it)) || '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 (mi of getMenuItems(element, asItemColumn(column, it)); track\n mi.id) {\n <button\n mat-menu-item\n (click)=\"onMenuItemClick(mi, element, $event)\"\n [disabled]=\"!mi.__visible\"\n >\n <praxis-rich-content\n layout=\"inline\"\n rootClassName=\"pfx-menu-item__content\"\n [nodes]=\"getMenuItemRichContentNodes(mi)\"\n ></praxis-rich-content>\n </button>\n }\n </mat-menu>\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 >\n </praxis-table-rating>\n } @case ('html') {\n <span\n [innerHTML]=\"getSafeHtml(element, asItemColumn(column, it))\"\n ></span>\n }\n <!-- Value item: render base cell text alongside visuals -->\n @case ('value') {\n @let composeValue = getComposeItemValue(element, column, it);\n @if (composeValue !== null && composeValue !== undefined && composeValue !== '') {\n @let composeValueQuickView = getComposeValueQuickViewBinding(element, column, it);\n @if (composeValueQuickView) {\n <button\n type=\"button\"\n class=\"pfx-cell-value pfx-quick-view-trigger--button\"\n [ngClass]=\"getComposeValueClasses(it)\"\n [praxisQuickView]=\"composeValueQuickView\"\n [praxisQuickViewRecord]=\"element\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"hover-and-click\"\n (click)=\"$event.stopPropagation()\"\n >{{ composeValue }}</button>\n } @else {\n <span class=\"pfx-cell-value\" [ngClass]=\"getComposeValueClasses(it)\"\n >{{ composeValue }}</span\n >\n }\n }\n } } }\n </span>\n }\n <!-- Default text rendering -->\n @default {\n @let defaultCellValue = getCellValue(element, column);\n @let defaultCellQuickView = getEffectiveQuickViewBinding(element, column);\n @if (defaultCellQuickView && defaultCellValue !== null && defaultCellValue !== undefined && defaultCellValue !== '') {\n <button\n type=\"button\"\n class=\"pfx-cell-quick-view-btn pfx-quick-view-trigger--button\"\n [praxisQuickView]=\"defaultCellQuickView\"\n [praxisQuickViewRecord]=\"element\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"hover-and-click\"\n (click)=\"$event.stopPropagation()\"\n >{{ defaultCellValue }}</button>\n } @else {\n {{ defaultCellValue }}\n }\n } }\n </div>\n </td>\n </ng-container>\n } @if (config.actions?.row?.enabled) {\n <ng-container\n matColumnDef=\"_actions\"\n [sticky]=\"config.actions?.row?.sticky === true || config.actions?.row?.sticky === 'start'\"\n [stickyEnd]=\"config.actions?.row?.sticky === 'end'\"\n >\n <th\n mat-header-cell\n *matHeaderCellDef\n #actionsHeaderCell\n [style.width]=\"getRowActionsWidthStyle()\"\n class=\"praxis-actions-header\"\n [class.align-start]=\"getActionsHeaderAlign() === 'start'\"\n [class.align-center]=\"getActionsHeaderAlign() === 'center'\"\n [class.align-end]=\"getActionsHeaderAlign() === 'end'\"\n [class.pfx-sticky-boundary-start]=\"isActionsStickyStartBoundary()\"\n [class.pfx-sticky-boundary-end]=\"isActionsStickyEndBoundary()\"\n >\n <div\n class=\"praxis-actions-header__content\"\n [matTooltip]=\"getActionsHeaderTooltip() || ''\"\n [matTooltipDisabled]=\"!getActionsHeaderTooltip()\"\n >\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 [class.pfx-sticky-boundary-start]=\"isActionsStickyStartBoundary()\"\n [class.pfx-sticky-boundary-end]=\"isActionsStickyEndBoundary()\"\n [style.width]=\"getRowActionsWidthStyle()\"\n [attr.data-praxis-card-label]=\"getActionsHeaderLabel()\"\n [style.order]=\"isMobileCardModeActive() ? getMobileCardActionsOrder() : null\"\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' ||\n !config.actions?.row?.display) { @for (a of getInlineRowActions(row);\n track trackAction($index, a)) {\n <span\n class=\"praxis-row-action-anchor\"\n [matTooltip]=\"getActionTooltip(a, row)\"\n [matTooltipDisabled]=\"!getActionTooltip(a, row)\"\n [attr.tabindex]=\"isActionDisabled(a, row) ? 0 : null\"\n [attr.role]=\"isActionDisabled(a, row) ? 'note' : null\"\n [attr.aria-label]=\"isActionDisabled(a, row) ? ((a.label || getActionId(a)) + ': ' + getActionTooltip(a, row)) : null\"\n [attr.title]=\"isActionDisabled(a, row) ? getActionTooltip(a, row) : null\"\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 [busy]=\"isRowActionBusy(a, row)\"\n [disabled]=\"isActionDisabled(a, row) || isRowActionBusy(a, row)\"\n [praxisQuickView]=\"getRowActionQuickViewBinding(a)\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"hover-only\"\n (click)=\"onRowAction(getActionId(a), row, $event, getRowActionRuntimeOptions(a, row))\"\n [attr.aria-label]=\"a.label || getActionId(a)\"\n [attr.aria-description]=\"getActionAriaDescription(a, row)\"\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 <!-- Inline actions: buttons mode (show label + icon) -->\n @if (config.actions?.row?.display === 'buttons') { @for (a of\n getInlineRowActions(row); track trackAction($index, a)) {\n <span\n class=\"praxis-row-action-anchor\"\n [matTooltip]=\"getActionTooltip(a, row)\"\n [matTooltipDisabled]=\"!getActionTooltip(a, row)\"\n [attr.tabindex]=\"isActionDisabled(a, row) ? 0 : null\"\n [attr.role]=\"isActionDisabled(a, row) ? 'note' : null\"\n [attr.aria-label]=\"isActionDisabled(a, row) ? ((a.label || getActionId(a)) + ': ' + getActionTooltip(a, row)) : null\"\n [attr.title]=\"isActionDisabled(a, row) ? getActionTooltip(a, row) : null\"\n matTooltipPosition=\"above\"\n matTooltipClass=\"praxis-tooltip\"\n >\n <button\n mat-flat-button\n class=\"praxis-row-btn\"\n [disabled]=\"isActionDisabled(a, row) || isRowActionBusy(a, row)\"\n [attr.aria-busy]=\"isRowActionBusy(a, row) ? 'true' : null\"\n [praxisQuickView]=\"getRowActionQuickViewBinding(a)\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"hover-only\"\n (click)=\"onRowAction(getActionId(a), row, $event, getRowActionRuntimeOptions(a, row))\"\n [attr.aria-label]=\"a.label || getActionId(a)\"\n [attr.aria-description]=\"getActionAriaDescription(a, row)\"\n [color]=\"a.color || null\"\n >\n <praxis-rich-content\n layout=\"inline\"\n rootClassName=\"praxis-row-action__content\"\n [nodes]=\"getRowActionRichContentNodes(a, isRowActionBusy(a, row))\"\n ></praxis-rich-content>\n </button>\n </span>\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 (mouseenter)=\"onRowOverflowMenuTriggerHover(row)\"\n (focus)=\"onRowOverflowMenuTriggerHover(row)\"\n (click)=\"setActiveRowOverflowMenuTrigger(rowMoreMenuTrigger, $event.currentTarget)\"\n (menuOpened)=\"setActiveRowOverflowMenuTrigger(rowMoreMenuTrigger); onRowOverflowMenuOpened(row)\"\n (menuClosed)=\"onRowOverflowMenuClosed(rowMoreMenuTrigger)\"\n [attr.data-praxis-focus-key]=\"getRowActionFocusOriginKey(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\" panelClass=\"praxis-table-row-menu\">\n @if (hasRowOverflowMenuLoadingState(row) && getOverflowRowActions(row).length === 0) {\n <button mat-menu-item class=\"praxis-row-overflow-menu__item\" disabled>\n <mat-icon>hourglass_empty</mat-icon>\n <praxis-rich-content\n layout=\"inline\"\n rootClassName=\"praxis-row-overflow-menu__label\"\n [nodes]=\"getTableChromeTextRichContentNodes(getRowOverflowMenuLoadingLabel(), 'praxis-row-overflow-menu__label-text')\"\n ></praxis-rich-content>\n </button>\n } @for (a of getOverflowRowActions(row); track trackAction($index,\n a)) {\n <button\n mat-menu-item\n class=\"praxis-row-overflow-menu__item\"\n (click)=\"onOverflowRowAction(getActionId(a), row, $event, getRowActionRuntimeOptions(a, row))\"\n [disabled]=\"isActionDisabled(a, row) || isRowActionBusy(a, row)\"\n [attr.aria-busy]=\"isRowActionBusy(a, row) ? 'true' : null\"\n [attr.aria-label]=\"a.label || getActionId(a)\"\n [attr.aria-description]=\"getActionAriaDescription(a, row)\"\n [attr.title]=\"getActionTooltip(a, row)\"\n [matTooltip]=\"getActionTooltip(a, row)\"\n [matTooltipDisabled]=\"!getActionTooltip(a, row)\"\n matTooltipPosition=\"left\"\n >\n <mat-icon\n [color]=\"a.color || null\"\n [praxisIcon]=\"a.icon\"\n ></mat-icon>\n <praxis-rich-content\n layout=\"inline\"\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 } @if (hasRowOverflowMenuEmptyState(row)) {\n <button mat-menu-item disabled>\n <mat-icon>info</mat-icon>\n <praxis-rich-content\n layout=\"inline\"\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 mat-header-row *matHeaderRowDef=\"displayedColumns\"></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.data-keyboard-row-identity]=\"getKeyboardRowIdentity(row, i)\"\n [attr.tabindex]=\"getRowTabIndex(row, i)\"\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 (focus)=\"onRowFocused(row, i)\"\n (keydown)=\"onRowKeydown($event, 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); @if\n (detailState.status === 'loading') {\n <div\n class=\"pfx-expansion-detail-message\"\n role=\"status\"\n aria-live=\"polite\"\n >\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 { @if (getExpansionDetailLayout(detailState.schema) ===\n 'tabs') { @let detailTabs =\n getExpansionDetailTabs(detailState.schema); @if (detailTabs.length) {\n <div\n class=\"pfx-expansion-detail-tabs\"\n role=\"tablist\"\n aria-label=\"Se\u00C3\u00A7\u00C3\u00B5es do detail\"\n >\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) { @if\n (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\n 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 { @for (childNode of getExpansionDetailNodeChildren(tab);\n track $index) {\n <ng-container\n *ngTemplateOutlet=\"\n expansionDetailNodeTemplate;\n context: { $implicit: childNode, row: row, index: i }\n \"\n ></ng-container>\n } }\n </div>\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 } } @else {\n <div class=\"pfx-expansion-detail-stack\">\n @for (node of getExpansionDetailItems(detailState.schema); track\n $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 <ng-template\n #expansionDetailNodeTemplate\n let-node\n let-row=\"row\"\n let-index=\"index\"\n >\n @if (!isExpansionDetailNodeVisible(node, row, index)) {} @else if (getExpansionDetailRichContentNodes(node, row, index); as\n richNodes) {\n <praxis-rich-content\n class=\"pfx-expansion-node-host\"\n [nodes]=\"richNodes\"\n [context]=\"getExpansionDetailRichContentContext(row, index, node)\"\n ></praxis-rich-content>\n } @else { @switch (getExpansionDetailNodeType(node)) { @case\n ('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); @let\n listEntries = getExpansionDetailListEntries(row, node); @if\n (listItems.length) {\n <ul>\n @for (entry of listEntries; track $index) {\n <li>\n @if (getExpansionDetailListItemRichContentNodes(entry); as\n 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 { {{ formatExpansionDetailListEntry(entry) }} }\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 } @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,\n node); @if (richListEntries.length) {\n <div class=\"pfx-expansion-node-rich-list__items\">\n @for (entry of richListEntries; track $index) {\n <article\n [class]=\"getExpansionDetailRichListItemClassName(node)\"\n >\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,\n row, index, entry, $index); @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 } @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\n $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 } @case ('cardGrid') {\n <section class=\"pfx-expansion-node pfx-expansion-node-card-grid\">\n @if (getExpansionDetailCardGridHeaderNodes(node); as\n cardGridHeaderNodes) { @if (cardGridHeaderNodes.length) {\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-card-grid__header\"\n [nodes]=\"cardGridHeaderNodes\"\n [context]=\"getExpansionDetailRichContentContext(row, index, node)\"\n ></praxis-rich-content>\n } } @let gridCards = getExpansionDetailCardGridCards(node); @if\n (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, node)\"\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, node)\"\n ></praxis-rich-content>\n }\n </section>\n } @case ('richContent') {\n <div\n class=\"pfx-expansion-node-rich-content\"\n (click)=\"$event.stopPropagation()\"\n >\n <praxis-rich-content\n [document]=\"getExpansionDetailRichContentDocument(node)\"\n [layout]=\"getExpansionDetailRichContentLayout(node)\"\n [rootClassName]=\"node?.rootClassName || 'pfx-expansion-node-rich-content__document'\"\n [context]=\"getExpansionDetailRichContentContext(row, index, node)\"\n [hostCapabilities]=\"getExpansionDetailRichContentHostCapabilities(row)\"\n ></praxis-rich-content>\n </div>\n } @case ('richText') {\n <div\n class=\"pfx-expansion-node pfx-expansion-node-richtext\"\n [innerHTML]=\"getExpansionDetailRichText(node)\"\n ></div>\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\n 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 } @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\n 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 } @case ('chartRef') { @if\n (getExpansionDetailInlineRendererView(node, row, index); as\n inlineRenderer) {\n <section\n class=\"pfx-expansion-node pfx-expansion-node-embed pfx-expansion-node-embed--inline pfx-expansion-node-embed--chart\"\n >\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\n 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\n 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 } } @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\n 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 } @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 {\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\">\n{{ 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 } @if (getExpansionDetailEmbedAction(node, row, index); as\n 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 } @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\n 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 } @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,\n row, index); @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 } @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(bottomDetailText('tabOutside'), 'pfx-expansion-node-placeholder__text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n </div>\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 </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 </table>\n }\n\n <!-- Virtual rows path (header preserved above) -->\n @if (shouldRenderDataSurface() && !schemaError && !dataError &&\n 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 [attr.aria-label]=\"getTableAriaLabel()\"\n [ngClass]=\"getTableElevationClassName()\"\n [class.table-stack-top]=\"hasTopToolbarStack()\"\n [class.table-rounded-bottom]=\"!hasBottomTableStack()\"\n [style.width]=\"getVirtualTableWidthStyle()\"\n >\n <tbody>\n <tr\n 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.data-keyboard-row-identity]=\"getKeyboardRowIdentity(row, i)\"\n [attr.tabindex]=\"getRowTabIndex(row, i)\"\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 (focus)=\"onRowFocused(row, i)\"\n (keydown)=\"onRowKeydown($event, row, i)\"\n >\n <!-- Selection column -->\n @if (isSelectionColumnEnabled()) {\n <td class=\"mat-mdc-cell\">\n <mat-checkbox\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleRow(row)\"\n [checked]=\"selection.isSelected(row)\"\n [aria-label]=\"getRowSelectionAriaLabel(row, i)\"\n >\n </mat-checkbox>\n </td>\n }\n <!-- Data columns -->\n @for (column of visibleColumns; track column.field) {\n <td\n 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 >\n <div\n class=\"pfx-cell-content\"\n [ngClass]=\"getCellContentClasses(row, column)\"\n [ngStyle]=\"getCellContentNgStyle(row, column)\"\n >\n @switch (getEffectiveRendererType(row, column)) { @case ('icon') {\n <span\n 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 [praxisQuickView]=\"getEffectiveQuickViewBinding(row, column)\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n >\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 } @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 } @case ('badge') { @if (shouldRenderBadge(row, column)) {\n <span\n class=\"pfx-badge\"\n [ngClass]=\"getBadgeClasses(row, column)\"\n [praxisQuickView]=\"getEffectiveQuickViewBinding(row, column)\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-badge__content\"\n [nodes]=\"getBadgeRichContentNodes(row, column)\"\n ></praxis-rich-content>\n </span>\n } } @case ('chip') { @if (shouldRenderChip(row, column)) {\n <span\n class=\"pfx-chip\"\n [ngClass]=\"getChipClasses(row, column)\"\n [praxisQuickView]=\"getEffectiveQuickViewBinding(row, column)\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-chip__content\"\n [nodes]=\"getChipRichContentNodes(row, column)\"\n ></praxis-rich-content>\n </span>\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 } @case ('microVisualization') {\n <span\n class=\"pfx-micro-viz-cell\"\n [innerHTML]=\"getMicroVisualizationHtml(row, column)\"\n ></span>\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 } @case ('link') {\n @let vLinkQuickView = getEffectiveQuickViewBinding(row, column);\n @let vLinkHref = getLinkHref(row, column);\n @if (vLinkQuickView && !vLinkHref) {\n <button\n type=\"button\"\n class=\"pfx-link pfx-quick-view-trigger--button\"\n [praxisQuickView]=\"vLinkQuickView\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"hover-and-click\"\n [attr.aria-label]=\"getLinkText(row, column) || column.header\"\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 </button>\n } @else if (vLinkQuickView && vLinkHref) {\n <span class=\"pfx-link-with-quick-view\">\n <a\n class=\"pfx-link\"\n [attr.href]=\"vLinkHref\"\n [attr.target]=\"getLinkTarget(row, column) || null\"\n [attr.rel]=\"getLinkRel(row, column) || null\"\n [praxisQuickView]=\"vLinkQuickView\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"hover-only\"\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 <button\n type=\"button\"\n class=\"pfx-quick-view-adjacent-btn\"\n [praxisQuickView]=\"vLinkQuickView\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"explicit-button\"\n [attr.aria-label]=\"getQuickViewTriggerAriaLabel(getLinkText(row, column), column)\"\n (click)=\"$event.stopPropagation()\"\n >\n <mat-icon class=\"pfx-quick-view-adjacent-btn__icon\" aria-hidden=\"true\">info_outline</mat-icon>\n </button>\n </span>\n } @else {\n <a\n class=\"pfx-link\"\n [attr.href]=\"vLinkHref || 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') { @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 } @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 } @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 } } } @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 layout=\"inline\"\n rootClassName=\"pfx-menu-item__content\"\n [nodes]=\"getMenuItemRichContentNodes(it)\"\n ></praxis-rich-content>\n </button>\n }\n </mat-menu>\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 } @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 } @case ('html') {\n <span [innerHTML]=\"getSafeHtml(row, column)\"></span>\n } @case ('compose') {\n <span\n class=\"pfx-cell-compose\"\n [ngClass]=\"getComposeClasses(row, column)\"\n [ngStyle]=\"getComposeGapStyle(row, column)\"\n >\n @for (it of getComposeItems(row, column); track\n trackComposeItem($index, it)) { @switch\n (getItemEffectiveType(row, column, it)) { @case ('icon') {\n @let vComposeIconCol = asItemColumn(column, it);\n <span\n class=\"pfx-icon-renderer\"\n [style.color]=\"getIconColor(row, vComposeIconCol) || null\"\n [ngStyle]=\"getIconStyle(row, vComposeIconCol)\"\n [attr.aria-label]=\"getIconAriaLabel(row, vComposeIconCol) || null\"\n [praxisQuickView]=\"getEffectiveQuickViewBinding(row, vComposeIconCol)\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n ><praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-icon-renderer__content\"\n [nodes]=\"getIconRichContentNodes(row, vComposeIconCol)\"\n ></praxis-rich-content\n ></span>\n } @case ('image') {\n <span class=\"pfx-cell-image\"\n ><praxis-rich-content\n rootClassName=\"pfx-cell-image__content\"\n [nodes]=\"getImageRichContentNodes(row, asItemColumn(column, it))\"\n ></praxis-rich-content\n ></span>\n } @case ('badge') {\n @let vComposeBadgeCol = asItemColumn(column, it);\n @if (shouldRenderBadge(row, vComposeBadgeCol)) {\n <span\n class=\"pfx-badge\"\n [ngClass]=\"getBadgeClasses(row, vComposeBadgeCol)\"\n [praxisQuickView]=\"getEffectiveQuickViewBinding(row, vComposeBadgeCol)\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n ><praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-badge__content\"\n [nodes]=\"getBadgeRichContentNodes(row, vComposeBadgeCol)\"\n ></praxis-rich-content\n ></span>\n } } @case ('link') {\n @let vComposeLinkCol = asItemColumn(column, it);\n @let vComposeLinkQuickView = getEffectiveQuickViewBinding(row, vComposeLinkCol);\n @let vComposeLinkHref = getLinkHref(row, vComposeLinkCol);\n @if (vComposeLinkQuickView && !vComposeLinkHref) {\n <button\n type=\"button\"\n class=\"pfx-link pfx-quick-view-trigger--button\"\n [praxisQuickView]=\"vComposeLinkQuickView\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"hover-and-click\"\n [attr.aria-label]=\"getLinkText(row, vComposeLinkCol) || column.header\"\n (click)=\"$event.stopPropagation()\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-link__content\"\n [nodes]=\"getLinkRichContentNodes(row, vComposeLinkCol)\"\n ></praxis-rich-content>\n </button>\n } @else if (vComposeLinkQuickView && vComposeLinkHref) {\n <span class=\"pfx-link-with-quick-view\">\n <a\n class=\"pfx-link\"\n [attr.href]=\"vComposeLinkHref\"\n [attr.target]=\"getLinkTarget(row, vComposeLinkCol) || null\"\n [attr.rel]=\"getLinkRel(row, vComposeLinkCol) || null\"\n [praxisQuickView]=\"vComposeLinkQuickView\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"hover-only\"\n (click)=\"$event.stopPropagation()\"\n ><praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-link__content\"\n [nodes]=\"getLinkRichContentNodes(row, vComposeLinkCol)\"\n ></praxis-rich-content\n ></a>\n <button\n type=\"button\"\n class=\"pfx-quick-view-adjacent-btn\"\n [praxisQuickView]=\"vComposeLinkQuickView\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"explicit-button\"\n [attr.aria-label]=\"getQuickViewTriggerAriaLabel(getLinkText(row, vComposeLinkCol), vComposeLinkCol)\"\n (click)=\"$event.stopPropagation()\"\n >\n <mat-icon class=\"pfx-quick-view-adjacent-btn__icon\" aria-hidden=\"true\">info_outline</mat-icon>\n </button>\n </span>\n } @else {\n <a\n class=\"pfx-link\"\n [attr.href]=\"vComposeLinkHref || null\"\n [attr.target]=\"getLinkTarget(row, vComposeLinkCol) || null\"\n [attr.rel]=\"getLinkRel(row, vComposeLinkCol) || null\"\n (click)=\"$event.stopPropagation()\"\n ><praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-link__content\"\n [nodes]=\"getLinkRichContentNodes(row, vComposeLinkCol)\"\n ></praxis-rich-content\n ></a>\n }\n } @case ('button') { @switch (getButtonVariant(row,\n asItemColumn(column, it))) { @case ('outlined') {\n <button\n mat-stroked-button\n [color]=\"getButtonColor(row, asItemColumn(column, it)) || null\"\n [disabled]=\"isButtonDisabled(row, asItemColumn(column, it))\"\n [attr.aria-label]=\"getButtonAriaLabel(row, asItemColumn(column, it)) || getButtonLabel(row, asItemColumn(column, it))\"\n (click)=\"onButtonClick(row, asItemColumn(column, it), $event)\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-button-renderer__content\"\n [nodes]=\"getButtonRichContentNodes(row, asItemColumn(column, it))\"\n ></praxis-rich-content>\n </button>\n } @case ('text') {\n <button\n mat-button\n [color]=\"getButtonColor(row, asItemColumn(column, it)) || null\"\n [disabled]=\"isButtonDisabled(row, asItemColumn(column, it))\"\n [attr.aria-label]=\"getButtonAriaLabel(row, asItemColumn(column, it)) || getButtonLabel(row, asItemColumn(column, it))\"\n (click)=\"onButtonClick(row, asItemColumn(column, it), $event)\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-button-renderer__content\"\n [nodes]=\"getButtonRichContentNodes(row, asItemColumn(column, it))\"\n ></praxis-rich-content>\n </button>\n } @default {\n <button\n mat-flat-button\n [color]=\"getButtonColor(row, asItemColumn(column, it)) || null\"\n [disabled]=\"isButtonDisabled(row, asItemColumn(column, it))\"\n [attr.aria-label]=\"getButtonAriaLabel(row, asItemColumn(column, it)) || getButtonLabel(row, asItemColumn(column, it))\"\n (click)=\"onButtonClick(row, asItemColumn(column, it), $event)\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-button-renderer__content\"\n [nodes]=\"getButtonRichContentNodes(row, asItemColumn(column, it))\"\n ></praxis-rich-content>\n </button>\n } } } @case ('chip') {\n @let vComposeChipCol = asItemColumn(column, it);\n @if (shouldRenderChip(row, vComposeChipCol)) {\n <span\n class=\"pfx-chip\"\n [ngClass]=\"getChipClasses(row, vComposeChipCol)\"\n [praxisQuickView]=\"getEffectiveQuickViewBinding(row, vComposeChipCol)\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n ><praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-chip__content\"\n [nodes]=\"getChipRichContentNodes(row, vComposeChipCol)\"\n ></praxis-rich-content\n ></span>\n } } @case ('progress') {\n <div class=\"pfx-progress\">\n <praxis-rich-content\n rootClassName=\"pfx-progress__content\"\n [context]=\"getProgressRichContentContext(row, asItemColumn(column, it))\"\n [nodes]=\"getProgressRichContentNodes(row, asItemColumn(column, it))\"\n ></praxis-rich-content>\n </div>\n } @case ('microVisualization') {\n <span\n class=\"pfx-micro-viz-cell\"\n [innerHTML]=\"getMicroVisualizationHtml(row, asItemColumn(column, it))\"\n ></span>\n } @case ('avatar') {\n <span\n class=\"pfx-avatar-renderer\"\n [ngStyle]=\"getAvatarStyle(row, asItemColumn(column, it))\"\n [class.shape-rounded]=\"getAvatarShape(row, asItemColumn(column, it)) === 'rounded'\"\n [class.shape-circle]=\"getAvatarShape(row, asItemColumn(column, it)) === 'circle'\"\n ><praxis-rich-content\n rootClassName=\"pfx-avatar-renderer__content\"\n [nodes]=\"getAvatarRichContentNodes(row, asItemColumn(column, it))\"\n ></praxis-rich-content\n ></span>\n } @case ('toggle') {\n <mat-slide-toggle\n [checked]=\"getToggleState(row, asItemColumn(column, it))\"\n [disabled]=\"isToggleDisabled(row, asItemColumn(column, it))\"\n [aria-label]=\"getToggleAriaLabel(row, asItemColumn(column, it)) || 'Alternar'\"\n (change)=\"onToggleChange(row, asItemColumn(column, it), $event)\"\n (click)=\"$event.stopPropagation()\"\n ></mat-slide-toggle>\n } @case ('menu') {\n <button\n type=\"button\"\n praxisIconButton=\"more_vert\"\n presentation=\"projected\"\n size=\"compact\"\n [matMenuTriggerFor]=\"composeMenuRef\"\n (click)=\"$event.stopPropagation()\"\n [attr.aria-label]=\"getMenuAriaLabel(row, asItemColumn(column, it)) || 'Menu'\"\n >\n <praxis-rich-content\n rootClassName=\"pfx-menu-trigger__content\"\n [nodes]=\"getMenuTriggerRichContentNodes()\"\n ></praxis-rich-content>\n </button>\n <mat-menu #composeMenuRef=\"matMenu\">\n @for (mi of getMenuItems(row, asItemColumn(column, it)); track\n mi.id) {\n <button\n mat-menu-item\n (click)=\"onMenuItemClick(mi, row, $event)\"\n [disabled]=\"!mi.__visible\"\n >\n <praxis-rich-content\n layout=\"inline\"\n rootClassName=\"pfx-menu-item__content\"\n [nodes]=\"getMenuItemRichContentNodes(mi)\"\n ></praxis-rich-content>\n </button>\n }\n </mat-menu>\n } @case ('rating') {\n <praxis-table-rating\n class=\"pfx-rating-cell\"\n [itemsCount]=\"getRatingMax(row, asItemColumn(column, it))\"\n [value]=\"getRatingValue(row, asItemColumn(column, it))\"\n [size]=\"getRatingSize(row, asItemColumn(column, it))\"\n [ratingColor]=\"getRatingColor(row, asItemColumn(column, it))\"\n [outlineColor]=\"getRatingOutlineColor(row, asItemColumn(column, it))\"\n [ariaLabel]=\"getRatingAriaLabel(row, asItemColumn(column, it)) || column.header\"\n ></praxis-table-rating>\n } @case ('html') {\n <span\n [innerHTML]=\"getSafeHtml(row, asItemColumn(column, it))\"\n ></span>\n } @case ('value') {\n @let composeValue = getComposeItemValue(row, column, it);\n @if (composeValue !== null && composeValue !== undefined && composeValue !== '') {\n @let vComposeValueQuickView = getComposeValueQuickViewBinding(row, column, it);\n @if (vComposeValueQuickView) {\n <button\n type=\"button\"\n class=\"pfx-cell-value pfx-quick-view-trigger--button\"\n [ngClass]=\"getComposeValueClasses(it)\"\n [praxisQuickView]=\"vComposeValueQuickView\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"hover-and-click\"\n (click)=\"$event.stopPropagation()\"\n >{{ composeValue }}</button>\n } @else {\n <span\n class=\"pfx-cell-value\"\n [ngClass]=\"getComposeValueClasses(it)\"\n >{{ composeValue }}</span\n >\n }\n }\n } } }\n </span>\n } @default {\n @let vDefaultCellQuickView = getEffectiveQuickViewBinding(row, column);\n @if (vDefaultCellQuickView) {\n <button\n type=\"button\"\n class=\"pfx-cell-quick-view-btn pfx-quick-view-trigger--button\"\n [praxisQuickView]=\"vDefaultCellQuickView\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"hover-and-click\"\n (click)=\"$event.stopPropagation()\"\n >{{ getCellValue(row, column) }}</button>\n } @else {\n {{ getCellValue(row, column) }}\n }\n } }\n </div>\n </td>\n }\n\n <!-- Actions column -->\n @if (config.actions?.row?.enabled) {\n <td\n class=\"mat-mdc-cell 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 @if (config.actions?.row?.display === 'icons' ||\n !config.actions?.row?.display) { @for (a of\n getInlineRowActions(row); track trackAction($index, a)) {\n <span\n class=\"praxis-row-action-anchor\"\n [matTooltip]=\"getActionTooltip(a, row)\"\n [matTooltipDisabled]=\"!getActionTooltip(a, row)\"\n [attr.tabindex]=\"isActionDisabled(a, row) ? 0 : null\"\n [attr.role]=\"isActionDisabled(a, row) ? 'note' : null\"\n [attr.aria-label]=\"isActionDisabled(a, row) ? ((a.label || getActionId(a)) + ': ' + getActionTooltip(a, row)) : null\"\n [attr.title]=\"isActionDisabled(a, row) ? getActionTooltip(a, row) : null\"\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 [busy]=\"isRowActionBusy(a, row)\"\n [disabled]=\"isActionDisabled(a, row) || isRowActionBusy(a, row)\"\n [praxisQuickView]=\"getRowActionQuickViewBinding(a)\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"hover-only\"\n (click)=\"onRowAction(getActionId(a), row, $event, getRowActionRuntimeOptions(a, row))\"\n [attr.aria-label]=\"a.label || getActionId(a)\"\n [attr.aria-description]=\"getActionAriaDescription(a, row)\"\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 } } @if (config.actions?.row?.display === 'buttons') { @for (a of\n getInlineRowActions(row); track trackAction($index, a)) {\n <span\n class=\"praxis-row-action-anchor\"\n [matTooltip]=\"getActionTooltip(a, row)\"\n [matTooltipDisabled]=\"!getActionTooltip(a, row)\"\n [attr.tabindex]=\"isActionDisabled(a, row) ? 0 : null\"\n [attr.role]=\"isActionDisabled(a, row) ? 'note' : null\"\n [attr.aria-label]=\"isActionDisabled(a, row) ? ((a.label || getActionId(a)) + ': ' + getActionTooltip(a, row)) : null\"\n [attr.title]=\"isActionDisabled(a, row) ? getActionTooltip(a, row) : null\"\n matTooltipPosition=\"above\"\n matTooltipClass=\"praxis-tooltip\"\n >\n <button\n mat-flat-button\n class=\"praxis-row-btn\"\n [disabled]=\"isActionDisabled(a, row) || isRowActionBusy(a, row)\"\n [attr.aria-busy]=\"isRowActionBusy(a, row) ? 'true' : null\"\n [praxisQuickView]=\"getRowActionQuickViewBinding(a)\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"hover-only\"\n (click)=\"onRowAction(getActionId(a), row, $event, getRowActionRuntimeOptions(a, row))\"\n [attr.aria-label]=\"a.label || getActionId(a)\"\n [attr.aria-description]=\"getActionAriaDescription(a, row)\"\n [color]=\"a.color || null\"\n >\n <praxis-rich-content\n layout=\"inline\"\n rootClassName=\"praxis-row-action__content\"\n [nodes]=\"getRowActionRichContentNodes(a, isRowActionBusy(a, row))\"\n ></praxis-rich-content>\n </button>\n </span>\n } } @if (hasOverflowRowActions(row)) {\n <button\n #rowMoreMenuTriggerV=\"matMenuTrigger\"\n type=\"button\"\n [praxisIconButton]=\"getRowMenuIcon()\"\n size=\"compact\"\n class=\"praxis-icon-btn praxis-more-btn\"\n [matMenuTriggerFor]=\"rowMoreMenuV\"\n (mouseenter)=\"onRowOverflowMenuTriggerHover(row)\"\n (focus)=\"onRowOverflowMenuTriggerHover(row)\"\n (click)=\"setActiveRowOverflowMenuTrigger(rowMoreMenuTriggerV, $event.currentTarget)\"\n (menuOpened)=\"setActiveRowOverflowMenuTrigger(rowMoreMenuTriggerV); onRowOverflowMenuOpened(row)\"\n (menuClosed)=\"onRowOverflowMenuClosed(rowMoreMenuTriggerV)\"\n [attr.data-praxis-focus-key]=\"getRowActionFocusOriginKey(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 #rowMoreMenuV=\"matMenu\" xPosition=\"before\" panelClass=\"praxis-table-row-menu\">\n @if (hasRowOverflowMenuLoadingState(row) && getOverflowRowActions(row).length === 0) {\n <button mat-menu-item class=\"praxis-row-overflow-menu__item\" disabled>\n <mat-icon>hourglass_empty</mat-icon>\n <praxis-rich-content\n layout=\"inline\"\n rootClassName=\"praxis-row-overflow-menu__label\"\n [nodes]=\"getTableChromeTextRichContentNodes(getRowOverflowMenuLoadingLabel(), 'praxis-row-overflow-menu__label-text')\"\n ></praxis-rich-content>\n </button>\n } @for (a of getOverflowRowActions(row); track\n trackAction($index, a)) {\n <button\n mat-menu-item\n class=\"praxis-row-overflow-menu__item\"\n (click)=\"onOverflowRowAction(getActionId(a), row, $event, getRowActionRuntimeOptions(a, row))\"\n [disabled]=\"isActionDisabled(a, row) || isRowActionBusy(a, row)\"\n [attr.aria-busy]=\"isRowActionBusy(a, row) ? 'true' : null\"\n [attr.aria-label]=\"a.label || getActionId(a)\"\n [attr.aria-description]=\"getActionAriaDescription(a, row)\"\n [attr.title]=\"getActionTooltip(a, row)\"\n [matTooltip]=\"getActionTooltip(a, row)\"\n [matTooltipDisabled]=\"!getActionTooltip(a, row)\"\n matTooltipPosition=\"left\"\n >\n <mat-icon\n [color]=\"a.color || null\"\n [praxisIcon]=\"a.icon\"\n ></mat-icon>\n <praxis-rich-content\n layout=\"inline\"\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 } @if (hasRowOverflowMenuEmptyState(row)) {\n <button mat-menu-item disabled>\n <mat-icon>info</mat-icon>\n <praxis-rich-content\n layout=\"inline\"\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</div>\n@if (shouldShowLoadingSurface()) {\n<div\n class=\"ptable-loading-state\"\n [class.ptable-loading-state--overlay]=\"getLoadingIndicatorPosition() === 'overlay'\"\n role=\"status\"\n aria-live=\"polite\"\n>\n @if (getLoadingIndicatorType() === 'skeleton') {\n <div\n class=\"ptable-loading-state__hero\"\n [class.ptable-loading-state__hero--static]=\"!isLoadingSkeletonAnimated()\"\n aria-hidden=\"true\"\n >\n <span\n class=\"ptable-loading-state__line ptable-loading-state__line--wide\"\n ></span>\n <span\n class=\"ptable-loading-state__line ptable-loading-state__line--short\"\n ></span>\n <div class=\"ptable-loading-state__rows\">\n @for (placeholder of getLoadingSkeletonRows(); track placeholder) {\n <div class=\"ptable-loading-state__row\">\n <span\n class=\"ptable-loading-state__cell ptable-loading-state__cell--short\"\n ></span>\n <span class=\"ptable-loading-state__cell\"></span>\n <span\n class=\"ptable-loading-state__cell ptable-loading-state__cell--wide\"\n ></span>\n </div>\n }\n </div>\n </div>\n } @else if (getLoadingIndicatorType() === 'progress') {\n <div class=\"ptable-loading-state__progress\" aria-hidden=\"true\">\n <span></span>\n </div>\n } @else {\n <span class=\"ptable-loading-state__spinner\" aria-hidden=\"true\"></span>\n }\n <div class=\"ptable-loading-state__message\">\n {{ getLoadingSurfaceMessage() }}\n </div>\n @if (canCancelLoad()) {\n <div class=\"ptable-loading-state__actions\">\n <button mat-stroked-button type=\"button\" (click)=\"cancelLoad()\">\n {{ getCancelLoadLabel() }}\n </button>\n </div>\n }\n</div>\n}\n</div>\n@if (shouldShowCancelledState()) {\n<div class=\"ptable-cancelled-state\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">\n <mat-icon aria-hidden=\"true\">pause_circle</mat-icon>\n <div class=\"ptable-cancelled-state__content\">\n <strong>{{ getCancelledLoadTitle() }}</strong>\n <span>{{ getCancelledLoadMessage() }}</span>\n </div>\n <button mat-stroked-button type=\"button\" (click)=\"retryCancelledLoad()\">\n <mat-icon aria-hidden=\"true\">refresh</mat-icon>\n {{ getTableErrorRetryLabel() }}\n </button>\n</div>\n} @if (shouldShowNoDataState()) {\n<div\n class=\"ptable-no-data-state\"\n [style.--p-table-empty-action-size]=\"getNoDataStateActionSize()\"\n [style.--p-table-empty-action-radius]=\"getNoDataStateActionRadius()\"\n>\n <span\n class=\"ptable-no-data-state__announcement\"\n role=\"status\"\n aria-live=\"polite\"\n >\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} @if ( shouldRenderDataSurface() && !schemaError && !dataError &&\nshouldRenderFloatingBulkActions() && getFloatingBulkActions().length &&\n!shouldHideFloatingBulkActions() ) {\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<ng-template #bottomDetailSurface>\n @let bottom = getBottomDetailState();\n @if (shouldRenderBottomDetailSurface(bottom)) {\n <section class=\"ptable-bottom-detail\" data-testid=\"table-bottom-detail\"\n [class.ptable-bottom-detail--dynamic]=\"isBottomDetailDynamicHeight()\"\n [class.ptable-bottom-detail--before-controls]=\"isBottomDetailBeforeControls()\"\n role=\"region\" [attr.aria-label]=\"bottom.title\" [attr.aria-busy]=\"bottom.status === 'loading'\">\n <header class=\"ptable-bottom-detail__header\">\n <span class=\"ptable-bottom-detail__identity\">\n <mat-icon aria-hidden=\"true\">dock_to_bottom</mat-icon>\n <span class=\"ptable-bottom-detail__heading\">\n <span class=\"ptable-bottom-detail__eyebrow\">{{ bottomDetailText('panelLabel') }}</span>\n <strong>{{ bottom.title }}</strong>\n </span>\n </span>\n <button type=\"button\" mat-button data-testid=\"table-bottom-detail-toggle\"\n [attr.aria-expanded]=\"!bottomDetailCollapsed()\" [attr.aria-controls]=\"tableId + '-bottom-detail-body'\"\n (click)=\"toggleBottomDetail()\">\n <mat-icon aria-hidden=\"true\">{{ bottomDetailCollapsed() ? 'expand_more' : 'expand_less' }}</mat-icon>\n {{ bottomDetailText(bottomDetailCollapsed() ? 'expand' : 'collapse') }}\n </button>\n </header>\n @if (!bottomDetailCollapsed()) {\n <div class=\"ptable-bottom-detail__body\" data-testid=\"table-bottom-detail-body\"\n [attr.id]=\"tableId + '-bottom-detail-body'\" [style.height.px]=\"getBottomDetailBodyHeight()\"\n role=\"group\" [attr.aria-label]=\"bottom.title\" tabindex=\"0\">\n @if (!bottom.detailState) {\n <span data-testid=\"table-bottom-detail-status\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">\n {{ bottom.message }}\n </span>\n }\n @if (bottom.detailState && bottom.row) {\n <ng-container *ngTemplateOutlet=\"tableDetailBodyTemplate;\n context: { detailState: bottom.detailState, row: bottom.row, index: bottom.index }\"\n ></ng-container>\n @if (bottom.status === 'blocked' || bottom.status === 'error') {\n <button type=\"button\" mat-button (click)=\"retryBottomDetail()\">{{ bottomDetailText('retry') }}</button>\n }\n }\n </div>\n }\n </section>\n }\n</ng-template>\n@if (isBottomDetailBeforeControls()) {\n <ng-container *ngTemplateOutlet=\"bottomDetailSurface\"></ng-container>\n}\n<!-- Barra de a\u00E7\u00F5es no rodap\u00E9 (opcional) -->\n@if (shouldRenderDataSurface() && !schemaError && showToolbar && shouldRenderFooterToolbar()) {\n <praxis-table-toolbar\n [config]=\"config\"\n [focusScope]=\"getFocusRestoreScope('footer')\"\n [backgroundColor]=\"getToolbarActionsBackgroundColor()\"\n [style.--pfx-filter-h]=\"getToolbarLayoutHeightHostStyle()\"\n [class.footer-flat]=\"hasSurfaceAfterFooterToolbar()\"\n class=\"praxis-toolbar-footer\"\n placement=\"footer\"\n [showMain]=\"shouldShowFooterToolbarMain()\"\n [showEndActions]=\"shouldShowFooterToolbarEndActions()\"\n [showActionsGroup]=\"shouldShowToolbarActionsBottom()\"\n [showMobileActions]=\"shouldShowToolbarActionsBottom()\"\n [evaluationContext]=\"getToolbarEvaluationContext()\"\n [activeQuickFilterId]=\"activeQuickFilterId\"\n [activeDensity]=\"resolveAppearanceDensity()\"\n [activeCrossFilters]=\"activeCrossFilters\"\n [columnVisibilityController]=\"toolbarColumnVisibilityController\"\n [exportBusy]=\"exportBusy\"\n [exportStatusMessage]=\"exportStatusMessage\"\n (toolbarAction)=\"onToolbarAction($event)\"\n (exportAction)=\"onExportAction($event)\"\n (quickFilterChange)=\"onQuickFilterChange($event)\"\n (densityChange)=\"onDensityChange($event)\"\n (clearCrossFilter)=\"onClearCrossFilter($event)\"\n (clearAllCrossFilters)=\"onClearAllCrossFilters()\"\n >\n @if (shouldShowFooterToolbarMain() && shouldRenderAdvancedFilter() && !filterTeleport) {\n <ng-container ngProjectAs=\"[advancedFilter]\" *ngTemplateOutlet=\"filterBarTemplate\" />\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 [pageIndex]=\"pageIndex\"\n [pageSize]=\"pageSize\"\n [pageSizeOptions]=\"getPaginationPageSizeOptions()\"\n [selectConfig]=\"paginatorSelectConfig\"\n [showFirstLastButtons]=\"getPaginationShowFirstLast()\"\n [disabled]=\"isTableDataLoading()\"\n (page)=\"onPageChange($event)\"\n [class.compact]=\"config.behavior?.pagination?.style === 'compact'\"\n [class.footer-stack]=\"shouldShowToolbarActionsBottom()\"\n [class.detail-stack]=\"hasBottomDetailAfterPaginator()\"\n >\n </mat-paginator>\n}\n@if (isBottomDetailAfterControls()) {\n <ng-container *ngTemplateOutlet=\"bottomDetailSurface\"></ng-container>\n}\n\n<!-- One renderer shared by row and contextual detail presentations. -->\n<ng-template #tableDetailBodyTemplate let-detailState=\"detailState\" let-row=\"row\" let-i=\"index\">\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(bottomDetailText('loading'), '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 || bottomDetailText('blocked'), '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\" [attr.aria-label]=\"bottomDetailText('sections')\">\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(bottomDetailText('tabsEmpty'), '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>\n <ng-template #expansionDetailNodeTemplate let-node let-row=\"row\" let-index=\"index\">\n @if (!isExpansionDetailNodeVisible(node, row, index)) {} @else 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, node)\"\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(getExpansionDetailListEmptyText(node), '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, bottomDetailText('collectionTitle')), '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, bottomDetailText('cardTitle')), '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 ('richContent') {\n <div\n class=\"pfx-expansion-node-rich-content\"\n (click)=\"$event.stopPropagation()\"\n >\n <praxis-rich-content\n [document]=\"getExpansionDetailRichContentDocument(node)\"\n [layout]=\"getExpansionDetailRichContentLayout(node)\"\n [rootClassName]=\"node?.rootClassName || 'pfx-expansion-node-rich-content__document'\"\n [context]=\"getExpansionDetailRichContentContext(row, index, node)\"\n [hostCapabilities]=\"getExpansionDetailRichContentHostCapabilities(row)\"\n ></praxis-rich-content>\n </div>\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, node)\"\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, node)\"\n ></praxis-rich-content>\n }\n </div>\n } @else {\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-placeholder\"\n [nodes]=\"getExpansionDetailTextRichContentNodes(bottomDetailText('itemsEmpty'), '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(bottomDetailText('tabOutside'), '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(bottomDetailText('unsupportedNode'), '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\n@if (isAnalyticalDrawerEnabled()) {\n <praxis-analytical-drawer\n [isOpen]=\"isAnalyticalDrawerOpen\"\n [drawerConfig]=\"config?.behavior?.drawer || null\"\n [resourcePath]=\"resourcePath\"\n [row]=\"analyticalDrawerRow\"\n (closeDrawer)=\"closeAnalyticalDrawer()\"\n (tabChange)=\"onAnalyticalDrawerTabChange($event)\"\n />\n}\n", styles: ["@charset \"UTF-8\";.pfx-micro-viz-cell{position:relative;display:inline-block;width:min(100%,210px);min-width:112px;max-width:240px;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) 78%,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;z-index:2;background:var(--md-sys-color-on-surface, #111827);box-shadow:0 0 0 .75px var(--md-sys-color-surface, #ffffff)}.pfx-micro-bullet__target[style*=\"left: 100%\"],.pfx-micro-bullet__target[style*=\"left: 100.00%\"]{transform:translate(-100%)}.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:static;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],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-trend__scrub-slice[data-tone=success]{color:var(--p-table-state-success-fg, #168a4a)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz[data-tone=warning],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-trend__scrub-slice[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],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-trend__scrub-slice[data-tone=danger],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-trend__scrub-slice[data-tone=critical]{color:var(--p-table-state-danger-fg, #b3261e)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz[data-tone=info],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-trend__scrub-slice[data-tone=info]{color:var(--md-sys-color-primary, #2563eb)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz[data-tone=neutral],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-trend__scrub-slice[data-tone=neutral]{color:var(--md-sys-color-secondary, #5c6b73)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz{position:relative;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{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__segments{position:static;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);transform-origin:left center;animation:pfxMicroBarGrow var(--p-table-microviz-animation-duration, .32s) cubic-bezier(.22,1,.36,1) both;transition:opacity .15s ease,filter .15s ease,transform .15s ease}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__row[data-tone=success] .pfx-micro-viz__bar,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__segment[data-tone=success],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz[data-tone=success] .pfx-micro-viz__bar{background:var(--p-table-state-success-fg, #168a4a)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__row[data-tone=warning] .pfx-micro-viz__bar,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__segment[data-tone=warning],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz[data-tone=warning] .pfx-micro-viz__bar{background:var(--p-table-state-warning-fg, #b45f06)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__row[data-tone=danger] .pfx-micro-viz__bar,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__row[data-tone=critical] .pfx-micro-viz__bar,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__segment[data-tone=danger],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__segment[data-tone=critical],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz[data-tone=danger] .pfx-micro-viz__bar,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz[data-tone=critical] .pfx-micro-viz__bar{background:var(--p-table-state-danger-fg, #b3261e)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__row[data-tone=info] .pfx-micro-viz__bar,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__segment[data-tone=info],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz[data-tone=info] .pfx-micro-viz__bar{background:var(--md-sys-color-primary, #2563eb)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__row[data-tone=neutral] .pfx-micro-viz__bar,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__segment[data-tone=neutral],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz[data-tone=neutral] .pfx-micro-viz__bar{background:var(--md-sys-color-secondary, #5c6b73)}: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) 78%,transparent)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__bullet{display:flex;align-items:center;gap:8px;width:100%}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__track{position:relative;display:block;flex:1 1 auto;min-width:48px;block-size:var(--pfx-bullet-bar-height, 8px);overflow:hidden;border-radius:var(--pfx-micro-track-radius, 999px);background:var(--pfx-micro-track-color, var(--md-sys-color-surface-container-high, #e5e7eb));transition:transform .15s ease}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__bullet:hover .pfx-micro-bullet__track{transform:scaleY(1.18)}: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:1px;inset-inline-start:0;block-size:calc(100% - 2px);border-radius:inherit;transform-origin:left center;animation:pfxMicroBarGrow var(--p-table-microviz-animation-duration, .32s) cubic-bezier(.22,1,.36,1) both}: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);transition:transform .15s ease}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__target[style*=\"left: 100%\"],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__target[style*=\"left: 100.00%\"]{transform:translate(-100%)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__compact-value{flex:0 0 auto;font-size:11px;font-weight:600;line-height:1;color:var(--md-sys-color-on-surface, #1f2937);white-space:nowrap;font-variant-numeric:tabular-nums;text-align:right}: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-bullet__range[data-tone=neutral],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__actual[data-tone=neutral]{background:var(--md-sys-color-secondary, #5c6b73)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__row{position:relative;display:grid;grid-template-columns:minmax(42px,.8fr) minmax(52px,1fr) auto;align-items:center;gap:6px;min-width:0;transition:opacity .15s ease}: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{position:static;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;animation:pfxMicroPopIn var(--p-table-microviz-animation-duration, .28s) cubic-bezier(.22,1,.36,1) both}: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);transition:transform .16s ease}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz.pfx-micro-viz__delta[data-direction=up]:hover .pfx-micro-viz__delta-symbol{transform:translateY(-2px)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz.pfx-micro-viz__delta[data-direction=down]:hover .pfx-micro-viz__delta-symbol{transform:translateY(1.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{position:static;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;transition:transform .18s ease}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz.pfx-micro-viz__radial:hover .pfx-micro-radial-svg,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz.pfx-micro-viz__harvey:hover .pfx-micro-harvey-svg{transform:scale(1.08)}: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%;animation:pfxMicroPopIn var(--p-table-microviz-animation-duration, .32s) cubic-bezier(.22,1,.36,1) both}: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;transition:transform .18s ease}: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%;animation:pfxMicroPopIn var(--p-table-microviz-animation-duration, .32s) cubic-bezier(.22,1,.36,1) both}: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{position:relative;display:inline-flex;align-items:center;justify-content:center;width:100%;min-width:112px;overflow:visible}: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{position:relative;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;stroke-dasharray:240;stroke-dashoffset:0;animation:pfxMicroLineDraw var(--p-table-microviz-animation-duration, .32s) cubic-bezier(.22,1,.36,1) both}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-area__fill{fill:currentColor;animation:pfxMicroAreaFade var(--p-table-microviz-animation-duration, .32s) ease both}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-trend__ref-line{stroke:var(--md-sys-color-on-surface-variant, #6b7280);stroke-width:1px;stroke-dasharray:2 2;opacity:.55}: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{transform-box:fill-box;transform-origin:center bottom;animation:pfxMicroColGrow var(--p-table-microviz-animation-duration, .32s) cubic-bezier(.22,1,.36,1) both;transition:opacity .14s ease,filter .14s ease}: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__fallback{display:inline-flex;align-items:center;font-size:var(--pfx-micro-fallback-font-size, 12px);color:var(--md-sys-color-on-surface-variant, #6b7280);line-height:1.2;-webkit-user-select:text;user-select:text}: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{position:static;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;animation:pfxMicroPopIn var(--p-table-microviz-animation-duration, .28s) cubic-bezier(.22,1,.36,1) both;transition:transform .15s ease,box-shadow .15s ease}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__node[data-active=true]{box-shadow:0 0 0 3px color-mix(in srgb,currentColor 22%,transparent)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__node-wrapper:hover .pfx-micro-step__node{transform:scale(1.12)}: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)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__comparison:hover .pfx-micro-viz__row:not(:hover){opacity:.45}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__segments:hover .pfx-micro-viz__segment:not(:hover){opacity:.42}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__segments .pfx-micro-viz__segment:hover{filter:brightness(1.08)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-trend__scrub-layer{position:absolute;inset:0;display:flex;align-items:stretch;z-index:2}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-trend__scrub-slice{position:static;flex:1 1 0%;height:100%;cursor:crosshair}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-trend__scrub-slice:hover:before{content:\"\";position:absolute;left:var(--pfx-scrub-x, 50%);top:var(--pfx-scrub-y, 50%);width:7px;height:7px;border-radius:50%;background:currentColor;border:1.5px solid var(--md-sys-color-surface, #ffffff);box-shadow:0 1px 4px #00000040;transform:translate(-50%,-50%);pointer-events:none;z-index:3}:host ::ng-deep .mat-mdc-cell:has(.pfx-micro-viz-cell),:host ::ng-deep .mat-mdc-cell:has(.pfx-micro-viz-cell) .pfx-cell-content{overflow:visible}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz[data-micro-readout]:hover:after,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz[data-micro-readout]:focus-visible:after,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__row[data-micro-readout]:hover:after,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__segment[data-micro-readout]:hover:after,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__node-wrapper[data-micro-readout]:hover:after,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-trend__scrub-slice[data-micro-readout]:hover:after{content:attr(data-micro-readout);position:absolute;inset-block-end:calc(100% + 4px);inset-inline-start:0;z-index:20;max-width:none;padding:3px 8px;border-radius:6px;background:var(--md-sys-color-surface-container-highest, #1e293b);color:var(--md-sys-color-on-surface, #f8fafc);border:1px solid var(--md-sys-color-outline-variant, rgba(148, 163, 184, .35));font-family:var(--md-sys-typescale-body-medium-font-family, sans-serif);font-size:10.5px;font-weight:600;font-variant-numeric:tabular-nums;line-height:1.25;white-space:nowrap;box-shadow:0 4px 12px #0f172a3d;pointer-events:none}@keyframes pfxMicroBarGrow{0%{transform:scaleX(0)}to{transform:scaleX(1)}}@keyframes pfxMicroColGrow{0%{transform:scaleY(0)}to{transform:scaleY(1)}}@keyframes pfxMicroLineDraw{0%{stroke-dashoffset:240}to{stroke-dashoffset:0}}@keyframes pfxMicroAreaFade{0%{opacity:0}to{opacity:1}}@keyframes pfxMicroPopIn{0%{opacity:.4;transform:scale(.88)}to{opacity:1;transform:scale(1)}}@media(prefers-reduced-motion:reduce),print{:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz *,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}}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{box-sizing:border-box;width:var(--p-table-visible-viewport-width, 100%);max-width:100%;position:sticky;left:0;container-type:inline-size;padding:16px 20px;border-left:3px solid var(--md-sys-color-primary);background:color-mix(in srgb,var(--md-sys-color-surface-container-low, var(--p-table-bg)) 92%,var(--md-sys-color-primary, transparent) 8%)}.ptable-bottom-detail{min-width:0;overflow:hidden;border:1px solid var(--p-table-border-color);border-top:0;border-radius:0 0 12px 12px;background:var(--p-table-bg, var(--mat-sys-surface, var(--md-sys-color-surface)));color:var(--mat-sys-on-surface, var(--md-sys-color-on-surface));box-shadow:var(--p-table-surface-shadow)}.ptable-bottom-detail--before-controls{border-radius:0;box-shadow:none}.ptable-bottom-detail__header{display:flex;align-items:center;justify-content:space-between;gap:16px;min-height:56px;padding:6px 14px 6px 16px;border-bottom:1px solid color-mix(in srgb,var(--p-table-border-color) 72%,transparent);background:color-mix(in srgb,var(--md-sys-color-primary-container, var(--p-table-bg)) 22%,var(--p-table-bg) 78%)}.ptable-bottom-detail__header button{flex-shrink:0;border-radius:999px}.ptable-bottom-detail__identity{display:flex;min-width:0;align-items:center;gap:10px}.ptable-bottom-detail__identity>mat-icon{flex:0 0 auto;color:var(--md-sys-color-primary)}.ptable-bottom-detail__heading{display:grid;min-width:0}.ptable-bottom-detail__heading strong{overflow:hidden;font-size:14px;line-height:20px;text-overflow:ellipsis;white-space:nowrap}.ptable-bottom-detail__eyebrow{color:var(--md-sys-color-on-surface-variant);font-size:11px;font-weight:700;letter-spacing:.055em;line-height:16px;text-transform:uppercase}.ptable-bottom-detail__body{box-sizing:border-box;display:grid;align-content:start;gap:16px;max-height:40dvh;overflow:auto;scrollbar-gutter:stable;overscroll-behavior:contain;padding:16px;overflow-wrap:anywhere}.ptable-bottom-detail__body>[data-testid=table-bottom-detail-status]:empty{display:none}.ptable-bottom-detail--dynamic .ptable-bottom-detail__body{height:auto;scrollbar-gutter:auto}.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:14px}.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:10px;padding:12px 14px;background:var(--md-sys-color-surface)}.pfx-expansion-node.pfx-expansion-node-card-grid,.pfx-expansion-node.pfx-expansion-node-rich-content{border:0;border-radius:0;padding:0;background:transparent}.pfx-expansion-node-card__header{margin-bottom:10px}.pfx-expansion-node-card__title{margin:0;font-size:14px;font-weight:700;line-height:1.3;letter-spacing:-.01em}.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;justify-content:space-between;flex-wrap:wrap;gap:6px 12px;padding:8px 10px;border-radius:8px;background:color-mix(in srgb,var(--md-sys-color-surface-container-low, transparent) 70%,transparent)}.pfx-expansion-node-value__label{color:var(--md-sys-color-on-surface-variant);font-size:11px;font-weight:700;letter-spacing:.04em;text-transform:uppercase}.pfx-expansion-node-value__content{font-size:13.5px;font-weight:600;color:var(--md-sys-color-on-surface);font-variant-numeric:tabular-nums}.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, var(--mat-sys-surface-container-lowest))}.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}:is(.pfx-expansion-node-action-bar__action-btn,.pfx-expansion-node-rich-list__item-action-btn,.pfx-expansion-node-embed__action-btn,.pfx-expansion-node-action button,.praxis-row-btn,.praxis-icon-btn):disabled{opacity:.56;filter:saturate(.35);box-shadow:none;cursor:not-allowed}.pfx-expansion-node-card-grid__header{display:flex;flex-wrap:wrap;align-items:baseline;justify-content:space-between;gap:4px 12px;margin:0 0 12px;padding-bottom:8px;border-bottom:1px solid color-mix(in srgb,var(--p-table-border-color) 65%,transparent)}.pfx-expansion-node-card-grid__title-text{font-size:13px;font-weight:800;letter-spacing:.04em;text-transform:uppercase;color:var(--md-sys-color-on-surface)}.pfx-expansion-node-card-grid__subtitle-text{font-size:12px;font-weight:500;color:var(--md-sys-color-on-surface-variant)}.pfx-expansion-node-card-grid__cards{display:grid;gap:12px;grid-template-columns:var(--pfx-expansion-card-grid-columns, repeat(auto-fit, minmax(min(var(--pfx-expansion-card-grid-min-width, 220px), 100%), 1fr)))}@container (max-width: 780px){.pfx-expansion-node-card-grid__cards{grid-template-columns:repeat(auto-fit,minmax(min(240px,100%),1fr))}}@container (max-width: 520px){.pfx-expansion-node-card-grid__cards{grid-template-columns:minmax(0,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%;border:0;padding:0;background:transparent}.pfx-expansion-node-rich-content{min-width:0}.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-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-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-icon-btn.destructive{color:var(--md-sys-color-error)}.praxis-row-overflow-menu__item{min-width:212px;max-width:min(320px,88vw)}.praxis-row-overflow-menu__item[disabled]{pointer-events:auto!important;cursor:default!important}.praxis-row-overflow-menu__item ::ng-deep .mat-mdc-menu-item-text{display:flex;align-items:center;min-width:0;white-space:nowrap}.praxis-row-overflow-menu__item ::ng-deep .praxis-row-overflow-menu__label,.praxis-row-overflow-menu__item ::ng-deep .praxis-row-overflow-menu__label-text,.praxis-row-overflow-menu__item ::ng-deep .praxis-row-overflow-menu__label .prx-rich-text,::ng-deep .mat-mdc-menu-panel .pfx-menu-item__content,::ng-deep .mat-mdc-menu-panel .pfx-menu-item__content .prx-rich-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;word-break:normal;overflow-wrap:normal}.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;position:relative;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;min-width:100%}: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.detail-stack{border-bottom-right-radius:0;border-bottom-left-radius:0;box-shadow:none}: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, var(--mat-sys-surface-container))!important;background-color:var(--md-sys-color-surface-container, var(--mat-sys-surface-container))!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-quick-view-trigger--button,.pfx-cell-quick-view-btn{appearance:none;border:none;background:transparent;padding:0;margin:0;font:inherit;color:inherit;text-align:inherit;line-height:inherit;cursor:pointer}.pfx-cell-quick-view-btn,.pfx-cell-value.pfx-quick-view-trigger--button{border-bottom:1px dashed color-mix(in srgb,var(--md-sys-color-primary) 52%,transparent);transition:color .14s ease,border-color .14s ease}.pfx-cell-quick-view-btn:hover,.pfx-cell-value.pfx-quick-view-trigger--button:hover{color:var(--md-sys-color-primary);border-bottom-color:var(--md-sys-color-primary)}.pfx-link-with-quick-view{display:inline-flex;align-items:center;gap:5px;min-width:0;max-width:100%}.pfx-quick-view-adjacent-btn{appearance:none;flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;padding:0;border-radius:5px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 30%,transparent);background:color-mix(in srgb,var(--md-sys-color-primary) 10%,transparent);color:var(--md-sys-color-primary);cursor:pointer;transition:background-color .14s ease,border-color .14s ease}.pfx-quick-view-adjacent-btn:hover{background:color-mix(in srgb,var(--md-sys-color-primary) 18%,transparent);border-color:color-mix(in srgb,var(--md-sys-color-primary) 52%,transparent)}.pfx-quick-view-adjacent-btn__icon{font-size:13px!important;width:13px!important;height:13px!important;line-height:13px!important}.praxis-quick-view-trigger{cursor:pointer}.praxis-quick-view-trigger:focus-visible,.pfx-quick-view-trigger--button:focus-visible,.pfx-quick-view-adjacent-btn:focus-visible{outline:2px solid var(--md-sys-color-primary);outline-offset:2px;border-radius:4px}.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{background:var(--md-sys-color-error);color:var(--md-sys-color-on-error)}.pfx-chip--filled-warning{background:var(--p-table-state-warning-bg);color:var(--p-table-state-warning-fg)}.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,.pfx-chip--filled-neutral,.pfx-chip--filled-default{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-warning{background:color-mix(in srgb,var(--p-table-state-warning-bg) 72%,transparent);color:var(--p-table-state-warning-fg);border-color:color-mix(in srgb,var(--p-table-state-warning-fg) 18%,transparent)}.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,.pfx-chip--soft-neutral,.pfx-chip--soft-default{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-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.dir-media{display:inline-grid;grid-template-columns:auto minmax(0,1fr);grid-auto-rows:auto;align-content:center;align-items:center;column-gap:var(--p-table-compose-media-gap, 10px);row-gap:1px;min-width:0;max-width:100%;line-height:1.25}.pfx-cell-compose.dir-media>:first-child{grid-column:1;grid-row:1/span 6;align-self:center}.pfx-cell-compose.dir-media>:first-child:nth-last-child(2){grid-row:1}.pfx-cell-compose.dir-media>:first-child:nth-last-child(3){grid-row:1/span 2}.pfx-cell-compose.dir-media>:first-child:nth-last-child(4){grid-row:1/span 3}.pfx-cell-compose.dir-media>:first-child:nth-last-child(5){grid-row:1/span 4}.pfx-cell-compose.dir-media>:first-child:nth-last-child(6){grid-row:1/span 5}.pfx-cell-compose.dir-media>:not(:first-child){grid-column:2;justify-self:start;min-width:0;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pfx-cell-compose.dir-media .pfx-badge,.pfx-cell-compose.dir-media .pfx-chip{padding-block:2px;font-size:11px}.pfx-cell-compose.dir-col .pfx-cell-value--subtle,.pfx-cell-compose.dir-media .pfx-cell-value--subtle{font-variant-numeric:tabular-nums}.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%;container:praxis-table-viewport/inline-size;overflow-x:auto;-webkit-overflow-scrolling:touch;overscroll-behavior-x:contain;background:var(--p-table-bg);border-radius:12px 12px 0 0;transition:box-shadow .12s ease-out}.ptable-data-surface{position:relative;min-width:0}.ptable-data-surface--loading-overlay{min-block-size:10rem}.px-scroll-viewport--can-scroll-left{box-shadow:inset 1px 0 color-mix(in srgb,var(--md-sys-color-primary, #1263b4) 42%,transparent),inset 34px 0 26px -26px color-mix(in srgb,var(--md-sys-color-on-surface, #1a1b1f) 68%,transparent)}.px-scroll-viewport--can-scroll-right{box-shadow:inset -1px 0 color-mix(in srgb,var(--md-sys-color-primary, #1263b4) 42%,transparent),inset -34px 0 26px -26px color-mix(in srgb,var(--md-sys-color-on-surface, #1a1b1f) 68%,transparent)}.px-scroll-viewport--can-scroll-left.px-scroll-viewport--can-scroll-right{box-shadow:inset 1px 0 color-mix(in srgb,var(--md-sys-color-primary, #1263b4) 42%,transparent),inset -1px 0 color-mix(in srgb,var(--md-sys-color-primary, #1263b4) 42%,transparent),inset 34px 0 26px -26px color-mix(in srgb,var(--md-sys-color-on-surface, #1a1b1f) 68%,transparent),inset -34px 0 26px -26px color-mix(in srgb,var(--md-sys-color-on-surface, #1a1b1f) 68%,transparent)}.px-scroll-viewport--can-scroll-left .pfx-sticky-boundary-start:after,.px-scroll-viewport--can-scroll-right .pfx-sticky-boundary-end:before{content:\"\";position:absolute;inset-block:0;width:1px;pointer-events:none;background:var(--p-table-border-color);z-index:1}.px-scroll-viewport--can-scroll-left .pfx-sticky-boundary-start:after{inset-inline-end:-1px;box-shadow:12px 0 16px -12px var(--p-table-text-color)}.px-scroll-viewport--can-scroll-right .pfx-sticky-boundary-end:before{inset-inline-start:-1px;box-shadow:-12px 0 16px -12px var(--p-table-text-color)}:host-context([dir=rtl]) .px-scroll-viewport--can-scroll-left .pfx-sticky-boundary-start:after{box-shadow:-12px 0 16px -12px var(--p-table-text-color)}:host-context([dir=rtl]) .px-scroll-viewport--can-scroll-right .pfx-sticky-boundary-end:before{box-shadow:12px 0 16px -12px var(--p-table-text-color)}@media(forced-colors:active){.px-scroll-viewport--can-scroll-left .pfx-sticky-boundary-start:after,.px-scroll-viewport--can-scroll-right .pfx-sticky-boundary-end:before{background:CanvasText;box-shadow:none;forced-color-adjust:none}}.px-scroll-viewport:focus-visible{outline:2px solid var(--md-sys-color-primary, #1263b4);outline-offset:-2px}.px-scroll-viewport--refreshing{cursor:progress}.px-scroll-viewport--loading-replaced{display:none}.px-scroll-viewport--refreshing .praxis-table-data--refreshing{pointer-events:none}.ptable-refresh-state{min-height:36px;display:flex;align-items:center;justify-content:center;gap:10px;padding:6px 12px;color:var(--md-sys-color-on-surface-variant, #5a5d67);background:var(--md-sys-color-surface-container-low, var(--p-table-bg));border-block:1px solid var(--md-sys-color-outline-variant, rgba(18, 99, 180, .12));font-size:.85rem;font-weight:600}.ptable-refresh-state__spinner{width:16px;height:16px;flex:0 0 16px;border:2px solid color-mix(in srgb,var(--md-sys-color-primary, #1263b4) 24%,transparent);border-top-color:var(--md-sys-color-primary, #1263b4);border-radius:50%;animation:ptable-refresh-spin .72s linear infinite}.ptable-refresh-state__progress,.ptable-refresh-state__skeleton{position:relative;display:block;width:54px;height:6px;flex:0 0 54px;overflow:hidden;border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-primary, #1263b4) 18%,transparent)}.ptable-refresh-state__progress:after,.ptable-refresh-state__skeleton:after{content:\"\";position:absolute;inset-block:0;width:45%;border-radius:inherit;background:var(--md-sys-color-primary, #1263b4);animation:ptable-loading-progress 1.1s ease-in-out infinite}.ptable-refresh-state__skeleton:after{width:100%;background:linear-gradient(90deg,transparent,color-mix(in srgb,var(--md-sys-color-primary, #1263b4) 44%,transparent),transparent);animation-name:ptable-loading-wave}@keyframes ptable-refresh-spin{to{transform:rotate(360deg)}}@keyframes ptable-loading-progress{0%{transform:translate(-110%)}to{transform:translate(225%)}}.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%}.px-scroll-viewport.pfx-mobile-card-mode{overflow-x:visible}:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode{display:block;width:100%!important;min-width:0!important;max-width:none!important;background:transparent}:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode thead{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode tbody{display:grid;gap:12px}:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode .mat-mdc-row:not(.pfx-expansion-detail-row){display:grid;grid-template-columns:minmax(0,1fr);gap:0;height:auto;min-height:0;overflow:hidden;border:1px solid var(--p-table-border-color);border-radius:12px;background:var(--p-table-row-bg);box-shadow:none}:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode .mat-mdc-row:not(.pfx-expansion-detail-row) .mat-mdc-cell[data-praxis-card-label]{display:grid;grid-template-columns:minmax(7rem,.8fr) minmax(0,1.2fr);align-items:start;gap:12px;width:auto!important;min-width:0!important;max-width:none!important;height:auto!important;min-height:var(--p-table-row-height, var(--p-table-row-height-default, 44px));position:static!important;inset:auto!important;z-index:auto!important;padding:var(--p-cell-padding, var(--p-cell-padding-default, 10px 14px));border:0;border-bottom:1px solid var(--p-table-border-color);text-align:initial!important;white-space:normal;overflow:visible;text-overflow:clip}:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode .mat-mdc-row:not(.pfx-expansion-detail-row) .mat-mdc-cell[data-praxis-card-label]:before{content:attr(data-praxis-card-label);color:var(--p-table-header-fg);font-size:.75rem;font-weight:700;line-height:1.35}:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode .mat-mdc-row:not(.pfx-expansion-detail-row) .mat-mdc-cell[data-praxis-card-label] .pfx-cell-content{min-width:0;overflow:visible;white-space:normal;justify-content:flex-start!important;text-align:start!important}:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode .pfx-chip,:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode .pfx-badge{max-width:100%;height:auto;white-space:normal;overflow-wrap:anywhere}:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode .pfx-cell-compose.dir-media>:not(:first-child){white-space:normal;overflow-wrap:anywhere;text-overflow:clip}:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode .mat-mdc-row:not(.pfx-expansion-detail-row) .mat-mdc-cell[data-praxis-card-label]:last-child{border-bottom:0}:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode .praxis-actions-cell{grid-column:1/-1}:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode .praxis-actions-cell .praxis-actions-cell__content{justify-content:flex-start;flex-wrap:wrap}:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode .mat-mdc-row:not(.pfx-expansion-detail-row) .praxis-actions-cell[data-praxis-card-label=\"\"]{grid-template-columns:minmax(0,1fr);align-items:center;padding-block:0}:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode .mat-mdc-row:not(.pfx-expansion-detail-row) .praxis-actions-cell[data-praxis-card-label=\"\"]:before{content:none}@container praxis-table-viewport (max-width: 480px){:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode .mat-mdc-row:not(.pfx-expansion-detail-row) .mat-mdc-cell[data-praxis-card-label]{grid-template-columns:minmax(0,1fr);gap:4px}:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode .mat-mdc-row:not(.pfx-expansion-detail-row) .mat-mdc-cell[data-praxis-card-label] .pfx-cell-content{width:100%;overflow:visible;overflow-wrap:anywhere}:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode .pfx-cell-content>*{min-width:0;max-width:100%}:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode .praxis-actions-cell .praxis-actions-cell__content{gap:8px}}: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):not(.praxis-header-align-center) .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:0;padding-inline-end:0}: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.pfx-row-click-selectable:focus-visible{outline:2px solid var(--praxis-theme-focus-outline, var(--md-sys-color-primary));outline-offset:-2px}: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>mat-radio-button{--mat-radio-selected-icon-color: var(--p-table-row-selected-fg);--mat-radio-selected-hover-icon-color: var(--p-table-row-selected-fg);--mat-radio-selected-focus-icon-color: var(--p-table-row-selected-fg);--mat-radio-selected-pressed-icon-color: var(--p-table-row-selected-fg)}:host ::ng-deep .mat-mdc-table:not(.pfx-mobile-card-mode) .mat-mdc-row.pfx-row-selected .mat-mdc-cell:first-child{position:relative}:host ::ng-deep .mat-mdc-table:not(.pfx-mobile-card-mode) .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 ::ng-deep .mat-mdc-table.pfx-mobile-card-mode .mat-mdc-row.pfx-row-selected{box-shadow:inset 4px 0 0 var(--p-table-row-selected-indicator)}: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{background:var(--md-sys-color-error);color:var(--md-sys-color-on-error)}.pfx-badge--filled-warning{background:var(--p-table-state-warning-bg);color:var(--p-table-state-warning-fg)}.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,.pfx-badge--filled-neutral,.pfx-badge--filled-default{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-warning{background:color-mix(in srgb,var(--p-table-state-warning-bg) 72%,transparent);color:var(--p-table-state-warning-fg);border-color:color-mix(in srgb,var(--p-table-state-warning-fg) 18%,transparent)}.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,.pfx-badge--soft-neutral,.pfx-badge--soft-default{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--overlay{position:absolute;z-index:8;inset:0;min-block-size:10rem;background:color-mix(in srgb,var(--md-sys-color-surface, #fff) 92%,transparent);-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}.ptable-loading-state__spinner{width:34px;height:34px;margin:18px auto 8px;border:3px solid color-mix(in srgb,var(--md-sys-color-primary, #1263b4) 22%,transparent);border-top-color:var(--md-sys-color-primary, #1263b4);border-radius:50%;animation:ptable-refresh-spin .72s linear infinite}.ptable-loading-state__progress{height:6px;margin:28px 12px 16px;overflow:hidden;border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-primary, #1263b4) 18%,transparent)}.ptable-loading-state__progress span{display:block;width:38%;height:100%;border-radius:inherit;background:var(--md-sys-color-primary, #1263b4);animation:ptable-loading-progress 1.1s ease-in-out infinite}.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;font-weight:550;color:var(--pdx-text-shimmer-base, var(--md-sys-color-on-surface-variant, #5a5d67));padding-inline:4px}.ptable-refresh-state__message{font-weight:550;color:var(--pdx-text-shimmer-base, var(--md-sys-color-on-surface-variant, #5a5d67))}@supports (-webkit-background-clip: text) or (background-clip: text){.ptable-loading-state__message,.ptable-refresh-state__message{background-image:var(--pdx-text-shimmer-gradient, linear-gradient(105deg, color-mix(in oklab, var(--md-sys-color-on-surface-variant, #5a5d67) 78%, var(--md-sys-color-on-surface, #0f172a) 22%) 0%, color-mix(in oklab, var(--md-sys-color-on-surface-variant, #5a5d67) 78%, var(--md-sys-color-on-surface, #0f172a) 22%) 26%, color-mix(in oklab, var(--md-sys-color-tertiary, #6366f1) 66%, #a855f7 34%) 40%, var(--pdx-text-shimmer-peak, var(--md-sys-color-on-surface, #ffffff)) 50%, color-mix(in oklab, var(--md-sys-color-primary, #006a6a) 66%, #ec4899 34%) 60%, color-mix(in oklab, var(--md-sys-color-on-surface-variant, #5a5d67) 78%, var(--md-sys-color-on-surface, #0f172a) 22%) 74%, color-mix(in oklab, var(--md-sys-color-on-surface-variant, #5a5d67) 78%, var(--md-sys-color-on-surface, #0f172a) 22%) 100%));background-size:300% 100%;background-position:100% 50%;background-repeat:no-repeat;-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;color:transparent;animation:ptable-text-shimmer-sweep var(--pdx-text-shimmer-duration, 2.6s) linear infinite;will-change:background-position}}@keyframes ptable-text-shimmer-sweep{0%{background-position:100% 50%}to{background-position:0% 50%}}.ptable-loading-state__actions{display:flex;justify-content:flex-end}.ptable-loading-state__hero--static .ptable-loading-state__line,.ptable-loading-state__hero--static .ptable-loading-state__cell{animation:none}@media(prefers-reduced-motion:reduce){.ptable-refresh-state__spinner,.ptable-refresh-state__progress:after,.ptable-refresh-state__skeleton:after,.ptable-loading-state__spinner,.ptable-loading-state__progress span,.ptable-loading-state__line,.ptable-loading-state__cell{animation:none}}@media(prefers-reduced-motion:reduce),(forced-colors:active),print{.ptable-loading-state__message,.ptable-refresh-state__message{animation:none!important;background-image:none!important;-webkit-text-fill-color:currentColor!important;color:var(--md-sys-color-primary, currentColor)!important;will-change:auto}}@media(forced-colors:active){.ptable-loading-state__message,.ptable-refresh-state__message{color:CanvasText!important;-webkit-text-fill-color:CanvasText!important}}.ptable-cancelled-state{display:flex;align-items:center;gap:12px;padding:12px 16px;border:1px solid var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface-container-low);color:var(--md-sys-color-on-surface)}.ptable-cancelled-state__content{display:grid;flex:1;gap:2px}.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{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, var(--praxis-action-control-height, 40px));--pdx-empty-state-action-radius: var(--p-table-empty-action-radius, var(--praxis-action-control-radius, 8px));--pdx-empty-state-transparent-margin: 0}.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%}.ptable-header-actions{display:flex;align-items:center;gap:8px;padding:10px 14px 6px}.ptable-header-title{margin-right:auto;font-size:.95rem;font-weight:600;letter-spacing:-.01em;color:var(--p-table-header-fg, var(--md-sys-color-on-surface))}\n"] }]
|
|
44929
|
+
], template: "@if (collectionWorkflowOutcome && collectionWorkflowOutcome.resourcePath === resourcePath) {\n<praxis-table-collection-outcome [result]=\"collectionWorkflowOutcome\"></praxis-table-collection-outcome>\n}\n@if (bulkSyncHandle && canShowBulkSyncHandle()) {\n @for (handle of [bulkSyncHandle]; track handle) {\n <praxis-table-bulk-sync-workflow [handle]=\"handle\" [loading]=\"config?.behavior?.loading\"\n (closed)=\"closeBulkSync()\" />\n }\n}\n\n@if (shouldShowEmptyState()) {\n<praxis-empty-state-card\n icon=\"link\"\n [title]=\"getSetupEmptyStateTitle()\"\n [description]=\"getSetupEmptyStateDescription()\"\n [primaryAction]=\"getSetupEmptyStatePrimaryAction()\"\n></praxis-empty-state-card>\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} @if (isAiAssistantEnabled() && aiAssistantOpen && aiAssistantViewState) {\n @for (owner of [aiAssistantShellOwnerKey()]; track owner) {\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)=\"onAiAssistantShellPromptChange($event, owner)\"\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\n<!-- Shared template for <praxis-filter> (inline toolbar or teleported via <praxis-filter-outlet>) -->\n<ng-template #filterBarTemplate>\n @if (shouldRenderAdvancedFilter()) {\n <praxis-filter\n advancedFilter\n [resourcePath]=\"getAdvancedFilterResourcePath()\"\n [filterId]=\"tableId\"\n [formId]=\"getAdvancedFilterFormId()\"\n [persistenceKey]=\"getAdvancedFilterPersistenceKey()\"\n [disablePersistence]=\"configPersistenceStrategy === 'volatile'\"\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 [tags]=\"config.behavior?.filtering?.advancedFilters?.settings?.tags\"\n [advancedOpenMode]=\"getAdvancedFilterOpenMode()\"\n [presentation]=\"config.behavior?.filtering?.advancedFilters?.settings?.presentation\"\n [advancedClearButtonsEnabled]=\"config.behavior?.filtering?.advancedFilters?.settings?.advancedClearButtonsEnabled\"\n [useInlineSearchableSelectVariant]=\"config.behavior?.filtering?.advancedFilters?.settings?.useInlineSearchableSelectVariant ?? true\"\n [useInlineRangeVariant]=\"config.behavior?.filtering?.advancedFilters?.settings?.useInlineRangeVariant ?? true\"\n [useInlineDateVariant]=\"config.behavior?.filtering?.advancedFilters?.settings?.useInlineDateVariant ?? true\"\n [useInlineDateRangeVariant]=\"config.behavior?.filtering?.advancedFilters?.settings?.useInlineDateRangeVariant ?? true\"\n [useInlineTimeVariant]=\"config.behavior?.filtering?.advancedFilters?.settings?.useInlineTimeVariant ?? true\"\n [useInlineTimeRangeVariant]=\"config.behavior?.filtering?.advancedFilters?.settings?.useInlineTimeRangeVariant ?? true\"\n [useInlineTreeSelectVariant]=\"config.behavior?.filtering?.advancedFilters?.settings?.useInlineTreeSelectVariant ?? true\"\n [changeDebounceMs]=\"config.behavior?.filtering?.advancedFilters?.settings?.changeDebounceMs ?? 300\"\n [i18n]=\"getFilterI18n()\"\n [mode]=\"'filter'\"\n [showAddButton]=\"shouldShowAdvancedFilterAddButton()\"\n [showAdvancedButton]=\"config.toolbar?.filters?.showAdvancedButton !== false\"\n [showFilterSettings]=\"shouldShowAdvancedFilterSettings()\"\n (change)=\"onAdvancedFilterChange($event)\"\n (requestSearch)=\"onAdvancedFilterSubmit($event)\"\n (clear)=\"onAdvancedFilterClear()\"\n ></praxis-filter>\n }\n</ng-template>\n\n@if (shouldRenderDataSurface() && !schemaError && toolbarV2) {\n<div\n class=\"praxis-table-header\"\n [class.edit-mode]=\"isCustomizationAvailable()\"\n [class.stacked]=\"hasTopToolbarStack()\"\n>\n @if (showToolbar && shouldShowToolbarTopPlacement()) {\n <praxis-table-toolbar\n class=\"praxis-toolbar-stack-top\"\n [config]=\"config\"\n [focusScope]=\"getFocusRestoreScope('header')\"\n [backgroundColor]=\"getToolbarActionsBackgroundColor()\"\n [style.--pfx-filter-h]=\"getToolbarLayoutHeightHostStyle()\"\n [evaluationContext]=\"getToolbarEvaluationContext()\"\n [activeQuickFilterId]=\"activeQuickFilterId\"\n [activeDensity]=\"resolveAppearanceDensity()\"\n [activeCrossFilters]=\"activeCrossFilters\"\n [columnVisibilityController]=\"toolbarColumnVisibilityController\"\n [showActionsGroup]=\"shouldShowToolbarActionsTop()\"\n [showMobileActions]=\"shouldShowToolbarActionsTop()\"\n [exportBusy]=\"exportBusy\"\n [exportStatusMessage]=\"exportStatusMessage\"\n (toolbarAction)=\"onToolbarAction($event)\"\n (exportAction)=\"onExportAction($event)\"\n (quickFilterChange)=\"onQuickFilterChange($event)\"\n (densityChange)=\"onDensityChange($event)\"\n (clearCrossFilter)=\"onClearCrossFilter($event)\"\n (clearAllCrossFilters)=\"onClearAllCrossFilters()\"\n >\n @if (shouldRenderAdvancedFilter() && !filterTeleport) {\n <ng-container ngProjectAs=\"[advancedFilter]\" *ngTemplateOutlet=\"filterBarTemplate\" />\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 } @if (isCustomizationAvailable()) {\n <button\n end-actions\n type=\"button\"\n praxisIconButton=\"settings\"\n size=\"compact\"\n class=\"praxis-table-toolbar-action--configuration\"\n data-role=\"table-settings\"\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 } @if (!showToolbar && isCustomizationAvailable()) {\n <div class=\"ptable-header-actions\">\n @if ($any(config)?.title) {\n <span class=\"ptable-header-title\">{{ $any(config).title }}</span>\n }\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\n type=\"button\"\n praxisIconButton=\"settings\"\n size=\"compact\"\n class=\"praxis-table-toolbar-action--configuration\"\n data-role=\"table-settings\"\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 @if (isRemoteMode()) {\n <button\n type=\"button\"\n praxisIconButton=\"link_off\"\n size=\"compact\"\n (click)=\"disconnect()\"\n [attr.aria-label]=\"getDisconnectLabel()\"\n [matTooltip]=\"getDisconnectTooltip()\"\n ></button>\n }\n </div>\n }\n</div>\n} @else { @if (shouldRenderDataSurface() && !schemaError) { @if\n(showToolbar && shouldShowToolbarTopPlacement()) {\n<praxis-table-toolbar\n class=\"praxis-toolbar-stack-top\"\n [config]=\"config\"\n [focusScope]=\"getFocusRestoreScope('header')\"\n [backgroundColor]=\"getToolbarActionsBackgroundColor()\"\n [style.--pfx-filter-h]=\"getToolbarLayoutHeightHostStyle()\"\n [evaluationContext]=\"getToolbarEvaluationContext()\"\n [activeQuickFilterId]=\"activeQuickFilterId\"\n [activeDensity]=\"resolveAppearanceDensity()\"\n [activeCrossFilters]=\"activeCrossFilters\"\n [showActionsGroup]=\"shouldShowToolbarActionsTop()\"\n [showMobileActions]=\"shouldShowToolbarActionsTop()\"\n [exportBusy]=\"exportBusy\"\n [exportStatusMessage]=\"exportStatusMessage\"\n (toolbarAction)=\"onToolbarAction($event)\"\n (exportAction)=\"onExportAction($event)\"\n (quickFilterChange)=\"onQuickFilterChange($event)\"\n (densityChange)=\"onDensityChange($event)\"\n (clearCrossFilter)=\"onClearCrossFilter($event)\"\n (clearAllCrossFilters)=\"onClearAllCrossFilters()\"\n>\n @if (shouldRenderAdvancedFilter() && !filterTeleport) {\n <ng-container ngProjectAs=\"[advancedFilter]\" *ngTemplateOutlet=\"filterBarTemplate\" />\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 } @if (isCustomizationAvailable()) {\n <button\n end-actions\n type=\"button\"\n praxisIconButton=\"settings\"\n size=\"compact\"\n class=\"praxis-table-toolbar-action--configuration\"\n data-role=\"table-settings\"\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} @if (!showToolbar && isCustomizationAvailable()) {\n<div class=\"ptable-header-actions\">\n @if ($any(config)?.title) {\n <span class=\"ptable-header-title\">{{ $any(config).title }}</span>\n }\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\n type=\"button\"\n praxisIconButton=\"settings\"\n size=\"compact\"\n class=\"praxis-table-toolbar-action--configuration\"\n data-role=\"table-settings\"\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</div>\n} } }\n<!-- Operational error state; authoring actions remain capability-gated when toolbar cannot render. -->\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\n mat-flat-button\n color=\"primary\"\n [disabled]=\"isErrorRetryInProgress()\"\n (click)=\"retryTableError()\"\n >\n <mat-icon\n [class.ptable-error__retry-icon--active]=\"isErrorRetryInProgress()\"\n >refresh</mat-icon\n >\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 (canCancelLoad()) {\n <button mat-stroked-button type=\"button\" (click)=\"cancelLoad()\">\n {{ getCancelLoadLabel() }}\n </button>\n }\n @if (isCustomizationAvailable() && schemaError) {\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\n type=\"button\"\n praxisIconButton=\"settings\"\n size=\"compact\"\n class=\"praxis-table-toolbar-action--configuration\"\n data-role=\"table-settings\"\n data-testid=\"table-settings-trigger\"\n (click)=\"openTableSettings()\"\n [attr.aria-label]=\"getTableSettingsLabel()\"\n [matTooltip]=\"getTableSettingsLabel()\"\n matTooltipPosition=\"below\"\n >\n >\n </button>\n }\n </div>\n</div>\n}\n<!-- Paginador superior -->\n@if (shouldRenderDataSurface() && !schemaError && !dataError &&\ngetPaginationEnabled() && (config.behavior?.pagination?.position === 'top' ||\nconfig.behavior?.pagination?.position === 'both')) {\n<mat-paginator\n [length]=\"getPaginationLength()\"\n [pageIndex]=\"pageIndex\"\n [pageSize]=\"pageSize\"\n [pageSizeOptions]=\"getPaginationPageSizeOptions()\"\n [selectConfig]=\"paginatorSelectConfig\"\n [showFirstLastButtons]=\"getPaginationShowFirstLast()\"\n [disabled]=\"isTableDataLoading()\"\n (page)=\"onPageChange($event)\"\n [class.compact]=\"config.behavior?.pagination?.style === 'compact'\"\n>\n</mat-paginator>\n} @if (shouldShowRefreshingState()) {\n<div\n class=\"ptable-refresh-state\"\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n>\n @if (getLoadingIndicatorType() === 'progress') {\n <span class=\"ptable-refresh-state__progress\" aria-hidden=\"true\"></span>\n } @else if (getLoadingIndicatorType() === 'skeleton') {\n <span class=\"ptable-refresh-state__skeleton\" aria-hidden=\"true\"></span>\n } @else {\n <span class=\"ptable-refresh-state__spinner\" aria-hidden=\"true\"></span>\n }\n <span class=\"ptable-refresh-state__message\">{{ getLoadingSurfaceMessage() }}</span>\n @if (canCancelLoad()) {\n <button mat-button type=\"button\" (click)=\"cancelLoad()\">\n {{ getCancelLoadLabel() }}\n </button>\n }\n</div>\n}\n<div\n class=\"ptable-data-surface\"\n [class.ptable-data-surface--loading-overlay]=\"\n shouldShowLoadingSurface() && getLoadingIndicatorPosition() === 'overlay'\n \"\n>\n<div\n #scrollViewport\n class=\"px-scroll-viewport\"\n cdkScrollable\n (scroll)=\"onHorizontalViewportScroll($event)\"\n (keydown)=\"onHorizontalViewportKeydown($event)\"\n [attr.aria-busy]=\"isTableDataLoading() ? 'true' : 'false'\"\n [attr.role]=\"horizontalScroll === 'auto' ? 'region' : null\"\n [attr.aria-label]=\"horizontalScroll === 'auto' ? getScrollViewportAriaLabel() : null\"\n [attr.tabindex]=\"horizontalScroll === 'auto' ? 0 : null\"\n [class.px-scroll-viewport--refreshing]=\"shouldShowRefreshingState()\"\n [class.px-scroll-viewport--loading-replaced]=\"shouldReplaceDataWithLoading()\"\n [class.scroll-auto]=\"horizontalScroll === 'auto'\"\n [class.scroll-wrap]=\"horizontalScroll === 'wrap'\"\n [class.scroll-none]=\"horizontalScroll === 'none'\"\n [class.px-scroll-viewport--overflowing]=\"hasHorizontalOverflow\"\n [class.px-scroll-viewport--can-scroll-left]=\"canScrollHorizontallyLeft\"\n [class.px-scroll-viewport--can-scroll-right]=\"canScrollHorizontallyRight\"\n [class.pfx-mobile-card-mode]=\"isMobileCardModeActive()\"\n [class.table-rounded-bottom]=\"!hasBottomTableStack()\"\n>\n @if (shouldRenderDataSurface() && !schemaError && !dataError) {\n <div\n class=\"praxis-visually-hidden-status\"\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >\n {{ columnReorderStatusMessage }} {{ columnResizeStatusMessage }}\n </div>\n @if (selectionStatusMessage) {\n <div\n class=\"praxis-visually-hidden-status\"\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >\n {{ selectionStatusMessage }}\n </div>\n }\n @if (exportStatusMessage) {\n <div\n class=\"praxis-visually-hidden-status\"\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >\n {{ exportStatusMessage }}\n </div>\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 [attr.aria-label]=\"getTableAriaLabel()\"\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() || isTableDataLoading()\"\n [class.praxis-table-data--refreshing]=\"shouldShowRefreshingState()\"\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 [class.pfx-mobile-card-mode]=\"isMobileCardModeActive()\"\n [style.width]=\"getColumnResizeTableWidthStyle()\"\n >\n @if (isSelectionColumnEnabled()) {\n <ng-container matColumnDef=\"_select\">\n <th mat-header-cell *matHeaderCellDef>\n @if (canSelectAll()) {\n <mat-checkbox\n (change)=\"masterToggle()\"\n [checked]=\"isAllSelected()\"\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\"\n [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(); onSingleSelectionChanged(row)\"\n (change)=\"onSingleSelectionChanged(row)\"\n (keydown.space)=\"onSingleSelectionSpace($event, row)\"\n [checked]=\"selection.isSelected(row)\"\n [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 [aria-label]=\"getRowSelectionAriaLabel(row, i)\"\n ></mat-checkbox>\n }\n </td>\n </ng-container>\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\"\n >Expandir detalhes da linha</span\n >\n </th>\n <td\n mat-cell\n *matCellDef=\"let row; let i = index\"\n class=\"pfx-expansion-col-cell\"\n >\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 [attr.title]=\"!isRowExpandable(row, i) ? getRowExpansionToggleAriaLabel(row, i) : null\"\n (click)=\"onExpansionToggleFromIcon(row, i, $event)\"\n (keydown)=\"onExpansionToggleKeydown($event, row, i)\"\n ></button>\n </td>\n </ng-container>\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 [class.pfx-sticky-boundary-start]=\"isStickyStartBoundary(column)\"\n [class.pfx-sticky-boundary-end]=\"isStickyEndBoundary(column)\"\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 (lostpointercapture)=\"onColumnResizeLostPointerCapture($event)\"\n (dblclick)=\"onColumnResizeHandleDoubleClick($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 [class.pfx-sticky-boundary-start]=\"isStickyStartBoundary(column)\"\n [class.pfx-sticky-boundary-end]=\"isStickyEndBoundary(column)\"\n [matTooltip]=\"getCellTooltip(element, column) || ''\"\n [matTooltipPosition]=\"getCellTooltipPosition(element, column)\"\n [matTooltipDisabled]=\"!getCellTooltip(element, column)\"\n [attr.title]=\"getCellTooltip(element, column) || null\"\n [attr.data-praxis-card-label]=\"column.header || column.field\"\n [style.order]=\"isMobileCardModeActive() ? getMobileCardColumnOrder(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 [praxisQuickView]=\"getEffectiveQuickViewBinding(element, column)\"\n [praxisQuickViewRecord]=\"element\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\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') { @if (shouldRenderBadge(element, column)) {\n <span\n class=\"pfx-badge\"\n [ngClass]=\"getBadgeClasses(element, column)\"\n [praxisQuickView]=\"getEffectiveQuickViewBinding(element, column)\"\n [praxisQuickViewRecord]=\"element\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n >\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 <!-- Link renderer -->\n @case ('link') {\n @let linkQuickView = getEffectiveQuickViewBinding(element, column);\n @let linkHref = getLinkHref(element, column);\n @if (linkQuickView && !linkHref) {\n <button\n type=\"button\"\n class=\"pfx-link pfx-quick-view-trigger--button\"\n [praxisQuickView]=\"linkQuickView\"\n [praxisQuickViewRecord]=\"element\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"hover-and-click\"\n [attr.aria-label]=\"getLinkText(element, column) || column.header\"\n (click)=\"$event.stopPropagation()\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-link__content\"\n [nodes]=\"getLinkRichContentNodes(element, column)\"\n ></praxis-rich-content>\n </button>\n } @else if (linkQuickView && linkHref) {\n <span class=\"pfx-link-with-quick-view\">\n <a\n class=\"pfx-link\"\n [attr.href]=\"linkHref\"\n [attr.target]=\"getLinkTarget(element, column) || null\"\n [attr.rel]=\"getLinkRel(element, column) || null\"\n [praxisQuickView]=\"linkQuickView\"\n [praxisQuickViewRecord]=\"element\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"hover-only\"\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\n ></a>\n <button\n type=\"button\"\n class=\"pfx-quick-view-adjacent-btn\"\n [praxisQuickView]=\"linkQuickView\"\n [praxisQuickViewRecord]=\"element\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"explicit-button\"\n [attr.aria-label]=\"getQuickViewTriggerAriaLabel(getLinkText(element, column), column)\"\n (click)=\"$event.stopPropagation()\"\n >\n <mat-icon class=\"pfx-quick-view-adjacent-btn__icon\" aria-hidden=\"true\">info_outline</mat-icon>\n </button>\n </span>\n } @else {\n <a\n class=\"pfx-link\"\n [attr.href]=\"linkHref || 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\n ></a>\n }\n }\n <!-- Button renderer -->\n @case ('button') { @switch (getButtonVariant(element, column)) { @case\n ('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 } @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 } @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 <!-- Chip renderer -->\n @case ('chip') { @if (shouldRenderChip(element, column)) {\n <span\n class=\"pfx-chip\"\n [ngClass]=\"getChipClasses(element, column)\"\n [praxisQuickView]=\"getEffectiveQuickViewBinding(element, column)\"\n [praxisQuickViewRecord]=\"element\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n >\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 <!-- 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\n class=\"pfx-micro-viz-cell\"\n [innerHTML]=\"getMicroVisualizationHtml(element, column)\"\n ></span>\n }\n <!-- Avatar renderer -->\n @case ('avatar') {\n <span\n 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 [praxisQuickView]=\"getEffectiveQuickViewBinding(element, column)\"\n [praxisQuickViewRecord]=\"element\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n >\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\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(element, 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(element, column); track it.id) {\n <button\n mat-menu-item\n (click)=\"onMenuItemClick(it, element, $event)\"\n [disabled]=\"!it.__visible\"\n >\n <praxis-rich-content\n layout=\"inline\"\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 >\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\n class=\"pfx-cell-compose\"\n [ngClass]=\"getComposeClasses(element, column)\"\n [ngStyle]=\"getComposeGapStyle(element, column)\"\n >\n @for (it of getComposeItems(element, column); track\n trackComposeItem($index, it)) { @switch\n (getItemEffectiveType(element, column, it)) {\n <!-- Reuse helpers by projecting item as faux column -->\n @case ('icon') {\n @let composeIconCol = asItemColumn(column, it);\n <span\n class=\"pfx-icon-renderer\"\n [style.color]=\"getIconColor(element, composeIconCol) || null\"\n [ngStyle]=\"getIconStyle(element, composeIconCol)\"\n [attr.aria-label]=\"getIconAriaLabel(element, composeIconCol) || null\"\n [praxisQuickView]=\"getEffectiveQuickViewBinding(element, composeIconCol)\"\n [praxisQuickViewRecord]=\"element\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n ><praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-icon-renderer__content\"\n [nodes]=\"getIconRichContentNodes(element, composeIconCol)\"\n ></praxis-rich-content\n ></span>\n } @case ('image') {\n <span class=\"pfx-cell-image\"\n ><praxis-rich-content\n rootClassName=\"pfx-cell-image__content\"\n [nodes]=\"getImageRichContentNodes(element, asItemColumn(column, it))\"\n ></praxis-rich-content\n ></span>\n } @case ('badge') {\n @let composeBadgeCol = asItemColumn(column, it);\n @if (shouldRenderBadge(element, composeBadgeCol)) {\n <span\n class=\"pfx-badge\"\n [ngClass]=\"getBadgeClasses(element, composeBadgeCol)\"\n [praxisQuickView]=\"getEffectiveQuickViewBinding(element, composeBadgeCol)\"\n [praxisQuickViewRecord]=\"element\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n ><praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-badge__content\"\n [nodes]=\"getBadgeRichContentNodes(element, composeBadgeCol)\"\n ></praxis-rich-content\n ></span>\n } } @case ('link') {\n @let composeLinkCol = asItemColumn(column, it);\n @let composeLinkQuickView = getEffectiveQuickViewBinding(element, composeLinkCol);\n @let composeLinkHref = getLinkHref(element, composeLinkCol);\n @if (composeLinkQuickView && !composeLinkHref) {\n <button\n type=\"button\"\n class=\"pfx-link pfx-quick-view-trigger--button\"\n [praxisQuickView]=\"composeLinkQuickView\"\n [praxisQuickViewRecord]=\"element\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"hover-and-click\"\n [attr.aria-label]=\"getLinkText(element, composeLinkCol) || column.header\"\n (click)=\"$event.stopPropagation()\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-link__content\"\n [nodes]=\"getLinkRichContentNodes(element, composeLinkCol)\"\n ></praxis-rich-content>\n </button>\n } @else if (composeLinkQuickView && composeLinkHref) {\n <span class=\"pfx-link-with-quick-view\">\n <a\n class=\"pfx-link\"\n [attr.href]=\"composeLinkHref\"\n [attr.target]=\"getLinkTarget(element, composeLinkCol) || null\"\n [attr.rel]=\"getLinkRel(element, composeLinkCol) || null\"\n [praxisQuickView]=\"composeLinkQuickView\"\n [praxisQuickViewRecord]=\"element\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"hover-only\"\n (click)=\"$event.stopPropagation()\"\n ><praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-link__content\"\n [nodes]=\"getLinkRichContentNodes(element, composeLinkCol)\"\n ></praxis-rich-content\n ></a>\n <button\n type=\"button\"\n class=\"pfx-quick-view-adjacent-btn\"\n [praxisQuickView]=\"composeLinkQuickView\"\n [praxisQuickViewRecord]=\"element\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"explicit-button\"\n [attr.aria-label]=\"getQuickViewTriggerAriaLabel(getLinkText(element, composeLinkCol), composeLinkCol)\"\n (click)=\"$event.stopPropagation()\"\n >\n <mat-icon class=\"pfx-quick-view-adjacent-btn__icon\" aria-hidden=\"true\">info_outline</mat-icon>\n </button>\n </span>\n } @else {\n <a\n class=\"pfx-link\"\n [attr.href]=\"composeLinkHref || null\"\n [attr.target]=\"getLinkTarget(element, composeLinkCol) || null\"\n [attr.rel]=\"getLinkRel(element, composeLinkCol) || null\"\n (click)=\"$event.stopPropagation()\"\n ><praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-link__content\"\n [nodes]=\"getLinkRichContentNodes(element, composeLinkCol)\"\n ></praxis-rich-content\n ></a>\n }\n } @case ('button') { @switch (getButtonVariant(element,\n asItemColumn(column, it))) { @case ('outlined') {\n <button\n mat-stroked-button\n [color]=\"getButtonColor(element, asItemColumn(column, it)) || null\"\n [disabled]=\"isButtonDisabled(element, asItemColumn(column, it))\"\n [attr.aria-label]=\"getButtonAriaLabel(element, asItemColumn(column, it)) || getButtonLabel(element, asItemColumn(column, it))\"\n (click)=\"onButtonClick(element, asItemColumn(column, it), $event)\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-button-renderer__content\"\n [nodes]=\"getButtonRichContentNodes(element, asItemColumn(column, it))\"\n ></praxis-rich-content>\n </button>\n } @case ('text') {\n <button\n mat-button\n [color]=\"getButtonColor(element, asItemColumn(column, it)) || null\"\n [disabled]=\"isButtonDisabled(element, asItemColumn(column, it))\"\n [attr.aria-label]=\"getButtonAriaLabel(element, asItemColumn(column, it)) || getButtonLabel(element, asItemColumn(column, it))\"\n (click)=\"onButtonClick(element, asItemColumn(column, it), $event)\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-button-renderer__content\"\n [nodes]=\"getButtonRichContentNodes(element, asItemColumn(column, it))\"\n ></praxis-rich-content>\n </button>\n } @default {\n <button\n mat-flat-button\n [color]=\"getButtonColor(element, asItemColumn(column, it)) || null\"\n [disabled]=\"isButtonDisabled(element, asItemColumn(column, it))\"\n [attr.aria-label]=\"getButtonAriaLabel(element, asItemColumn(column, it)) || getButtonLabel(element, asItemColumn(column, it))\"\n (click)=\"onButtonClick(element, asItemColumn(column, it), $event)\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-button-renderer__content\"\n [nodes]=\"getButtonRichContentNodes(element, asItemColumn(column, it))\"\n ></praxis-rich-content>\n </button>\n } } } @case ('chip') {\n @let composeChipCol = asItemColumn(column, it);\n @if (shouldRenderChip(element, composeChipCol)) {\n <span\n class=\"pfx-chip\"\n [ngClass]=\"getChipClasses(element, composeChipCol)\"\n [praxisQuickView]=\"getEffectiveQuickViewBinding(element, composeChipCol)\"\n [praxisQuickViewRecord]=\"element\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n ><praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-chip__content\"\n [nodes]=\"getChipRichContentNodes(element, composeChipCol)\"\n ></praxis-rich-content\n ></span>\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 } @case ('microVisualization') {\n <span\n class=\"pfx-micro-viz-cell\"\n [innerHTML]=\"getMicroVisualizationHtml(element, asItemColumn(column, it))\"\n ></span>\n } @case ('avatar') {\n @let composeAvatarCol = asItemColumn(column, it);\n <span\n class=\"pfx-avatar-renderer\"\n [ngStyle]=\"getAvatarStyle(element, composeAvatarCol)\"\n [class.shape-rounded]=\"getAvatarShape(element, composeAvatarCol) === 'rounded'\"\n [class.shape-circle]=\"getAvatarShape(element, composeAvatarCol) === 'circle'\"\n [praxisQuickView]=\"getEffectiveQuickViewBinding(element, composeAvatarCol)\"\n [praxisQuickViewRecord]=\"element\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n ><praxis-rich-content\n rootClassName=\"pfx-avatar-renderer__content\"\n [nodes]=\"getAvatarRichContentNodes(element, composeAvatarCol)\"\n ></praxis-rich-content\n ></span>\n } @case ('toggle') {\n <mat-slide-toggle\n [checked]=\"getToggleState(element, asItemColumn(column, it))\"\n [disabled]=\"isToggleDisabled(element, asItemColumn(column, it))\"\n [aria-label]=\"getToggleAriaLabel(element, asItemColumn(column, it)) || 'Alternar'\"\n (change)=\"onToggleChange(element, asItemColumn(column, it), $event)\"\n (click)=\"$event.stopPropagation()\"\n ></mat-slide-toggle>\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(element, asItemColumn(column, it)) || '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 (mi of getMenuItems(element, asItemColumn(column, it)); track\n mi.id) {\n <button\n mat-menu-item\n (click)=\"onMenuItemClick(mi, element, $event)\"\n [disabled]=\"!mi.__visible\"\n >\n <praxis-rich-content\n layout=\"inline\"\n rootClassName=\"pfx-menu-item__content\"\n [nodes]=\"getMenuItemRichContentNodes(mi)\"\n ></praxis-rich-content>\n </button>\n }\n </mat-menu>\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 >\n </praxis-table-rating>\n } @case ('html') {\n <span\n [innerHTML]=\"getSafeHtml(element, asItemColumn(column, it))\"\n ></span>\n }\n <!-- Value item: render base cell text alongside visuals -->\n @case ('value') {\n @let composeValue = getComposeItemValue(element, column, it);\n @if (composeValue !== null && composeValue !== undefined && composeValue !== '') {\n @let composeValueQuickView = getComposeValueQuickViewBinding(element, column, it);\n @if (composeValueQuickView) {\n <button\n type=\"button\"\n class=\"pfx-cell-value pfx-quick-view-trigger--button\"\n [ngClass]=\"getComposeValueClasses(it)\"\n [praxisQuickView]=\"composeValueQuickView\"\n [praxisQuickViewRecord]=\"element\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"hover-and-click\"\n (click)=\"$event.stopPropagation()\"\n >{{ composeValue }}</button>\n } @else {\n <span class=\"pfx-cell-value\" [ngClass]=\"getComposeValueClasses(it)\"\n >{{ composeValue }}</span\n >\n }\n }\n } } }\n </span>\n }\n <!-- Default text rendering -->\n @default {\n @let defaultCellValue = getCellValue(element, column);\n @let defaultCellQuickView = getEffectiveQuickViewBinding(element, column);\n @if (defaultCellQuickView && defaultCellValue !== null && defaultCellValue !== undefined && defaultCellValue !== '') {\n <button\n type=\"button\"\n class=\"pfx-cell-quick-view-btn pfx-quick-view-trigger--button\"\n [praxisQuickView]=\"defaultCellQuickView\"\n [praxisQuickViewRecord]=\"element\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"hover-and-click\"\n (click)=\"$event.stopPropagation()\"\n >{{ defaultCellValue }}</button>\n } @else {\n {{ defaultCellValue }}\n }\n } }\n </div>\n </td>\n </ng-container>\n } @if (config.actions?.row?.enabled) {\n <ng-container\n matColumnDef=\"_actions\"\n [sticky]=\"config.actions?.row?.sticky === true || config.actions?.row?.sticky === 'start'\"\n [stickyEnd]=\"config.actions?.row?.sticky === 'end'\"\n >\n <th\n mat-header-cell\n *matHeaderCellDef\n #actionsHeaderCell\n [style.width]=\"getRowActionsWidthStyle()\"\n class=\"praxis-actions-header\"\n [class.align-start]=\"getActionsHeaderAlign() === 'start'\"\n [class.align-center]=\"getActionsHeaderAlign() === 'center'\"\n [class.align-end]=\"getActionsHeaderAlign() === 'end'\"\n [class.pfx-sticky-boundary-start]=\"isActionsStickyStartBoundary()\"\n [class.pfx-sticky-boundary-end]=\"isActionsStickyEndBoundary()\"\n >\n <div\n class=\"praxis-actions-header__content\"\n [matTooltip]=\"getActionsHeaderTooltip() || ''\"\n [matTooltipDisabled]=\"!getActionsHeaderTooltip()\"\n >\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 [class.pfx-sticky-boundary-start]=\"isActionsStickyStartBoundary()\"\n [class.pfx-sticky-boundary-end]=\"isActionsStickyEndBoundary()\"\n [style.width]=\"getRowActionsWidthStyle()\"\n [attr.data-praxis-card-label]=\"getActionsHeaderLabel()\"\n [style.order]=\"isMobileCardModeActive() ? getMobileCardActionsOrder() : null\"\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' ||\n !config.actions?.row?.display) { @for (a of getInlineRowActions(row);\n track trackAction($index, a)) {\n <span\n class=\"praxis-row-action-anchor\"\n [matTooltip]=\"getActionTooltip(a, row)\"\n [matTooltipDisabled]=\"!getActionTooltip(a, row)\"\n [attr.tabindex]=\"isActionDisabled(a, row) ? 0 : null\"\n [attr.role]=\"isActionDisabled(a, row) ? 'note' : null\"\n [attr.aria-label]=\"isActionDisabled(a, row) ? ((a.label || getActionId(a)) + ': ' + getActionTooltip(a, row)) : null\"\n [attr.title]=\"isActionDisabled(a, row) ? getActionTooltip(a, row) : null\"\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 [busy]=\"isRowActionBusy(a, row)\"\n [disabled]=\"isActionDisabled(a, row) || isRowActionBusy(a, row)\"\n [praxisQuickView]=\"getRowActionQuickViewBinding(a)\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"hover-only\"\n (click)=\"onRowAction(getActionId(a), row, $event, getRowActionRuntimeOptions(a, row))\"\n [attr.aria-label]=\"a.label || getActionId(a)\"\n [attr.aria-description]=\"getActionAriaDescription(a, row)\"\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 <!-- Inline actions: buttons mode (show label + icon) -->\n @if (config.actions?.row?.display === 'buttons') { @for (a of\n getInlineRowActions(row); track trackAction($index, a)) {\n <span\n class=\"praxis-row-action-anchor\"\n [matTooltip]=\"getActionTooltip(a, row)\"\n [matTooltipDisabled]=\"!getActionTooltip(a, row)\"\n [attr.tabindex]=\"isActionDisabled(a, row) ? 0 : null\"\n [attr.role]=\"isActionDisabled(a, row) ? 'note' : null\"\n [attr.aria-label]=\"isActionDisabled(a, row) ? ((a.label || getActionId(a)) + ': ' + getActionTooltip(a, row)) : null\"\n [attr.title]=\"isActionDisabled(a, row) ? getActionTooltip(a, row) : null\"\n matTooltipPosition=\"above\"\n matTooltipClass=\"praxis-tooltip\"\n >\n <button\n mat-flat-button\n class=\"praxis-row-btn\"\n [disabled]=\"isActionDisabled(a, row) || isRowActionBusy(a, row)\"\n [attr.aria-busy]=\"isRowActionBusy(a, row) ? 'true' : null\"\n [praxisQuickView]=\"getRowActionQuickViewBinding(a)\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"hover-only\"\n (click)=\"onRowAction(getActionId(a), row, $event, getRowActionRuntimeOptions(a, row))\"\n [attr.aria-label]=\"a.label || getActionId(a)\"\n [attr.aria-description]=\"getActionAriaDescription(a, row)\"\n [color]=\"a.color || null\"\n >\n <praxis-rich-content\n layout=\"inline\"\n rootClassName=\"praxis-row-action__content\"\n [nodes]=\"getRowActionRichContentNodes(a, isRowActionBusy(a, row))\"\n ></praxis-rich-content>\n </button>\n </span>\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 (mouseenter)=\"onRowOverflowMenuTriggerHover(row)\"\n (focus)=\"onRowOverflowMenuTriggerHover(row)\"\n (click)=\"setActiveRowOverflowMenuTrigger(rowMoreMenuTrigger, $event.currentTarget)\"\n (menuOpened)=\"setActiveRowOverflowMenuTrigger(rowMoreMenuTrigger); onRowOverflowMenuOpened(row)\"\n (menuClosed)=\"onRowOverflowMenuClosed(rowMoreMenuTrigger)\"\n [attr.data-praxis-focus-key]=\"getRowActionFocusOriginKey(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\" panelClass=\"praxis-table-row-menu\">\n @if (hasRowOverflowMenuLoadingState(row) && getOverflowRowActions(row).length === 0) {\n <button mat-menu-item class=\"praxis-row-overflow-menu__item\" disabled>\n <mat-icon>hourglass_empty</mat-icon>\n <praxis-rich-content\n layout=\"inline\"\n rootClassName=\"praxis-row-overflow-menu__label\"\n [nodes]=\"getTableChromeTextRichContentNodes(getRowOverflowMenuLoadingLabel(), 'praxis-row-overflow-menu__label-text')\"\n ></praxis-rich-content>\n </button>\n } @for (a of getOverflowRowActions(row); track trackAction($index,\n a)) {\n <button\n mat-menu-item\n class=\"praxis-row-overflow-menu__item\"\n (click)=\"onOverflowRowAction(getActionId(a), row, $event, getRowActionRuntimeOptions(a, row))\"\n [disabled]=\"isActionDisabled(a, row) || isRowActionBusy(a, row)\"\n [attr.aria-busy]=\"isRowActionBusy(a, row) ? 'true' : null\"\n [attr.aria-label]=\"a.label || getActionId(a)\"\n [attr.aria-description]=\"getActionAriaDescription(a, row)\"\n [attr.title]=\"getActionTooltip(a, row)\"\n [matTooltip]=\"getActionTooltip(a, row)\"\n [matTooltipDisabled]=\"!getActionTooltip(a, row)\"\n matTooltipPosition=\"left\"\n >\n <mat-icon\n [color]=\"a.color || null\"\n [praxisIcon]=\"a.icon\"\n ></mat-icon>\n <praxis-rich-content\n layout=\"inline\"\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 } @if (hasRowOverflowMenuEmptyState(row)) {\n <button mat-menu-item disabled>\n <mat-icon>info</mat-icon>\n <praxis-rich-content\n layout=\"inline\"\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 mat-header-row *matHeaderRowDef=\"displayedColumns\"></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.data-keyboard-row-identity]=\"getKeyboardRowIdentity(row, i)\"\n [attr.tabindex]=\"getRowTabIndex(row, i)\"\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 (focus)=\"onRowFocused(row, i)\"\n (keydown)=\"onRowKeydown($event, 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); @if\n (detailState.status === 'loading') {\n <div\n class=\"pfx-expansion-detail-message\"\n role=\"status\"\n aria-live=\"polite\"\n >\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 { @if (getExpansionDetailLayout(detailState.schema) ===\n 'tabs') { @let detailTabs =\n getExpansionDetailTabs(detailState.schema); @if (detailTabs.length) {\n <div\n class=\"pfx-expansion-detail-tabs\"\n role=\"tablist\"\n aria-label=\"Se\u00C3\u00A7\u00C3\u00B5es do detail\"\n >\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) { @if\n (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\n 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 { @for (childNode of getExpansionDetailNodeChildren(tab);\n track $index) {\n <ng-container\n *ngTemplateOutlet=\"\n expansionDetailNodeTemplate;\n context: { $implicit: childNode, row: row, index: i }\n \"\n ></ng-container>\n } }\n </div>\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 } } @else {\n <div class=\"pfx-expansion-detail-stack\">\n @for (node of getExpansionDetailItems(detailState.schema); track\n $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 <ng-template\n #expansionDetailNodeTemplate\n let-node\n let-row=\"row\"\n let-index=\"index\"\n >\n @if (!isExpansionDetailNodeVisible(node, row, index)) {} @else if (getExpansionDetailRichContentNodes(node, row, index); as\n richNodes) {\n <praxis-rich-content\n class=\"pfx-expansion-node-host\"\n [nodes]=\"richNodes\"\n [context]=\"getExpansionDetailRichContentContext(row, index, node)\"\n ></praxis-rich-content>\n } @else { @switch (getExpansionDetailNodeType(node)) { @case\n ('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); @let\n listEntries = getExpansionDetailListEntries(row, node); @if\n (listItems.length) {\n <ul>\n @for (entry of listEntries; track $index) {\n <li>\n @if (getExpansionDetailListItemRichContentNodes(entry); as\n 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 { {{ formatExpansionDetailListEntry(entry) }} }\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 } @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,\n node); @if (richListEntries.length) {\n <div class=\"pfx-expansion-node-rich-list__items\">\n @for (entry of richListEntries; track $index) {\n <article\n [class]=\"getExpansionDetailRichListItemClassName(node)\"\n >\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,\n row, index, entry, $index); @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 } @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\n $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 } @case ('cardGrid') {\n <section class=\"pfx-expansion-node pfx-expansion-node-card-grid\">\n @if (getExpansionDetailCardGridHeaderNodes(node); as\n cardGridHeaderNodes) { @if (cardGridHeaderNodes.length) {\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-card-grid__header\"\n [nodes]=\"cardGridHeaderNodes\"\n [context]=\"getExpansionDetailRichContentContext(row, index, node)\"\n ></praxis-rich-content>\n } } @let gridCards = getExpansionDetailCardGridCards(node); @if\n (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, node)\"\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, node)\"\n ></praxis-rich-content>\n }\n </section>\n } @case ('richContent') {\n <div\n class=\"pfx-expansion-node-rich-content\"\n (click)=\"$event.stopPropagation()\"\n >\n <praxis-rich-content\n [document]=\"getExpansionDetailRichContentDocument(node)\"\n [layout]=\"getExpansionDetailRichContentLayout(node)\"\n [rootClassName]=\"node?.rootClassName || 'pfx-expansion-node-rich-content__document'\"\n [context]=\"getExpansionDetailRichContentContext(row, index, node)\"\n [hostCapabilities]=\"getExpansionDetailRichContentHostCapabilities(row)\"\n ></praxis-rich-content>\n </div>\n } @case ('richText') {\n <div\n class=\"pfx-expansion-node pfx-expansion-node-richtext\"\n [innerHTML]=\"getExpansionDetailRichText(node)\"\n ></div>\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\n 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 } @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\n 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 } @case ('chartRef') { @if\n (getExpansionDetailInlineRendererView(node, row, index); as\n inlineRenderer) {\n <section\n class=\"pfx-expansion-node pfx-expansion-node-embed pfx-expansion-node-embed--inline pfx-expansion-node-embed--chart\"\n >\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\n 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\n 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 } } @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\n 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 } @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 {\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\">\n{{ 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 } @if (getExpansionDetailEmbedAction(node, row, index); as\n 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 } @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\n 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 } @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,\n row, index); @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 } @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(bottomDetailText('tabOutside'), 'pfx-expansion-node-placeholder__text')\"\n [context]=\"getExpansionDetailRichContentContext(row, index)\"\n ></praxis-rich-content>\n </div>\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 </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 </table>\n }\n\n <!-- Virtual rows path (header preserved above) -->\n @if (shouldRenderDataSurface() && !schemaError && !dataError &&\n 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 [attr.aria-label]=\"getTableAriaLabel()\"\n [ngClass]=\"getTableElevationClassName()\"\n [class.table-stack-top]=\"hasTopToolbarStack()\"\n [class.table-rounded-bottom]=\"!hasBottomTableStack()\"\n [style.width]=\"getVirtualTableWidthStyle()\"\n >\n <tbody>\n <tr\n 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.data-keyboard-row-identity]=\"getKeyboardRowIdentity(row, i)\"\n [attr.tabindex]=\"getRowTabIndex(row, i)\"\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 (focus)=\"onRowFocused(row, i)\"\n (keydown)=\"onRowKeydown($event, row, i)\"\n >\n <!-- Selection column -->\n @if (isSelectionColumnEnabled()) {\n <td class=\"mat-mdc-cell\">\n <mat-checkbox\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleRow(row)\"\n [checked]=\"selection.isSelected(row)\"\n [aria-label]=\"getRowSelectionAriaLabel(row, i)\"\n >\n </mat-checkbox>\n </td>\n }\n <!-- Data columns -->\n @for (column of visibleColumns; track column.field) {\n <td\n 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 >\n <div\n class=\"pfx-cell-content\"\n [ngClass]=\"getCellContentClasses(row, column)\"\n [ngStyle]=\"getCellContentNgStyle(row, column)\"\n >\n @switch (getEffectiveRendererType(row, column)) { @case ('icon') {\n <span\n 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 [praxisQuickView]=\"getEffectiveQuickViewBinding(row, column)\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n >\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 } @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 } @case ('badge') { @if (shouldRenderBadge(row, column)) {\n <span\n class=\"pfx-badge\"\n [ngClass]=\"getBadgeClasses(row, column)\"\n [praxisQuickView]=\"getEffectiveQuickViewBinding(row, column)\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-badge__content\"\n [nodes]=\"getBadgeRichContentNodes(row, column)\"\n ></praxis-rich-content>\n </span>\n } } @case ('chip') { @if (shouldRenderChip(row, column)) {\n <span\n class=\"pfx-chip\"\n [ngClass]=\"getChipClasses(row, column)\"\n [praxisQuickView]=\"getEffectiveQuickViewBinding(row, column)\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-chip__content\"\n [nodes]=\"getChipRichContentNodes(row, column)\"\n ></praxis-rich-content>\n </span>\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 } @case ('microVisualization') {\n <span\n class=\"pfx-micro-viz-cell\"\n [innerHTML]=\"getMicroVisualizationHtml(row, column)\"\n ></span>\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 } @case ('link') {\n @let vLinkQuickView = getEffectiveQuickViewBinding(row, column);\n @let vLinkHref = getLinkHref(row, column);\n @if (vLinkQuickView && !vLinkHref) {\n <button\n type=\"button\"\n class=\"pfx-link pfx-quick-view-trigger--button\"\n [praxisQuickView]=\"vLinkQuickView\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"hover-and-click\"\n [attr.aria-label]=\"getLinkText(row, column) || column.header\"\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 </button>\n } @else if (vLinkQuickView && vLinkHref) {\n <span class=\"pfx-link-with-quick-view\">\n <a\n class=\"pfx-link\"\n [attr.href]=\"vLinkHref\"\n [attr.target]=\"getLinkTarget(row, column) || null\"\n [attr.rel]=\"getLinkRel(row, column) || null\"\n [praxisQuickView]=\"vLinkQuickView\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"hover-only\"\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 <button\n type=\"button\"\n class=\"pfx-quick-view-adjacent-btn\"\n [praxisQuickView]=\"vLinkQuickView\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"explicit-button\"\n [attr.aria-label]=\"getQuickViewTriggerAriaLabel(getLinkText(row, column), column)\"\n (click)=\"$event.stopPropagation()\"\n >\n <mat-icon class=\"pfx-quick-view-adjacent-btn__icon\" aria-hidden=\"true\">info_outline</mat-icon>\n </button>\n </span>\n } @else {\n <a\n class=\"pfx-link\"\n [attr.href]=\"vLinkHref || 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') { @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 } @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 } @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 } } } @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 layout=\"inline\"\n rootClassName=\"pfx-menu-item__content\"\n [nodes]=\"getMenuItemRichContentNodes(it)\"\n ></praxis-rich-content>\n </button>\n }\n </mat-menu>\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 } @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 } @case ('html') {\n <span [innerHTML]=\"getSafeHtml(row, column)\"></span>\n } @case ('compose') {\n <span\n class=\"pfx-cell-compose\"\n [ngClass]=\"getComposeClasses(row, column)\"\n [ngStyle]=\"getComposeGapStyle(row, column)\"\n >\n @for (it of getComposeItems(row, column); track\n trackComposeItem($index, it)) { @switch\n (getItemEffectiveType(row, column, it)) { @case ('icon') {\n @let vComposeIconCol = asItemColumn(column, it);\n <span\n class=\"pfx-icon-renderer\"\n [style.color]=\"getIconColor(row, vComposeIconCol) || null\"\n [ngStyle]=\"getIconStyle(row, vComposeIconCol)\"\n [attr.aria-label]=\"getIconAriaLabel(row, vComposeIconCol) || null\"\n [praxisQuickView]=\"getEffectiveQuickViewBinding(row, vComposeIconCol)\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n ><praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-icon-renderer__content\"\n [nodes]=\"getIconRichContentNodes(row, vComposeIconCol)\"\n ></praxis-rich-content\n ></span>\n } @case ('image') {\n <span class=\"pfx-cell-image\"\n ><praxis-rich-content\n rootClassName=\"pfx-cell-image__content\"\n [nodes]=\"getImageRichContentNodes(row, asItemColumn(column, it))\"\n ></praxis-rich-content\n ></span>\n } @case ('badge') {\n @let vComposeBadgeCol = asItemColumn(column, it);\n @if (shouldRenderBadge(row, vComposeBadgeCol)) {\n <span\n class=\"pfx-badge\"\n [ngClass]=\"getBadgeClasses(row, vComposeBadgeCol)\"\n [praxisQuickView]=\"getEffectiveQuickViewBinding(row, vComposeBadgeCol)\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n ><praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-badge__content\"\n [nodes]=\"getBadgeRichContentNodes(row, vComposeBadgeCol)\"\n ></praxis-rich-content\n ></span>\n } } @case ('link') {\n @let vComposeLinkCol = asItemColumn(column, it);\n @let vComposeLinkQuickView = getEffectiveQuickViewBinding(row, vComposeLinkCol);\n @let vComposeLinkHref = getLinkHref(row, vComposeLinkCol);\n @if (vComposeLinkQuickView && !vComposeLinkHref) {\n <button\n type=\"button\"\n class=\"pfx-link pfx-quick-view-trigger--button\"\n [praxisQuickView]=\"vComposeLinkQuickView\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"hover-and-click\"\n [attr.aria-label]=\"getLinkText(row, vComposeLinkCol) || column.header\"\n (click)=\"$event.stopPropagation()\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-link__content\"\n [nodes]=\"getLinkRichContentNodes(row, vComposeLinkCol)\"\n ></praxis-rich-content>\n </button>\n } @else if (vComposeLinkQuickView && vComposeLinkHref) {\n <span class=\"pfx-link-with-quick-view\">\n <a\n class=\"pfx-link\"\n [attr.href]=\"vComposeLinkHref\"\n [attr.target]=\"getLinkTarget(row, vComposeLinkCol) || null\"\n [attr.rel]=\"getLinkRel(row, vComposeLinkCol) || null\"\n [praxisQuickView]=\"vComposeLinkQuickView\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"hover-only\"\n (click)=\"$event.stopPropagation()\"\n ><praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-link__content\"\n [nodes]=\"getLinkRichContentNodes(row, vComposeLinkCol)\"\n ></praxis-rich-content\n ></a>\n <button\n type=\"button\"\n class=\"pfx-quick-view-adjacent-btn\"\n [praxisQuickView]=\"vComposeLinkQuickView\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"explicit-button\"\n [attr.aria-label]=\"getQuickViewTriggerAriaLabel(getLinkText(row, vComposeLinkCol), vComposeLinkCol)\"\n (click)=\"$event.stopPropagation()\"\n >\n <mat-icon class=\"pfx-quick-view-adjacent-btn__icon\" aria-hidden=\"true\">info_outline</mat-icon>\n </button>\n </span>\n } @else {\n <a\n class=\"pfx-link\"\n [attr.href]=\"vComposeLinkHref || null\"\n [attr.target]=\"getLinkTarget(row, vComposeLinkCol) || null\"\n [attr.rel]=\"getLinkRel(row, vComposeLinkCol) || null\"\n (click)=\"$event.stopPropagation()\"\n ><praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-link__content\"\n [nodes]=\"getLinkRichContentNodes(row, vComposeLinkCol)\"\n ></praxis-rich-content\n ></a>\n }\n } @case ('button') { @switch (getButtonVariant(row,\n asItemColumn(column, it))) { @case ('outlined') {\n <button\n mat-stroked-button\n [color]=\"getButtonColor(row, asItemColumn(column, it)) || null\"\n [disabled]=\"isButtonDisabled(row, asItemColumn(column, it))\"\n [attr.aria-label]=\"getButtonAriaLabel(row, asItemColumn(column, it)) || getButtonLabel(row, asItemColumn(column, it))\"\n (click)=\"onButtonClick(row, asItemColumn(column, it), $event)\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-button-renderer__content\"\n [nodes]=\"getButtonRichContentNodes(row, asItemColumn(column, it))\"\n ></praxis-rich-content>\n </button>\n } @case ('text') {\n <button\n mat-button\n [color]=\"getButtonColor(row, asItemColumn(column, it)) || null\"\n [disabled]=\"isButtonDisabled(row, asItemColumn(column, it))\"\n [attr.aria-label]=\"getButtonAriaLabel(row, asItemColumn(column, it)) || getButtonLabel(row, asItemColumn(column, it))\"\n (click)=\"onButtonClick(row, asItemColumn(column, it), $event)\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-button-renderer__content\"\n [nodes]=\"getButtonRichContentNodes(row, asItemColumn(column, it))\"\n ></praxis-rich-content>\n </button>\n } @default {\n <button\n mat-flat-button\n [color]=\"getButtonColor(row, asItemColumn(column, it)) || null\"\n [disabled]=\"isButtonDisabled(row, asItemColumn(column, it))\"\n [attr.aria-label]=\"getButtonAriaLabel(row, asItemColumn(column, it)) || getButtonLabel(row, asItemColumn(column, it))\"\n (click)=\"onButtonClick(row, asItemColumn(column, it), $event)\"\n >\n <praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-button-renderer__content\"\n [nodes]=\"getButtonRichContentNodes(row, asItemColumn(column, it))\"\n ></praxis-rich-content>\n </button>\n } } } @case ('chip') {\n @let vComposeChipCol = asItemColumn(column, it);\n @if (shouldRenderChip(row, vComposeChipCol)) {\n <span\n class=\"pfx-chip\"\n [ngClass]=\"getChipClasses(row, vComposeChipCol)\"\n [praxisQuickView]=\"getEffectiveQuickViewBinding(row, vComposeChipCol)\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n ><praxis-rich-content\n [layout]=\"'inline'\"\n rootClassName=\"pfx-chip__content\"\n [nodes]=\"getChipRichContentNodes(row, vComposeChipCol)\"\n ></praxis-rich-content\n ></span>\n } } @case ('progress') {\n <div class=\"pfx-progress\">\n <praxis-rich-content\n rootClassName=\"pfx-progress__content\"\n [context]=\"getProgressRichContentContext(row, asItemColumn(column, it))\"\n [nodes]=\"getProgressRichContentNodes(row, asItemColumn(column, it))\"\n ></praxis-rich-content>\n </div>\n } @case ('microVisualization') {\n <span\n class=\"pfx-micro-viz-cell\"\n [innerHTML]=\"getMicroVisualizationHtml(row, asItemColumn(column, it))\"\n ></span>\n } @case ('avatar') {\n <span\n class=\"pfx-avatar-renderer\"\n [ngStyle]=\"getAvatarStyle(row, asItemColumn(column, it))\"\n [class.shape-rounded]=\"getAvatarShape(row, asItemColumn(column, it)) === 'rounded'\"\n [class.shape-circle]=\"getAvatarShape(row, asItemColumn(column, it)) === 'circle'\"\n ><praxis-rich-content\n rootClassName=\"pfx-avatar-renderer__content\"\n [nodes]=\"getAvatarRichContentNodes(row, asItemColumn(column, it))\"\n ></praxis-rich-content\n ></span>\n } @case ('toggle') {\n <mat-slide-toggle\n [checked]=\"getToggleState(row, asItemColumn(column, it))\"\n [disabled]=\"isToggleDisabled(row, asItemColumn(column, it))\"\n [aria-label]=\"getToggleAriaLabel(row, asItemColumn(column, it)) || 'Alternar'\"\n (change)=\"onToggleChange(row, asItemColumn(column, it), $event)\"\n (click)=\"$event.stopPropagation()\"\n ></mat-slide-toggle>\n } @case ('menu') {\n <button\n type=\"button\"\n praxisIconButton=\"more_vert\"\n presentation=\"projected\"\n size=\"compact\"\n [matMenuTriggerFor]=\"composeMenuRef\"\n (click)=\"$event.stopPropagation()\"\n [attr.aria-label]=\"getMenuAriaLabel(row, asItemColumn(column, it)) || 'Menu'\"\n >\n <praxis-rich-content\n rootClassName=\"pfx-menu-trigger__content\"\n [nodes]=\"getMenuTriggerRichContentNodes()\"\n ></praxis-rich-content>\n </button>\n <mat-menu #composeMenuRef=\"matMenu\">\n @for (mi of getMenuItems(row, asItemColumn(column, it)); track\n mi.id) {\n <button\n mat-menu-item\n (click)=\"onMenuItemClick(mi, row, $event)\"\n [disabled]=\"!mi.__visible\"\n >\n <praxis-rich-content\n layout=\"inline\"\n rootClassName=\"pfx-menu-item__content\"\n [nodes]=\"getMenuItemRichContentNodes(mi)\"\n ></praxis-rich-content>\n </button>\n }\n </mat-menu>\n } @case ('rating') {\n <praxis-table-rating\n class=\"pfx-rating-cell\"\n [itemsCount]=\"getRatingMax(row, asItemColumn(column, it))\"\n [value]=\"getRatingValue(row, asItemColumn(column, it))\"\n [size]=\"getRatingSize(row, asItemColumn(column, it))\"\n [ratingColor]=\"getRatingColor(row, asItemColumn(column, it))\"\n [outlineColor]=\"getRatingOutlineColor(row, asItemColumn(column, it))\"\n [ariaLabel]=\"getRatingAriaLabel(row, asItemColumn(column, it)) || column.header\"\n ></praxis-table-rating>\n } @case ('html') {\n <span\n [innerHTML]=\"getSafeHtml(row, asItemColumn(column, it))\"\n ></span>\n } @case ('value') {\n @let composeValue = getComposeItemValue(row, column, it);\n @if (composeValue !== null && composeValue !== undefined && composeValue !== '') {\n @let vComposeValueQuickView = getComposeValueQuickViewBinding(row, column, it);\n @if (vComposeValueQuickView) {\n <button\n type=\"button\"\n class=\"pfx-cell-value pfx-quick-view-trigger--button\"\n [ngClass]=\"getComposeValueClasses(it)\"\n [praxisQuickView]=\"vComposeValueQuickView\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"hover-and-click\"\n (click)=\"$event.stopPropagation()\"\n >{{ composeValue }}</button>\n } @else {\n <span\n class=\"pfx-cell-value\"\n [ngClass]=\"getComposeValueClasses(it)\"\n >{{ composeValue }}</span\n >\n }\n }\n } } }\n </span>\n } @default {\n @let vDefaultCellQuickView = getEffectiveQuickViewBinding(row, column);\n @if (vDefaultCellQuickView) {\n <button\n type=\"button\"\n class=\"pfx-cell-quick-view-btn pfx-quick-view-trigger--button\"\n [praxisQuickView]=\"vDefaultCellQuickView\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"hover-and-click\"\n (click)=\"$event.stopPropagation()\"\n >{{ getCellValue(row, column) }}</button>\n } @else {\n {{ getCellValue(row, column) }}\n }\n } }\n </div>\n </td>\n }\n\n <!-- Actions column -->\n @if (config.actions?.row?.enabled) {\n <td\n class=\"mat-mdc-cell 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 @if (config.actions?.row?.display === 'icons' ||\n !config.actions?.row?.display) { @for (a of\n getInlineRowActions(row); track trackAction($index, a)) {\n <span\n class=\"praxis-row-action-anchor\"\n [matTooltip]=\"getActionTooltip(a, row)\"\n [matTooltipDisabled]=\"!getActionTooltip(a, row)\"\n [attr.tabindex]=\"isActionDisabled(a, row) ? 0 : null\"\n [attr.role]=\"isActionDisabled(a, row) ? 'note' : null\"\n [attr.aria-label]=\"isActionDisabled(a, row) ? ((a.label || getActionId(a)) + ': ' + getActionTooltip(a, row)) : null\"\n [attr.title]=\"isActionDisabled(a, row) ? getActionTooltip(a, row) : null\"\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 [busy]=\"isRowActionBusy(a, row)\"\n [disabled]=\"isActionDisabled(a, row) || isRowActionBusy(a, row)\"\n [praxisQuickView]=\"getRowActionQuickViewBinding(a)\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"hover-only\"\n (click)=\"onRowAction(getActionId(a), row, $event, getRowActionRuntimeOptions(a, row))\"\n [attr.aria-label]=\"a.label || getActionId(a)\"\n [attr.aria-description]=\"getActionAriaDescription(a, row)\"\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 } } @if (config.actions?.row?.display === 'buttons') { @for (a of\n getInlineRowActions(row); track trackAction($index, a)) {\n <span\n class=\"praxis-row-action-anchor\"\n [matTooltip]=\"getActionTooltip(a, row)\"\n [matTooltipDisabled]=\"!getActionTooltip(a, row)\"\n [attr.tabindex]=\"isActionDisabled(a, row) ? 0 : null\"\n [attr.role]=\"isActionDisabled(a, row) ? 'note' : null\"\n [attr.aria-label]=\"isActionDisabled(a, row) ? ((a.label || getActionId(a)) + ': ' + getActionTooltip(a, row)) : null\"\n [attr.title]=\"isActionDisabled(a, row) ? getActionTooltip(a, row) : null\"\n matTooltipPosition=\"above\"\n matTooltipClass=\"praxis-tooltip\"\n >\n <button\n mat-flat-button\n class=\"praxis-row-btn\"\n [disabled]=\"isActionDisabled(a, row) || isRowActionBusy(a, row)\"\n [attr.aria-busy]=\"isRowActionBusy(a, row) ? 'true' : null\"\n [praxisQuickView]=\"getRowActionQuickViewBinding(a)\"\n [praxisQuickViewRecord]=\"row\"\n [praxisQuickViewEndpointKey]=\"getQuickViewEndpointKey()\"\n praxisQuickViewTriggerMode=\"hover-only\"\n (click)=\"onRowAction(getActionId(a), row, $event, getRowActionRuntimeOptions(a, row))\"\n [attr.aria-label]=\"a.label || getActionId(a)\"\n [attr.aria-description]=\"getActionAriaDescription(a, row)\"\n [color]=\"a.color || null\"\n >\n <praxis-rich-content\n layout=\"inline\"\n rootClassName=\"praxis-row-action__content\"\n [nodes]=\"getRowActionRichContentNodes(a, isRowActionBusy(a, row))\"\n ></praxis-rich-content>\n </button>\n </span>\n } } @if (hasOverflowRowActions(row)) {\n <button\n #rowMoreMenuTriggerV=\"matMenuTrigger\"\n type=\"button\"\n [praxisIconButton]=\"getRowMenuIcon()\"\n size=\"compact\"\n class=\"praxis-icon-btn praxis-more-btn\"\n [matMenuTriggerFor]=\"rowMoreMenuV\"\n (mouseenter)=\"onRowOverflowMenuTriggerHover(row)\"\n (focus)=\"onRowOverflowMenuTriggerHover(row)\"\n (click)=\"setActiveRowOverflowMenuTrigger(rowMoreMenuTriggerV, $event.currentTarget)\"\n (menuOpened)=\"setActiveRowOverflowMenuTrigger(rowMoreMenuTriggerV); onRowOverflowMenuOpened(row)\"\n (menuClosed)=\"onRowOverflowMenuClosed(rowMoreMenuTriggerV)\"\n [attr.data-praxis-focus-key]=\"getRowActionFocusOriginKey(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 #rowMoreMenuV=\"matMenu\" xPosition=\"before\" panelClass=\"praxis-table-row-menu\">\n @if (hasRowOverflowMenuLoadingState(row) && getOverflowRowActions(row).length === 0) {\n <button mat-menu-item class=\"praxis-row-overflow-menu__item\" disabled>\n <mat-icon>hourglass_empty</mat-icon>\n <praxis-rich-content\n layout=\"inline\"\n rootClassName=\"praxis-row-overflow-menu__label\"\n [nodes]=\"getTableChromeTextRichContentNodes(getRowOverflowMenuLoadingLabel(), 'praxis-row-overflow-menu__label-text')\"\n ></praxis-rich-content>\n </button>\n } @for (a of getOverflowRowActions(row); track\n trackAction($index, a)) {\n <button\n mat-menu-item\n class=\"praxis-row-overflow-menu__item\"\n (click)=\"onOverflowRowAction(getActionId(a), row, $event, getRowActionRuntimeOptions(a, row))\"\n [disabled]=\"isActionDisabled(a, row) || isRowActionBusy(a, row)\"\n [attr.aria-busy]=\"isRowActionBusy(a, row) ? 'true' : null\"\n [attr.aria-label]=\"a.label || getActionId(a)\"\n [attr.aria-description]=\"getActionAriaDescription(a, row)\"\n [attr.title]=\"getActionTooltip(a, row)\"\n [matTooltip]=\"getActionTooltip(a, row)\"\n [matTooltipDisabled]=\"!getActionTooltip(a, row)\"\n matTooltipPosition=\"left\"\n >\n <mat-icon\n [color]=\"a.color || null\"\n [praxisIcon]=\"a.icon\"\n ></mat-icon>\n <praxis-rich-content\n layout=\"inline\"\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 } @if (hasRowOverflowMenuEmptyState(row)) {\n <button mat-menu-item disabled>\n <mat-icon>info</mat-icon>\n <praxis-rich-content\n layout=\"inline\"\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</div>\n@if (shouldShowLoadingSurface()) {\n<div\n class=\"ptable-loading-state\"\n [class.ptable-loading-state--overlay]=\"getLoadingIndicatorPosition() === 'overlay'\"\n role=\"status\"\n aria-live=\"polite\"\n>\n @if (getLoadingIndicatorType() === 'skeleton') {\n <div\n class=\"ptable-loading-state__hero\"\n [class.ptable-loading-state__hero--static]=\"!isLoadingSkeletonAnimated()\"\n aria-hidden=\"true\"\n >\n <span\n class=\"ptable-loading-state__line ptable-loading-state__line--wide\"\n ></span>\n <span\n class=\"ptable-loading-state__line ptable-loading-state__line--short\"\n ></span>\n <div class=\"ptable-loading-state__rows\">\n @for (placeholder of getLoadingSkeletonRows(); track placeholder) {\n <div class=\"ptable-loading-state__row\">\n <span\n class=\"ptable-loading-state__cell ptable-loading-state__cell--short\"\n ></span>\n <span class=\"ptable-loading-state__cell\"></span>\n <span\n class=\"ptable-loading-state__cell ptable-loading-state__cell--wide\"\n ></span>\n </div>\n }\n </div>\n </div>\n } @else if (getLoadingIndicatorType() === 'progress') {\n <div class=\"ptable-loading-state__progress\" aria-hidden=\"true\">\n <span></span>\n </div>\n } @else {\n <span class=\"ptable-loading-state__spinner\" aria-hidden=\"true\"></span>\n }\n <div class=\"ptable-loading-state__message\">\n {{ getLoadingSurfaceMessage() }}\n </div>\n @if (canCancelLoad()) {\n <div class=\"ptable-loading-state__actions\">\n <button mat-stroked-button type=\"button\" (click)=\"cancelLoad()\">\n {{ getCancelLoadLabel() }}\n </button>\n </div>\n }\n</div>\n}\n</div>\n@if (shouldShowCancelledState()) {\n<div class=\"ptable-cancelled-state\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">\n <mat-icon aria-hidden=\"true\">pause_circle</mat-icon>\n <div class=\"ptable-cancelled-state__content\">\n <strong>{{ getCancelledLoadTitle() }}</strong>\n <span>{{ getCancelledLoadMessage() }}</span>\n </div>\n <button mat-stroked-button type=\"button\" (click)=\"retryCancelledLoad()\">\n <mat-icon aria-hidden=\"true\">refresh</mat-icon>\n {{ getTableErrorRetryLabel() }}\n </button>\n</div>\n} @if (shouldShowNoDataState()) {\n<div\n class=\"ptable-no-data-state\"\n [style.--p-table-empty-action-size]=\"getNoDataStateActionSize()\"\n [style.--p-table-empty-action-radius]=\"getNoDataStateActionRadius()\"\n>\n <span\n class=\"ptable-no-data-state__announcement\"\n role=\"status\"\n aria-live=\"polite\"\n >\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} @if ( shouldRenderDataSurface() && !schemaError && !dataError &&\nshouldRenderFloatingBulkActions() && getFloatingBulkActions().length &&\n!shouldHideFloatingBulkActions() ) {\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<ng-template #bottomDetailSurface>\n @let bottom = getBottomDetailState();\n @if (shouldRenderBottomDetailSurface(bottom)) {\n <section class=\"ptable-bottom-detail\" data-testid=\"table-bottom-detail\"\n [class.ptable-bottom-detail--dynamic]=\"isBottomDetailDynamicHeight()\"\n [class.ptable-bottom-detail--before-controls]=\"isBottomDetailBeforeControls()\"\n role=\"region\" [attr.aria-label]=\"bottom.title\" [attr.aria-busy]=\"bottom.status === 'loading'\">\n <header class=\"ptable-bottom-detail__header\">\n <span class=\"ptable-bottom-detail__identity\">\n <mat-icon aria-hidden=\"true\">dock_to_bottom</mat-icon>\n <span class=\"ptable-bottom-detail__heading\">\n <span class=\"ptable-bottom-detail__eyebrow\">{{ bottomDetailText('panelLabel') }}</span>\n <strong>{{ bottom.title }}</strong>\n </span>\n </span>\n <button type=\"button\" mat-button data-testid=\"table-bottom-detail-toggle\"\n [attr.aria-expanded]=\"!bottomDetailCollapsed()\" [attr.aria-controls]=\"tableId + '-bottom-detail-body'\"\n (click)=\"toggleBottomDetail()\">\n <mat-icon aria-hidden=\"true\">{{ bottomDetailCollapsed() ? 'expand_more' : 'expand_less' }}</mat-icon>\n {{ bottomDetailText(bottomDetailCollapsed() ? 'expand' : 'collapse') }}\n </button>\n </header>\n @if (!bottomDetailCollapsed()) {\n <div class=\"ptable-bottom-detail__body\" data-testid=\"table-bottom-detail-body\"\n [attr.id]=\"tableId + '-bottom-detail-body'\" [style.height.px]=\"getBottomDetailBodyHeight()\"\n role=\"group\" [attr.aria-label]=\"bottom.title\" tabindex=\"0\">\n @if (!bottom.detailState) {\n <span data-testid=\"table-bottom-detail-status\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">\n {{ bottom.message }}\n </span>\n }\n @if (bottom.detailState && bottom.row) {\n <ng-container *ngTemplateOutlet=\"tableDetailBodyTemplate;\n context: { detailState: bottom.detailState, row: bottom.row, index: bottom.index }\"\n ></ng-container>\n @if (bottom.status === 'blocked' || bottom.status === 'error') {\n <button type=\"button\" mat-button (click)=\"retryBottomDetail()\">{{ bottomDetailText('retry') }}</button>\n }\n }\n </div>\n }\n </section>\n }\n</ng-template>\n@if (isBottomDetailBeforeControls()) {\n <ng-container *ngTemplateOutlet=\"bottomDetailSurface\"></ng-container>\n}\n<!-- Barra de a\u00E7\u00F5es no rodap\u00E9 (opcional) -->\n@if (shouldRenderDataSurface() && !schemaError && showToolbar && shouldRenderFooterToolbar()) {\n <praxis-table-toolbar\n [config]=\"config\"\n [focusScope]=\"getFocusRestoreScope('footer')\"\n [backgroundColor]=\"getToolbarActionsBackgroundColor()\"\n [style.--pfx-filter-h]=\"getToolbarLayoutHeightHostStyle()\"\n [class.footer-flat]=\"hasSurfaceAfterFooterToolbar()\"\n class=\"praxis-toolbar-footer\"\n placement=\"footer\"\n [showMain]=\"shouldShowFooterToolbarMain()\"\n [showEndActions]=\"shouldShowFooterToolbarEndActions()\"\n [showActionsGroup]=\"shouldShowToolbarActionsBottom()\"\n [showMobileActions]=\"shouldShowToolbarActionsBottom()\"\n [evaluationContext]=\"getToolbarEvaluationContext()\"\n [activeQuickFilterId]=\"activeQuickFilterId\"\n [activeDensity]=\"resolveAppearanceDensity()\"\n [activeCrossFilters]=\"activeCrossFilters\"\n [columnVisibilityController]=\"toolbarColumnVisibilityController\"\n [exportBusy]=\"exportBusy\"\n [exportStatusMessage]=\"exportStatusMessage\"\n (toolbarAction)=\"onToolbarAction($event)\"\n (exportAction)=\"onExportAction($event)\"\n (quickFilterChange)=\"onQuickFilterChange($event)\"\n (densityChange)=\"onDensityChange($event)\"\n (clearCrossFilter)=\"onClearCrossFilter($event)\"\n (clearAllCrossFilters)=\"onClearAllCrossFilters()\"\n >\n @if (shouldShowFooterToolbarMain() && shouldRenderAdvancedFilter() && !filterTeleport) {\n <ng-container ngProjectAs=\"[advancedFilter]\" *ngTemplateOutlet=\"filterBarTemplate\" />\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 [pageIndex]=\"pageIndex\"\n [pageSize]=\"pageSize\"\n [pageSizeOptions]=\"getPaginationPageSizeOptions()\"\n [selectConfig]=\"paginatorSelectConfig\"\n [showFirstLastButtons]=\"getPaginationShowFirstLast()\"\n [disabled]=\"isTableDataLoading()\"\n (page)=\"onPageChange($event)\"\n [class.compact]=\"config.behavior?.pagination?.style === 'compact'\"\n [class.footer-stack]=\"shouldShowToolbarActionsBottom()\"\n [class.detail-stack]=\"hasBottomDetailAfterPaginator()\"\n >\n </mat-paginator>\n}\n@if (isBottomDetailAfterControls()) {\n <ng-container *ngTemplateOutlet=\"bottomDetailSurface\"></ng-container>\n}\n\n<!-- One renderer shared by row and contextual detail presentations. -->\n<ng-template #tableDetailBodyTemplate let-detailState=\"detailState\" let-row=\"row\" let-i=\"index\">\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(bottomDetailText('loading'), '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 || bottomDetailText('blocked'), '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\" [attr.aria-label]=\"bottomDetailText('sections')\">\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(bottomDetailText('tabsEmpty'), '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>\n <ng-template #expansionDetailNodeTemplate let-node let-row=\"row\" let-index=\"index\">\n @if (!isExpansionDetailNodeVisible(node, row, index)) {} @else 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, node)\"\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(getExpansionDetailListEmptyText(node), '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, bottomDetailText('collectionTitle')), '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, bottomDetailText('cardTitle')), '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 ('richContent') {\n <div\n class=\"pfx-expansion-node-rich-content\"\n (click)=\"$event.stopPropagation()\"\n >\n <praxis-rich-content\n [document]=\"getExpansionDetailRichContentDocument(node)\"\n [layout]=\"getExpansionDetailRichContentLayout(node)\"\n [rootClassName]=\"node?.rootClassName || 'pfx-expansion-node-rich-content__document'\"\n [context]=\"getExpansionDetailRichContentContext(row, index, node)\"\n [hostCapabilities]=\"getExpansionDetailRichContentHostCapabilities(row)\"\n ></praxis-rich-content>\n </div>\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, node)\"\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, node)\"\n ></praxis-rich-content>\n }\n </div>\n } @else {\n <praxis-rich-content\n rootClassName=\"pfx-expansion-node-placeholder\"\n [nodes]=\"getExpansionDetailTextRichContentNodes(bottomDetailText('itemsEmpty'), '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(bottomDetailText('tabOutside'), '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(bottomDetailText('unsupportedNode'), '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\n@if (isAnalyticalDrawerEnabled()) {\n <praxis-analytical-drawer\n [isOpen]=\"isAnalyticalDrawerOpen\"\n [drawerConfig]=\"config?.behavior?.drawer || null\"\n [resourcePath]=\"resourcePath\"\n [row]=\"analyticalDrawerRow\"\n (closeDrawer)=\"closeAnalyticalDrawer()\"\n (tabChange)=\"onAnalyticalDrawerTabChange($event)\"\n />\n}\n", styles: ["@charset \"UTF-8\";.pfx-micro-viz-cell{position:relative;display:inline-block;width:min(100%,210px);min-width:112px;max-width:240px;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) 78%,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;z-index:2;background:var(--md-sys-color-on-surface, #111827);box-shadow:0 0 0 .75px var(--md-sys-color-surface, #ffffff)}.pfx-micro-bullet__target[style*=\"left: 100%\"],.pfx-micro-bullet__target[style*=\"left: 100.00%\"]{transform:translate(-100%)}.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:static;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],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-trend__scrub-slice[data-tone=success]{color:var(--p-table-state-success-fg, #168a4a)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz[data-tone=warning],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-trend__scrub-slice[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],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-trend__scrub-slice[data-tone=danger],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-trend__scrub-slice[data-tone=critical]{color:var(--p-table-state-danger-fg, #b3261e)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz[data-tone=info],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-trend__scrub-slice[data-tone=info]{color:var(--md-sys-color-primary, #2563eb)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz[data-tone=neutral],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-trend__scrub-slice[data-tone=neutral]{color:var(--md-sys-color-secondary, #5c6b73)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz{position:relative;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{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__segments{position:static;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);transform-origin:left center;animation:pfxMicroBarGrow var(--p-table-microviz-animation-duration, .32s) cubic-bezier(.22,1,.36,1) both;transition:opacity .15s ease,filter .15s ease,transform .15s ease}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__row[data-tone=success] .pfx-micro-viz__bar,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__segment[data-tone=success],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz[data-tone=success] .pfx-micro-viz__bar{background:var(--p-table-state-success-fg, #168a4a)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__row[data-tone=warning] .pfx-micro-viz__bar,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__segment[data-tone=warning],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz[data-tone=warning] .pfx-micro-viz__bar{background:var(--p-table-state-warning-fg, #b45f06)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__row[data-tone=danger] .pfx-micro-viz__bar,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__row[data-tone=critical] .pfx-micro-viz__bar,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__segment[data-tone=danger],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__segment[data-tone=critical],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz[data-tone=danger] .pfx-micro-viz__bar,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz[data-tone=critical] .pfx-micro-viz__bar{background:var(--p-table-state-danger-fg, #b3261e)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__row[data-tone=info] .pfx-micro-viz__bar,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__segment[data-tone=info],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz[data-tone=info] .pfx-micro-viz__bar{background:var(--md-sys-color-primary, #2563eb)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__row[data-tone=neutral] .pfx-micro-viz__bar,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__segment[data-tone=neutral],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz[data-tone=neutral] .pfx-micro-viz__bar{background:var(--md-sys-color-secondary, #5c6b73)}: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) 78%,transparent)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__bullet{display:flex;align-items:center;gap:8px;width:100%}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__track{position:relative;display:block;flex:1 1 auto;min-width:48px;block-size:var(--pfx-bullet-bar-height, 8px);overflow:hidden;border-radius:var(--pfx-micro-track-radius, 999px);background:var(--pfx-micro-track-color, var(--md-sys-color-surface-container-high, #e5e7eb));transition:transform .15s ease}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__bullet:hover .pfx-micro-bullet__track{transform:scaleY(1.18)}: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:1px;inset-inline-start:0;block-size:calc(100% - 2px);border-radius:inherit;transform-origin:left center;animation:pfxMicroBarGrow var(--p-table-microviz-animation-duration, .32s) cubic-bezier(.22,1,.36,1) both}: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);transition:transform .15s ease}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__target[style*=\"left: 100%\"],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__target[style*=\"left: 100.00%\"]{transform:translate(-100%)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__compact-value{flex:0 0 auto;font-size:11px;font-weight:600;line-height:1;color:var(--md-sys-color-on-surface, #1f2937);white-space:nowrap;font-variant-numeric:tabular-nums;text-align:right}: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-bullet__range[data-tone=neutral],:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-bullet__actual[data-tone=neutral]{background:var(--md-sys-color-secondary, #5c6b73)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__row{position:relative;display:grid;grid-template-columns:minmax(42px,.8fr) minmax(52px,1fr) auto;align-items:center;gap:6px;min-width:0;transition:opacity .15s ease}: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{position:static;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;animation:pfxMicroPopIn var(--p-table-microviz-animation-duration, .28s) cubic-bezier(.22,1,.36,1) both}: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);transition:transform .16s ease}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz.pfx-micro-viz__delta[data-direction=up]:hover .pfx-micro-viz__delta-symbol{transform:translateY(-2px)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz.pfx-micro-viz__delta[data-direction=down]:hover .pfx-micro-viz__delta-symbol{transform:translateY(1.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{position:static;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;transition:transform .18s ease}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz.pfx-micro-viz__radial:hover .pfx-micro-radial-svg,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz.pfx-micro-viz__harvey:hover .pfx-micro-harvey-svg{transform:scale(1.08)}: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%;animation:pfxMicroPopIn var(--p-table-microviz-animation-duration, .32s) cubic-bezier(.22,1,.36,1) both}: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;transition:transform .18s ease}: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%;animation:pfxMicroPopIn var(--p-table-microviz-animation-duration, .32s) cubic-bezier(.22,1,.36,1) both}: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{position:relative;display:inline-flex;align-items:center;justify-content:center;width:100%;min-width:112px;overflow:visible}: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{position:relative;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;stroke-dasharray:240;stroke-dashoffset:0;animation:pfxMicroLineDraw var(--p-table-microviz-animation-duration, .32s) cubic-bezier(.22,1,.36,1) both}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-area__fill{fill:currentColor;animation:pfxMicroAreaFade var(--p-table-microviz-animation-duration, .32s) ease both}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-trend__ref-line{stroke:var(--md-sys-color-on-surface-variant, #6b7280);stroke-width:1px;stroke-dasharray:2 2;opacity:.55}: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{transform-box:fill-box;transform-origin:center bottom;animation:pfxMicroColGrow var(--p-table-microviz-animation-duration, .32s) cubic-bezier(.22,1,.36,1) both;transition:opacity .14s ease,filter .14s ease}: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__fallback{display:inline-flex;align-items:center;font-size:var(--pfx-micro-fallback-font-size, 12px);color:var(--md-sys-color-on-surface-variant, #6b7280);line-height:1.2;-webkit-user-select:text;user-select:text}: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{position:static;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;animation:pfxMicroPopIn var(--p-table-microviz-animation-duration, .28s) cubic-bezier(.22,1,.36,1) both;transition:transform .15s ease,box-shadow .15s ease}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__node[data-active=true]{box-shadow:0 0 0 3px color-mix(in srgb,currentColor 22%,transparent)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__node-wrapper:hover .pfx-micro-step__node{transform:scale(1.12)}: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)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__comparison:hover .pfx-micro-viz__row:not(:hover){opacity:.45}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__segments:hover .pfx-micro-viz__segment:not(:hover){opacity:.42}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__segments .pfx-micro-viz__segment:hover{filter:brightness(1.08)}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-trend__scrub-layer{position:absolute;inset:0;display:flex;align-items:stretch;z-index:2}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-trend__scrub-slice{position:static;flex:1 1 0%;height:100%;cursor:crosshair}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-trend__scrub-slice:hover:before{content:\"\";position:absolute;left:var(--pfx-scrub-x, 50%);top:var(--pfx-scrub-y, 50%);width:7px;height:7px;border-radius:50%;background:currentColor;border:1.5px solid var(--md-sys-color-surface, #ffffff);box-shadow:0 1px 4px #00000040;transform:translate(-50%,-50%);pointer-events:none;z-index:3}:host ::ng-deep .mat-mdc-cell:has(.pfx-micro-viz-cell),:host ::ng-deep .mat-mdc-cell:has(.pfx-micro-viz-cell) .pfx-cell-content{overflow:visible}:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz[data-micro-readout]:hover:after,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz[data-micro-readout]:focus-visible:after,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__row[data-micro-readout]:hover:after,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz__segment[data-micro-readout]:hover:after,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-step__node-wrapper[data-micro-readout]:hover:after,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-trend__scrub-slice[data-micro-readout]:hover:after{content:attr(data-micro-readout);position:absolute;inset-block-end:calc(100% + 4px);inset-inline-start:0;z-index:20;max-width:none;padding:3px 8px;border-radius:6px;background:var(--md-sys-color-surface-container-highest, #1e293b);color:var(--md-sys-color-on-surface, #f8fafc);border:1px solid var(--md-sys-color-outline-variant, rgba(148, 163, 184, .35));font-family:var(--md-sys-typescale-body-medium-font-family, sans-serif);font-size:10.5px;font-weight:600;font-variant-numeric:tabular-nums;line-height:1.25;white-space:nowrap;box-shadow:0 4px 12px #0f172a3d;pointer-events:none}@keyframes pfxMicroBarGrow{0%{transform:scaleX(0)}to{transform:scaleX(1)}}@keyframes pfxMicroColGrow{0%{transform:scaleY(0)}to{transform:scaleY(1)}}@keyframes pfxMicroLineDraw{0%{stroke-dashoffset:240}to{stroke-dashoffset:0}}@keyframes pfxMicroAreaFade{0%{opacity:0}to{opacity:1}}@keyframes pfxMicroPopIn{0%{opacity:.4;transform:scale(.88)}to{opacity:1;transform:scale(1)}}@media(prefers-reduced-motion:reduce),print{:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz *,:host ::ng-deep .pfx-micro-viz-cell .pfx-micro-viz{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}}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{box-sizing:border-box;width:var(--p-table-visible-viewport-width, 100%);max-width:100%;position:sticky;left:0;container-type:inline-size;padding:16px 20px;border-left:3px solid var(--md-sys-color-primary);background:color-mix(in srgb,var(--md-sys-color-surface-container-low, var(--p-table-bg)) 92%,var(--md-sys-color-primary, transparent) 8%)}.ptable-bottom-detail{min-width:0;overflow:hidden;border:1px solid var(--p-table-border-color);border-top:0;border-radius:0 0 12px 12px;background:var(--p-table-bg, var(--mat-sys-surface, var(--md-sys-color-surface)));color:var(--mat-sys-on-surface, var(--md-sys-color-on-surface));box-shadow:var(--p-table-surface-shadow)}.ptable-bottom-detail--before-controls{border-radius:0;box-shadow:none}.ptable-bottom-detail__header{display:flex;align-items:center;justify-content:space-between;gap:16px;min-height:56px;padding:6px 14px 6px 16px;border-bottom:1px solid color-mix(in srgb,var(--p-table-border-color) 72%,transparent);background:color-mix(in srgb,var(--md-sys-color-primary-container, var(--p-table-bg)) 22%,var(--p-table-bg) 78%)}.ptable-bottom-detail__header button{flex-shrink:0;border-radius:999px}.ptable-bottom-detail__identity{display:flex;min-width:0;align-items:center;gap:10px}.ptable-bottom-detail__identity>mat-icon{flex:0 0 auto;color:var(--md-sys-color-primary)}.ptable-bottom-detail__heading{display:grid;min-width:0}.ptable-bottom-detail__heading strong{overflow:hidden;font-size:14px;line-height:20px;text-overflow:ellipsis;white-space:nowrap}.ptable-bottom-detail__eyebrow{color:var(--md-sys-color-on-surface-variant);font-size:11px;font-weight:700;letter-spacing:.055em;line-height:16px;text-transform:uppercase}.ptable-bottom-detail__body{box-sizing:border-box;display:grid;align-content:start;gap:16px;max-height:40dvh;overflow:auto;scrollbar-gutter:stable;overscroll-behavior:contain;padding:16px;overflow-wrap:anywhere}.ptable-bottom-detail__body>[data-testid=table-bottom-detail-status]:empty{display:none}.ptable-bottom-detail--dynamic .ptable-bottom-detail__body{height:auto;scrollbar-gutter:auto}.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:14px}.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:10px;padding:12px 14px;background:var(--md-sys-color-surface)}.pfx-expansion-node.pfx-expansion-node-card-grid,.pfx-expansion-node.pfx-expansion-node-rich-content{border:0;border-radius:0;padding:0;background:transparent}.pfx-expansion-node-card__header{margin-bottom:10px}.pfx-expansion-node-card__title{margin:0;font-size:14px;font-weight:700;line-height:1.3;letter-spacing:-.01em}.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;justify-content:space-between;flex-wrap:wrap;gap:6px 12px;padding:8px 10px;border-radius:8px;background:color-mix(in srgb,var(--md-sys-color-surface-container-low, transparent) 70%,transparent)}.pfx-expansion-node-value__label{color:var(--md-sys-color-on-surface-variant);font-size:11px;font-weight:700;letter-spacing:.04em;text-transform:uppercase}.pfx-expansion-node-value__content{font-size:13.5px;font-weight:600;color:var(--md-sys-color-on-surface);font-variant-numeric:tabular-nums}.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, var(--mat-sys-surface-container-lowest))}.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}:is(.pfx-expansion-node-action-bar__action-btn,.pfx-expansion-node-rich-list__item-action-btn,.pfx-expansion-node-embed__action-btn,.pfx-expansion-node-action button,.praxis-row-btn,.praxis-icon-btn):disabled{opacity:.56;filter:saturate(.35);box-shadow:none;cursor:not-allowed}.pfx-expansion-node-card-grid__header{display:flex;flex-wrap:wrap;align-items:baseline;justify-content:space-between;gap:4px 12px;margin:0 0 12px;padding-bottom:8px;border-bottom:1px solid color-mix(in srgb,var(--p-table-border-color) 65%,transparent)}.pfx-expansion-node-card-grid__title-text{font-size:13px;font-weight:800;letter-spacing:.04em;text-transform:uppercase;color:var(--md-sys-color-on-surface)}.pfx-expansion-node-card-grid__subtitle-text{font-size:12px;font-weight:500;color:var(--md-sys-color-on-surface-variant)}.pfx-expansion-node-card-grid__cards{display:grid;gap:12px;grid-template-columns:var(--pfx-expansion-card-grid-columns, repeat(auto-fit, minmax(min(var(--pfx-expansion-card-grid-min-width, 220px), 100%), 1fr)))}@container (max-width: 780px){.pfx-expansion-node-card-grid__cards{grid-template-columns:repeat(auto-fit,minmax(min(240px,100%),1fr))}}@container (max-width: 520px){.pfx-expansion-node-card-grid__cards{grid-template-columns:minmax(0,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%;border:0;padding:0;background:transparent}.pfx-expansion-node-rich-content{min-width:0}.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-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-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-icon-btn.destructive{color:var(--md-sys-color-error)}.praxis-row-overflow-menu__item{min-width:212px;max-width:min(320px,88vw)}.praxis-row-overflow-menu__item[disabled]{pointer-events:auto!important;cursor:default!important}.praxis-row-overflow-menu__item ::ng-deep .mat-mdc-menu-item-text{display:flex;align-items:center;min-width:0;white-space:nowrap}.praxis-row-overflow-menu__item ::ng-deep .praxis-row-overflow-menu__label,.praxis-row-overflow-menu__item ::ng-deep .praxis-row-overflow-menu__label-text,.praxis-row-overflow-menu__item ::ng-deep .praxis-row-overflow-menu__label .prx-rich-text,::ng-deep .mat-mdc-menu-panel .pfx-menu-item__content,::ng-deep .mat-mdc-menu-panel .pfx-menu-item__content .prx-rich-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;word-break:normal;overflow-wrap:normal}.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;position:relative;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;min-width:100%}: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.detail-stack{border-bottom-right-radius:0;border-bottom-left-radius:0;box-shadow:none}: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, var(--mat-sys-surface-container))!important;background-color:var(--md-sys-color-surface-container, var(--mat-sys-surface-container))!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-quick-view-trigger--button,.pfx-cell-quick-view-btn{appearance:none;border:none;background:transparent;padding:0;margin:0;font:inherit;color:inherit;text-align:inherit;line-height:inherit;cursor:pointer}.pfx-cell-quick-view-btn,.pfx-cell-value.pfx-quick-view-trigger--button{border-bottom:1px dashed color-mix(in srgb,var(--md-sys-color-primary) 52%,transparent);transition:color .14s ease,border-color .14s ease}.pfx-cell-quick-view-btn:hover,.pfx-cell-value.pfx-quick-view-trigger--button:hover{color:var(--md-sys-color-primary);border-bottom-color:var(--md-sys-color-primary)}.pfx-link-with-quick-view{display:inline-flex;align-items:center;gap:5px;min-width:0;max-width:100%}.pfx-quick-view-adjacent-btn{appearance:none;flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;padding:0;border-radius:5px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 30%,transparent);background:color-mix(in srgb,var(--md-sys-color-primary) 10%,transparent);color:var(--md-sys-color-primary);cursor:pointer;transition:background-color .14s ease,border-color .14s ease}.pfx-quick-view-adjacent-btn:hover{background:color-mix(in srgb,var(--md-sys-color-primary) 18%,transparent);border-color:color-mix(in srgb,var(--md-sys-color-primary) 52%,transparent)}.pfx-quick-view-adjacent-btn__icon{font-size:13px!important;width:13px!important;height:13px!important;line-height:13px!important}.praxis-quick-view-trigger{cursor:pointer}.praxis-quick-view-trigger:focus-visible,.pfx-quick-view-trigger--button:focus-visible,.pfx-quick-view-adjacent-btn:focus-visible{outline:2px solid var(--md-sys-color-primary);outline-offset:2px;border-radius:4px}.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{background:var(--md-sys-color-error);color:var(--md-sys-color-on-error)}.pfx-chip--filled-warning{background:var(--p-table-state-warning-bg);color:var(--p-table-state-warning-fg)}.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,.pfx-chip--filled-neutral,.pfx-chip--filled-default{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-warning{background:color-mix(in srgb,var(--p-table-state-warning-bg) 72%,transparent);color:var(--p-table-state-warning-fg);border-color:color-mix(in srgb,var(--p-table-state-warning-fg) 18%,transparent)}.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,.pfx-chip--soft-neutral,.pfx-chip--soft-default{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-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.dir-media{display:inline-grid;grid-template-columns:auto minmax(0,1fr);grid-auto-rows:auto;align-content:center;align-items:center;column-gap:var(--p-table-compose-media-gap, 10px);row-gap:1px;min-width:0;max-width:100%;line-height:1.25}.pfx-cell-compose.dir-media>:first-child{grid-column:1;grid-row:1/span 6;align-self:center}.pfx-cell-compose.dir-media>:first-child:nth-last-child(2){grid-row:1}.pfx-cell-compose.dir-media>:first-child:nth-last-child(3){grid-row:1/span 2}.pfx-cell-compose.dir-media>:first-child:nth-last-child(4){grid-row:1/span 3}.pfx-cell-compose.dir-media>:first-child:nth-last-child(5){grid-row:1/span 4}.pfx-cell-compose.dir-media>:first-child:nth-last-child(6){grid-row:1/span 5}.pfx-cell-compose.dir-media>:not(:first-child){grid-column:2;justify-self:start;min-width:0;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pfx-cell-compose.dir-media .pfx-badge,.pfx-cell-compose.dir-media .pfx-chip{padding-block:2px;font-size:11px}.pfx-cell-compose.dir-col .pfx-cell-value--subtle,.pfx-cell-compose.dir-media .pfx-cell-value--subtle{font-variant-numeric:tabular-nums}.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%;container:praxis-table-viewport/inline-size;overflow-x:auto;-webkit-overflow-scrolling:touch;overscroll-behavior-x:contain;background:var(--p-table-bg);border-radius:12px 12px 0 0;transition:box-shadow .12s ease-out}.ptable-data-surface{position:relative;min-width:0}.ptable-data-surface--loading-overlay{min-block-size:10rem}.px-scroll-viewport--can-scroll-left{box-shadow:inset 1px 0 color-mix(in srgb,var(--md-sys-color-primary, #1263b4) 42%,transparent),inset 34px 0 26px -26px color-mix(in srgb,var(--md-sys-color-on-surface, #1a1b1f) 68%,transparent)}.px-scroll-viewport--can-scroll-right{box-shadow:inset -1px 0 color-mix(in srgb,var(--md-sys-color-primary, #1263b4) 42%,transparent),inset -34px 0 26px -26px color-mix(in srgb,var(--md-sys-color-on-surface, #1a1b1f) 68%,transparent)}.px-scroll-viewport--can-scroll-left.px-scroll-viewport--can-scroll-right{box-shadow:inset 1px 0 color-mix(in srgb,var(--md-sys-color-primary, #1263b4) 42%,transparent),inset -1px 0 color-mix(in srgb,var(--md-sys-color-primary, #1263b4) 42%,transparent),inset 34px 0 26px -26px color-mix(in srgb,var(--md-sys-color-on-surface, #1a1b1f) 68%,transparent),inset -34px 0 26px -26px color-mix(in srgb,var(--md-sys-color-on-surface, #1a1b1f) 68%,transparent)}.px-scroll-viewport--can-scroll-left .pfx-sticky-boundary-start:after,.px-scroll-viewport--can-scroll-right .pfx-sticky-boundary-end:before{content:\"\";position:absolute;inset-block:0;width:1px;pointer-events:none;background:var(--p-table-border-color);z-index:1}.px-scroll-viewport--can-scroll-left .pfx-sticky-boundary-start:after{inset-inline-end:-1px;box-shadow:12px 0 16px -12px var(--p-table-text-color)}.px-scroll-viewport--can-scroll-right .pfx-sticky-boundary-end:before{inset-inline-start:-1px;box-shadow:-12px 0 16px -12px var(--p-table-text-color)}:host-context([dir=rtl]) .px-scroll-viewport--can-scroll-left .pfx-sticky-boundary-start:after{box-shadow:-12px 0 16px -12px var(--p-table-text-color)}:host-context([dir=rtl]) .px-scroll-viewport--can-scroll-right .pfx-sticky-boundary-end:before{box-shadow:12px 0 16px -12px var(--p-table-text-color)}@media(forced-colors:active){.px-scroll-viewport--can-scroll-left .pfx-sticky-boundary-start:after,.px-scroll-viewport--can-scroll-right .pfx-sticky-boundary-end:before{background:CanvasText;box-shadow:none;forced-color-adjust:none}}.px-scroll-viewport:focus-visible{outline:2px solid var(--md-sys-color-primary, #1263b4);outline-offset:-2px}.px-scroll-viewport--refreshing{cursor:progress}.px-scroll-viewport--loading-replaced{display:none}.px-scroll-viewport--refreshing .praxis-table-data--refreshing{pointer-events:none}.ptable-refresh-state{min-height:36px;display:flex;align-items:center;justify-content:center;gap:10px;padding:6px 12px;color:var(--md-sys-color-on-surface-variant, #5a5d67);background:var(--md-sys-color-surface-container-low, var(--p-table-bg));border-block:1px solid var(--md-sys-color-outline-variant, rgba(18, 99, 180, .12));font-size:.85rem;font-weight:600}.ptable-refresh-state__spinner{width:16px;height:16px;flex:0 0 16px;border:2px solid color-mix(in srgb,var(--md-sys-color-primary, #1263b4) 24%,transparent);border-top-color:var(--md-sys-color-primary, #1263b4);border-radius:50%;animation:ptable-refresh-spin .72s linear infinite}.ptable-refresh-state__progress,.ptable-refresh-state__skeleton{position:relative;display:block;width:54px;height:6px;flex:0 0 54px;overflow:hidden;border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-primary, #1263b4) 18%,transparent)}.ptable-refresh-state__progress:after,.ptable-refresh-state__skeleton:after{content:\"\";position:absolute;inset-block:0;width:45%;border-radius:inherit;background:var(--md-sys-color-primary, #1263b4);animation:ptable-loading-progress 1.1s ease-in-out infinite}.ptable-refresh-state__skeleton:after{width:100%;background:linear-gradient(90deg,transparent,color-mix(in srgb,var(--md-sys-color-primary, #1263b4) 44%,transparent),transparent);animation-name:ptable-loading-wave}@keyframes ptable-refresh-spin{to{transform:rotate(360deg)}}@keyframes ptable-loading-progress{0%{transform:translate(-110%)}to{transform:translate(225%)}}.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%}.px-scroll-viewport.pfx-mobile-card-mode{overflow-x:visible}:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode{display:block;width:100%!important;min-width:0!important;max-width:none!important;background:transparent}:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode thead{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode tbody{display:grid;gap:12px}:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode .mat-mdc-row:not(.pfx-expansion-detail-row){display:grid;grid-template-columns:minmax(0,1fr);gap:0;height:auto;min-height:0;overflow:hidden;border:1px solid var(--p-table-border-color);border-radius:12px;background:var(--p-table-row-bg);box-shadow:none}:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode .mat-mdc-row:not(.pfx-expansion-detail-row) .mat-mdc-cell[data-praxis-card-label]{display:grid;grid-template-columns:minmax(7rem,.8fr) minmax(0,1.2fr);align-items:start;gap:12px;width:auto!important;min-width:0!important;max-width:none!important;height:auto!important;min-height:var(--p-table-row-height, var(--p-table-row-height-default, 44px));position:static!important;inset:auto!important;z-index:auto!important;padding:var(--p-cell-padding, var(--p-cell-padding-default, 10px 14px));border:0;border-bottom:1px solid var(--p-table-border-color);text-align:initial!important;white-space:normal;overflow:visible;text-overflow:clip}:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode .mat-mdc-row:not(.pfx-expansion-detail-row) .mat-mdc-cell[data-praxis-card-label]:before{content:attr(data-praxis-card-label);color:var(--p-table-header-fg);font-size:.75rem;font-weight:700;line-height:1.35}:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode .mat-mdc-row:not(.pfx-expansion-detail-row) .mat-mdc-cell[data-praxis-card-label] .pfx-cell-content{min-width:0;overflow:visible;white-space:normal;justify-content:flex-start!important;text-align:start!important}:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode .pfx-chip,:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode .pfx-badge{max-width:100%;height:auto;white-space:normal;overflow-wrap:anywhere}:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode .pfx-cell-compose.dir-media>:not(:first-child){white-space:normal;overflow-wrap:anywhere;text-overflow:clip}:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode .mat-mdc-row:not(.pfx-expansion-detail-row) .mat-mdc-cell[data-praxis-card-label]:last-child{border-bottom:0}:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode .praxis-actions-cell{grid-column:1/-1}:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode .praxis-actions-cell .praxis-actions-cell__content{justify-content:flex-start;flex-wrap:wrap}:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode .mat-mdc-row:not(.pfx-expansion-detail-row) .praxis-actions-cell[data-praxis-card-label=\"\"]{grid-template-columns:minmax(0,1fr);align-items:center;padding-block:0}:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode .mat-mdc-row:not(.pfx-expansion-detail-row) .praxis-actions-cell[data-praxis-card-label=\"\"]:before{content:none}@container praxis-table-viewport (max-width: 480px){:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode .mat-mdc-row:not(.pfx-expansion-detail-row) .mat-mdc-cell[data-praxis-card-label]{grid-template-columns:minmax(0,1fr);gap:4px}:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode .mat-mdc-row:not(.pfx-expansion-detail-row) .mat-mdc-cell[data-praxis-card-label] .pfx-cell-content{width:100%;overflow:visible;overflow-wrap:anywhere}:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode .pfx-cell-content>*{min-width:0;max-width:100%}:host ::ng-deep .mat-mdc-table.pfx-mobile-card-mode .praxis-actions-cell .praxis-actions-cell__content{gap:8px}}: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{color:inherit;font-weight:inherit}: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):not(.praxis-header-align-center) .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:0;padding-inline-end:0}: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.pfx-row-click-selectable:focus-visible{outline:2px solid var(--praxis-theme-focus-outline, var(--md-sys-color-primary));outline-offset:-2px}: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>mat-radio-button{--mat-radio-selected-icon-color: var(--p-table-row-selected-fg);--mat-radio-selected-hover-icon-color: var(--p-table-row-selected-fg);--mat-radio-selected-focus-icon-color: var(--p-table-row-selected-fg);--mat-radio-selected-pressed-icon-color: var(--p-table-row-selected-fg)}:host ::ng-deep .mat-mdc-table:not(.pfx-mobile-card-mode) .mat-mdc-row.pfx-row-selected .mat-mdc-cell:first-child{position:relative}:host ::ng-deep .mat-mdc-table:not(.pfx-mobile-card-mode) .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 ::ng-deep .mat-mdc-table.pfx-mobile-card-mode .mat-mdc-row.pfx-row-selected{box-shadow:inset 4px 0 0 var(--p-table-row-selected-indicator)}: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{background:var(--md-sys-color-error);color:var(--md-sys-color-on-error)}.pfx-badge--filled-warning{background:var(--p-table-state-warning-bg);color:var(--p-table-state-warning-fg)}.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,.pfx-badge--filled-neutral,.pfx-badge--filled-default{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-warning{background:color-mix(in srgb,var(--p-table-state-warning-bg) 72%,transparent);color:var(--p-table-state-warning-fg);border-color:color-mix(in srgb,var(--p-table-state-warning-fg) 18%,transparent)}.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,.pfx-badge--soft-neutral,.pfx-badge--soft-default{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--overlay{position:absolute;z-index:8;inset:0;min-block-size:10rem;background:color-mix(in srgb,var(--md-sys-color-surface, #fff) 92%,transparent);-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}.ptable-loading-state__spinner{width:34px;height:34px;margin:18px auto 8px;border:3px solid color-mix(in srgb,var(--md-sys-color-primary, #1263b4) 22%,transparent);border-top-color:var(--md-sys-color-primary, #1263b4);border-radius:50%;animation:ptable-refresh-spin .72s linear infinite}.ptable-loading-state__progress{height:6px;margin:28px 12px 16px;overflow:hidden;border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-primary, #1263b4) 18%,transparent)}.ptable-loading-state__progress span{display:block;width:38%;height:100%;border-radius:inherit;background:var(--md-sys-color-primary, #1263b4);animation:ptable-loading-progress 1.1s ease-in-out infinite}.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;font-weight:550;color:var(--pdx-text-shimmer-base, var(--md-sys-color-on-surface-variant, #5a5d67));padding-inline:4px}.ptable-refresh-state__message{font-weight:550;color:var(--pdx-text-shimmer-base, var(--md-sys-color-on-surface-variant, #5a5d67))}@supports (-webkit-background-clip: text) or (background-clip: text){.ptable-loading-state__message,.ptable-refresh-state__message{background-image:var(--pdx-text-shimmer-gradient, linear-gradient(105deg, color-mix(in oklab, var(--md-sys-color-on-surface-variant, #5a5d67) 78%, var(--md-sys-color-on-surface, #0f172a) 22%) 0%, color-mix(in oklab, var(--md-sys-color-on-surface-variant, #5a5d67) 78%, var(--md-sys-color-on-surface, #0f172a) 22%) 26%, color-mix(in oklab, var(--md-sys-color-tertiary, #6366f1) 66%, #a855f7 34%) 40%, var(--pdx-text-shimmer-peak, var(--md-sys-color-on-surface, #ffffff)) 50%, color-mix(in oklab, var(--md-sys-color-primary, #006a6a) 66%, #ec4899 34%) 60%, color-mix(in oklab, var(--md-sys-color-on-surface-variant, #5a5d67) 78%, var(--md-sys-color-on-surface, #0f172a) 22%) 74%, color-mix(in oklab, var(--md-sys-color-on-surface-variant, #5a5d67) 78%, var(--md-sys-color-on-surface, #0f172a) 22%) 100%));background-size:300% 100%;background-position:100% 50%;background-repeat:no-repeat;-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;color:transparent;animation:ptable-text-shimmer-sweep var(--pdx-text-shimmer-duration, 2.6s) linear infinite;will-change:background-position}}@keyframes ptable-text-shimmer-sweep{0%{background-position:100% 50%}to{background-position:0% 50%}}.ptable-loading-state__actions{display:flex;justify-content:flex-end}.ptable-loading-state__hero--static .ptable-loading-state__line,.ptable-loading-state__hero--static .ptable-loading-state__cell{animation:none}@media(prefers-reduced-motion:reduce){.ptable-refresh-state__spinner,.ptable-refresh-state__progress:after,.ptable-refresh-state__skeleton:after,.ptable-loading-state__spinner,.ptable-loading-state__progress span,.ptable-loading-state__line,.ptable-loading-state__cell{animation:none}}@media(prefers-reduced-motion:reduce),(forced-colors:active),print{.ptable-loading-state__message,.ptable-refresh-state__message{animation:none!important;background-image:none!important;-webkit-text-fill-color:currentColor!important;color:var(--md-sys-color-primary, currentColor)!important;will-change:auto}}@media(forced-colors:active){.ptable-loading-state__message,.ptable-refresh-state__message{color:CanvasText!important;-webkit-text-fill-color:CanvasText!important}}.ptable-cancelled-state{display:flex;align-items:center;gap:12px;padding:12px 16px;border:1px solid var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface-container-low);color:var(--md-sys-color-on-surface)}.ptable-cancelled-state__content{display:grid;flex:1;gap:2px}.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{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, var(--praxis-action-control-height, 40px));--pdx-empty-state-action-radius: var(--p-table-empty-action-radius, var(--praxis-action-control-radius, 8px));--pdx-empty-state-transparent-margin: 0}.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%}.ptable-header-actions{display:flex;align-items:center;gap:8px;padding:10px 14px 6px}.ptable-header-title{margin-right:auto;font-size:.95rem;font-weight:600;letter-spacing:-.01em;color:var(--p-table-header-fg, var(--md-sys-color-on-surface))}\n"] }]
|
|
44774
44930
|
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i3$2.SettingsPanelService }, { type: i1.GenericCrudService }, { type: TableDefaultsProvider }, { type: FilterConfigService }, { type: DataFormattingService }, { type: i6$1.PraxisDialog }, { type: i4$2.MatSnackBar }, { type: undefined, decorators: [{
|
|
44775
44931
|
type: Inject,
|
|
44776
44932
|
args: [ASYNC_CONFIG_STORAGE]
|
|
@@ -74601,7 +74757,7 @@ class TableDetailEditorComponent {
|
|
|
74601
74757
|
/** True when the last "add inside" was refused because the block cannot live inside a card grid card. */
|
|
74602
74758
|
addRejected = false;
|
|
74603
74759
|
presets = ['stack', 'cardGrid', 'card', 'compose', 'metric', 'badge', 'icon', 'tabs', 'tab', 'callout', 'richCard', 'observation', 'text', 'status', 'progress', 'timeline', 'chartRef'];
|
|
74604
|
-
sourceModes = ['inline', 'resource', 'resourcePath', 'hypermedia'];
|
|
74760
|
+
sourceModes = ['inline', 'resource', 'resourcePath', 'hypermedia', 'schema'];
|
|
74605
74761
|
resourceKinds = ['ui-composition', 'form-schema', 'table-schema', 'dashboard-schema'];
|
|
74606
74762
|
resourcePathMethods = ['GET', 'POST'];
|
|
74607
74763
|
cardGridColumnOptions = ['auto', 1, 2, 3, 4];
|