@praxisui/table 10.0.0-rc.40 → 10.0.0-rc.41
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/ai/component-registry.json +2 -2
- package/docs/dynamic-filter-host-integration-guide.md +23 -1
- package/docs/dynamic-filter-payload-contract.md +29 -6
- package/fesm2022/praxisui-table-authoring.mjs +33 -1
- package/fesm2022/{praxisui-table-filter-form-dialog-host.component-DlGomgO3.mjs → praxisui-table-filter-form-dialog-host.component-Cst6rkAK.mjs} +49 -6
- package/fesm2022/{praxisui-table-praxisui-table-vjpONc0b.mjs → praxisui-table-praxisui-table-CdEy3SYM.mjs} +308 -31
- package/fesm2022/{praxisui-table-table-agentic-authoring-turn-flow-D0489HPn.mjs → praxisui-table-table-agentic-authoring-turn-flow-sQz0BpSY.mjs} +1 -1
- package/fesm2022/{praxisui-table-table-ai.adapter-2CXgwI8n.mjs → praxisui-table-table-ai.adapter-DEetBMv9.mjs} +1 -1
- package/fesm2022/praxisui-table.mjs +1 -1
- package/package.json +10 -10
- package/src/lib/praxis-table.json-api.md +10 -0
- package/types/praxisui-table.d.ts +6 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
2
|
import { input, inject, computed, ChangeDetectionStrategy, Component, output, signal, InjectionToken, EventEmitter, ElementRef, Output, Input, ViewChild, Optional, Inject, LOCALE_ID, Injectable, Injector, HostListener, Directive, ChangeDetectorRef, DestroyRef, ENVIRONMENT_INITIALIZER, effect, booleanAttribute, HostBinding, ContentChild, TemplateRef, ViewContainerRef, numberAttribute } from '@angular/core';
|
|
3
3
|
import * as i1 from '@praxisui/core';
|
|
4
|
-
import { PraxisI18nService, BulkOperationClientService, isBulkExecutionTerminal, LoggerService, createCorporateLoggerConfig, ConsoleLoggerSink, PraxisJsonLogicService, resolveResourceAvailabilityReasonKey, RESOURCE_DISCOVERY_I18N_CONFIG, RESOURCE_DISCOVERY_I18N_NAMESPACE, PraxisIconDirective, PraxisIconButtonComponent, SafeExpressionEvaluator, API_URL, EnterpriseRuntimeContextService, buildApiUrl, ResourceDiscoveryService, renderPraxisPresentationVisualizationHtml, createDefaultTableConfig, deepMerge as deepMerge$1, ASYNC_CONFIG_STORAGE, providePraxisI18nConfig, INLINE_FILTER_CONTROL_TYPES, INLINE_FILTER_CONTROL_TYPE_VALUES, FieldControlType, normalizeControlTypeToken, resolveControlTypeAlias, INLINE_FILTER_ALIAS_TOKENS, SCHEMA_METADATA_CLIENT_OPTIONS, GlobalConfigService, buildSchemaId, MemoryCacheAdapter, LocalStorageCacheAdapter, SchemaMetadataClient, mapFieldDefinitionsToMetadata, resolveInlineFilterControlType, fetchWithETag, serializeEntityLookupValueForPayload, GenericCrudService, SchemaNormalizerService, mapCatalogFieldsToMetadata, ResourceQuickConnectComponent, ComponentMetadataRegistry, AnalyticsStatsRequestBuilderService, normalizePraxisDataQueryContext, normalizeUnknownError, PraxisRuntimeComponentObservationRegistryService, PRAXIS_TABLE_DETAIL_INLINE_RENDERERS, ResourceQuickViewService, BulkSyncStateService, PRAXIS_TABLE_DETAIL_INLINE_NODE_RESOLVERS, PRAXIS_TABLE_DETAIL_RESOURCE_RESOLVER, PraxisWidgetEventBus, PraxisCollectionExportService, fillUndefined, translateResourceAvailabilityReason, ResourceSurfaceOpenAdapterService, ResourceActionOpenAdapterService, CrudOperationResolutionService, SURFACE_OPEN_PRESETS, SURFACE_DRAWER_REF, assertPraxisCollectionExportArtifact, PRAXIS_LOADING_CTX, resolveColumnTypeFromFieldDefinition as resolveColumnTypeFromFieldDefinition$1, isPraxisPresentationVisualizationTableSafe as isPraxisPresentationVisualizationTableSafe$1, resolveTextMaskFormatFromFieldDefinition as resolveTextMaskFormatFromFieldDefinition$1, translateResourceDiscoveryText, supportsImplicitValuePresentation, resolveValuePresentation, resolvePraxisMicroVisualizationTone,
|
|
4
|
+
import { PraxisI18nService, BulkOperationClientService, isBulkExecutionTerminal, LoggerService, createCorporateLoggerConfig, ConsoleLoggerSink, PraxisJsonLogicService, resolveResourceAvailabilityReasonKey, RESOURCE_DISCOVERY_I18N_CONFIG, RESOURCE_DISCOVERY_I18N_NAMESPACE, PraxisIconDirective, PraxisIconButtonComponent, SafeExpressionEvaluator, API_URL, EnterpriseRuntimeContextService, buildApiUrl, ResourceDiscoveryService, renderPraxisPresentationVisualizationHtml, createDefaultTableConfig, deepMerge as deepMerge$1, ASYNC_CONFIG_STORAGE, providePraxisI18nConfig, INLINE_FILTER_CONTROL_TYPES, INLINE_FILTER_CONTROL_TYPE_VALUES, FieldControlType, normalizeControlTypeToken, resolveControlTypeAlias, normalizeScalarArrayValue, INLINE_FILTER_ALIAS_TOKENS, SCHEMA_METADATA_CLIENT_OPTIONS, GlobalConfigService, buildSchemaId, MemoryCacheAdapter, LocalStorageCacheAdapter, SchemaMetadataClient, mapFieldDefinitionsToMetadata, resolveInlineFilterControlType, fetchWithETag, serializeEntityLookupValueForPayload, GenericCrudService, SchemaNormalizerService, mapCatalogFieldsToMetadata, ResourceQuickConnectComponent, ComponentMetadataRegistry, AnalyticsStatsRequestBuilderService, normalizePraxisDataQueryContext, normalizeUnknownError, PraxisRuntimeComponentObservationRegistryService, PRAXIS_TABLE_DETAIL_INLINE_RENDERERS, ResourceQuickViewService, BulkSyncStateService, PRAXIS_TABLE_DETAIL_INLINE_NODE_RESOLVERS, PRAXIS_TABLE_DETAIL_RESOURCE_RESOLVER, PraxisWidgetEventBus, PraxisCollectionExportService, fillUndefined, translateResourceAvailabilityReason, ResourceSurfaceOpenAdapterService, ResourceActionOpenAdapterService, CrudOperationResolutionService, normalizeResourceQuickViewBinding, SURFACE_OPEN_PRESETS, SURFACE_DRAWER_REF, assertPraxisCollectionExportArtifact, PRAXIS_LOADING_CTX, resolveColumnTypeFromFieldDefinition as resolveColumnTypeFromFieldDefinition$1, isPraxisPresentationVisualizationTableSafe as isPraxisPresentationVisualizationTableSafe$1, resolveTextMaskFormatFromFieldDefinition as resolveTextMaskFormatFromFieldDefinition$1, translateResourceDiscoveryText, supportsImplicitValuePresentation, resolveValuePresentation, resolvePraxisMicroVisualizationTone, resolveResourceIdentityContract, materializeResourceIdentity, translateUnavailableWorkflowMessage, CONNECTION_STORAGE, PRAXIS_LOADING_RENDERER, PraxisQuickViewTriggerDirective, EmptyStateCardComponent, humanizeCatalogFieldName, inferDomainSemanticTone, inferDomainSemanticIcon, getPraxisTableCellVisualizationGuidance, getPraxisTableCellVisualizationConstraint, isTableConfigV2, normalizePraxisPresentationVisualization, uiLayoutJsonIdentity, PRAXIS_GLOBAL_ACTION_CATALOG, SURFACE_OPEN_I18N_NAMESPACE, isRequiredGlobalActionPayloadMissing, getGlobalActionUiSchema, getRequiredGlobalActionPayloadKeys, hasMeaningfulGlobalActionPayloadValue, SurfaceOpenActionEditorComponent, SURFACE_OPEN_I18N_CONFIG, PraxisJsonLogicError, GLOBAL_ACTION_CATALOG, validateGlobalActionRefs, getGlobalActionCatalog, TableConfigService, cloneBoundedUiLayoutJsonDocument, derivePageChildRuntimeId } from '@praxisui/core';
|
|
5
5
|
import * as i1$3 from '@angular/common/http';
|
|
6
6
|
import { HttpErrorResponse, HttpClient, HttpContext } from '@angular/common/http';
|
|
7
7
|
import * as i3 from '@angular/material/button';
|
|
@@ -1422,6 +1422,12 @@ class TableSchemaColumnProjector {
|
|
|
1422
1422
|
const includeOrder = new Map(include.map((field, index) => [field, index]));
|
|
1423
1423
|
const order = Array.isArray(projection?.order) ? projection.order : include;
|
|
1424
1424
|
const presentationOrder = new Map(order.map((field, index) => [field, index]));
|
|
1425
|
+
const fieldsByName = new Map();
|
|
1426
|
+
for (const field of Array.isArray(fields) ? fields : []) {
|
|
1427
|
+
const name = typeof field?.name === 'string' ? field.name.trim() : '';
|
|
1428
|
+
if (name)
|
|
1429
|
+
fieldsByName.set(name, field);
|
|
1430
|
+
}
|
|
1425
1431
|
const schemaColumns = (Array.isArray(fields) ? fields : [])
|
|
1426
1432
|
.filter((field) => !field.tableHidden && !field.hidden)
|
|
1427
1433
|
.filter((field) => include.length === 0 || includeOrder.has(field.name))
|
|
@@ -1433,15 +1439,18 @@ class TableSchemaColumnProjector {
|
|
|
1433
1439
|
const base = this.convertFieldToColumn(field);
|
|
1434
1440
|
const override = overrides[field.name];
|
|
1435
1441
|
if (!override || typeof override !== 'object' || Array.isArray(override)) {
|
|
1442
|
+
this.applySchemaComposeItemsQuickView(base, fieldsByName);
|
|
1436
1443
|
return base;
|
|
1437
1444
|
}
|
|
1438
1445
|
const merged = deepMerge(base, override);
|
|
1439
|
-
|
|
1446
|
+
const projected = {
|
|
1440
1447
|
...merged,
|
|
1441
1448
|
field: base.field,
|
|
1442
1449
|
_isApiField: base._isApiField,
|
|
1443
1450
|
_originalApiType: base._originalApiType,
|
|
1444
1451
|
};
|
|
1452
|
+
this.applySchemaComposeItemsQuickView(projected, fieldsByName);
|
|
1453
|
+
return projected;
|
|
1445
1454
|
});
|
|
1446
1455
|
const canonicalFields = new Set((Array.isArray(fields) ? fields : [])
|
|
1447
1456
|
.map((field) => String(field?.name || '').trim())
|
|
@@ -1588,9 +1597,32 @@ class TableSchemaColumnProjector {
|
|
|
1588
1597
|
// Default to string for ambiguous cases
|
|
1589
1598
|
return 'string';
|
|
1590
1599
|
}
|
|
1600
|
+
applySchemaComposeItemsQuickView(col, fieldsByName) {
|
|
1601
|
+
const renderer = col?.renderer;
|
|
1602
|
+
if (renderer?.type !== 'compose' || !Array.isArray(renderer?.compose?.items)) {
|
|
1603
|
+
return;
|
|
1604
|
+
}
|
|
1605
|
+
for (const item of renderer.compose.items) {
|
|
1606
|
+
if (!item || typeof item !== 'object')
|
|
1607
|
+
continue;
|
|
1608
|
+
const itemType = typeof item.type === 'string' ? item.type.trim() : 'value';
|
|
1609
|
+
if (itemType !== 'value' || item.quickView !== undefined)
|
|
1610
|
+
continue;
|
|
1611
|
+
const itemFieldName = typeof item.field === 'string' ? item.field.trim() : '';
|
|
1612
|
+
if (!itemFieldName)
|
|
1613
|
+
continue;
|
|
1614
|
+
const itemField = fieldsByName.get(itemFieldName);
|
|
1615
|
+
if (itemField?.quickView) {
|
|
1616
|
+
item.quickView = this.clonePlainObject(itemField.quickView);
|
|
1617
|
+
}
|
|
1618
|
+
}
|
|
1619
|
+
}
|
|
1591
1620
|
applySchemaFieldPresentation(field, col) {
|
|
1592
1621
|
if (!field || !col)
|
|
1593
1622
|
return;
|
|
1623
|
+
if (field.quickView && !col.quickView) {
|
|
1624
|
+
col.quickView = this.clonePlainObject(field.quickView);
|
|
1625
|
+
}
|
|
1594
1626
|
const controlType = this.normalizePresentationToken(field.controlType);
|
|
1595
1627
|
const numericFormat = this.normalizePresentationToken(field.numericFormat ?? field.format);
|
|
1596
1628
|
const valuePresentationType = this.normalizePresentationToken(field.valuePresentation?.type);
|
|
@@ -13264,6 +13296,47 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
13264
13296
|
type: Output
|
|
13265
13297
|
}] } });
|
|
13266
13298
|
|
|
13299
|
+
/** Projects declared query constraints while preserving the existing flat or nested DTO shape. */
|
|
13300
|
+
function projectFilterPayload(value, fields) {
|
|
13301
|
+
const byName = new Map(fields.map(field => [field.name, field]));
|
|
13302
|
+
const parents = new Set();
|
|
13303
|
+
for (const field of fields) {
|
|
13304
|
+
const parts = field.name.split('.');
|
|
13305
|
+
for (let index = 1; index < parts.length; index += 1)
|
|
13306
|
+
parents.add(parts.slice(0, index).join('.'));
|
|
13307
|
+
}
|
|
13308
|
+
const visit = (record, prefix = '') => {
|
|
13309
|
+
const entries = [];
|
|
13310
|
+
for (const [key, original] of Object.entries(record)) {
|
|
13311
|
+
const name = prefix ? `${prefix}.${key}` : key;
|
|
13312
|
+
const field = byName.get(name);
|
|
13313
|
+
if (field?.submitPolicy === 'omit')
|
|
13314
|
+
continue;
|
|
13315
|
+
let next = original;
|
|
13316
|
+
if (field?.items) {
|
|
13317
|
+
const result = normalizeScalarArrayValue(original, field.items);
|
|
13318
|
+
if (!result.valid)
|
|
13319
|
+
return null;
|
|
13320
|
+
next = result.value;
|
|
13321
|
+
}
|
|
13322
|
+
else if (Array.isArray(field?.enumValues) && original != null && original !== '' &&
|
|
13323
|
+
!field.enumValues.some((candidate) => candidate === original)) {
|
|
13324
|
+
return null;
|
|
13325
|
+
}
|
|
13326
|
+
else if (original && typeof original === 'object' && !Array.isArray(original) &&
|
|
13327
|
+
parents.has(name)) {
|
|
13328
|
+
const nested = visit(original, name);
|
|
13329
|
+
if (nested === null)
|
|
13330
|
+
return null;
|
|
13331
|
+
next = nested;
|
|
13332
|
+
}
|
|
13333
|
+
entries.push([key, next]);
|
|
13334
|
+
}
|
|
13335
|
+
return Object.fromEntries(entries);
|
|
13336
|
+
};
|
|
13337
|
+
return visit(value);
|
|
13338
|
+
}
|
|
13339
|
+
|
|
13267
13340
|
const PRAXIS_FILTER_VIEW_CONTEXT_SCHEMA_VERSION = 'praxis.filter-view-context.v1';
|
|
13268
13341
|
|
|
13269
13342
|
const DEFAULT_I18N = {
|
|
@@ -13920,12 +13993,16 @@ class PraxisFilter {
|
|
|
13920
13993
|
return this.cleanFilterPayload((this.value || {}));
|
|
13921
13994
|
}
|
|
13922
13995
|
emitSubmitDto(dto = this.dto) {
|
|
13923
|
-
const snapshot =
|
|
13996
|
+
const snapshot = this.projectQueryPayload(dto);
|
|
13997
|
+
if (snapshot === null || this.alwaysForm.invalid || this.alwaysForm.pending || this.advancedForm?.invalid || this.advancedForm?.pending)
|
|
13998
|
+
return;
|
|
13924
13999
|
this.submit.emit(snapshot);
|
|
13925
14000
|
void this.emitViewContext(snapshot);
|
|
13926
14001
|
}
|
|
13927
14002
|
emitChangeDto(dto = this.dto) {
|
|
13928
|
-
const snapshot =
|
|
14003
|
+
const snapshot = this.projectQueryPayload(dto);
|
|
14004
|
+
if (snapshot === null || this.alwaysForm.invalid || this.alwaysForm.pending || this.advancedForm?.invalid || this.advancedForm?.pending)
|
|
14005
|
+
return;
|
|
13929
14006
|
this.change.emit(snapshot);
|
|
13930
14007
|
void this.emitViewContext(snapshot);
|
|
13931
14008
|
}
|
|
@@ -14264,7 +14341,8 @@ class PraxisFilter {
|
|
|
14264
14341
|
}
|
|
14265
14342
|
else {
|
|
14266
14343
|
const requiresSchemaBodyAtInit = (this.alwaysVisibleFields?.length || 0) > 0 ||
|
|
14267
|
-
(this.selectedFieldIds?.length || 0) > 0
|
|
14344
|
+
(this.selectedFieldIds?.length || 0) > 0 ||
|
|
14345
|
+
this.shouldAutoPopulateStandaloneFilterFields();
|
|
14268
14346
|
// Skip the lightweight verification when we already know a full schema load is
|
|
14269
14347
|
// required for rendering. loadSchemaViaClient() will fetch and persist metadata.
|
|
14270
14348
|
if (requiresSchemaBodyAtInit) {
|
|
@@ -15624,6 +15702,89 @@ class PraxisFilter {
|
|
|
15624
15702
|
this.schemaError = false;
|
|
15625
15703
|
this.loadSchema();
|
|
15626
15704
|
}
|
|
15705
|
+
shouldAutoPopulateStandaloneFilterFields() {
|
|
15706
|
+
return (Boolean(this.filterId) &&
|
|
15707
|
+
(this.alwaysVisibleFields?.length || 0) === 0 &&
|
|
15708
|
+
(this.selectedFieldIds?.length || 0) === 0);
|
|
15709
|
+
}
|
|
15710
|
+
pickDefaultStandaloneFilterMetas(metas) {
|
|
15711
|
+
if (!Array.isArray(metas) || metas.length === 0) {
|
|
15712
|
+
return [];
|
|
15713
|
+
}
|
|
15714
|
+
const excludedNames = new Set([
|
|
15715
|
+
'id',
|
|
15716
|
+
'version',
|
|
15717
|
+
'page',
|
|
15718
|
+
'size',
|
|
15719
|
+
'sort',
|
|
15720
|
+
'offset',
|
|
15721
|
+
'limit',
|
|
15722
|
+
]);
|
|
15723
|
+
const excludedControlTypes = new Set([
|
|
15724
|
+
'textarea',
|
|
15725
|
+
'richtext',
|
|
15726
|
+
'rich-text',
|
|
15727
|
+
'file',
|
|
15728
|
+
'upload',
|
|
15729
|
+
'hidden',
|
|
15730
|
+
'checkbox',
|
|
15731
|
+
'toggle',
|
|
15732
|
+
'slide-toggle',
|
|
15733
|
+
]);
|
|
15734
|
+
const optionDrivenControls = new Set([
|
|
15735
|
+
'entity-lookup',
|
|
15736
|
+
'select',
|
|
15737
|
+
'multi-select',
|
|
15738
|
+
'multiselect',
|
|
15739
|
+
'searchable-select',
|
|
15740
|
+
'async-select',
|
|
15741
|
+
'autocomplete',
|
|
15742
|
+
]);
|
|
15743
|
+
const rangeControls = new Set([
|
|
15744
|
+
'date-range',
|
|
15745
|
+
'daterange',
|
|
15746
|
+
'range-slider',
|
|
15747
|
+
'numeric-range',
|
|
15748
|
+
]);
|
|
15749
|
+
const scored = metas
|
|
15750
|
+
.map((meta, index) => {
|
|
15751
|
+
const rawName = String(meta?.name || '').trim();
|
|
15752
|
+
const lowerName = rawName.toLowerCase();
|
|
15753
|
+
const controlType = String(meta?.controlType || 'input')
|
|
15754
|
+
.trim()
|
|
15755
|
+
.toLowerCase();
|
|
15756
|
+
if (!rawName ||
|
|
15757
|
+
rawName.startsWith('_') ||
|
|
15758
|
+
excludedNames.has(lowerName) ||
|
|
15759
|
+
excludedControlTypes.has(controlType)) {
|
|
15760
|
+
return null;
|
|
15761
|
+
}
|
|
15762
|
+
const rawOrder = meta?.order;
|
|
15763
|
+
const explicitOrder = typeof rawOrder === 'number' && Number.isFinite(rawOrder) && rawOrder > 0
|
|
15764
|
+
? rawOrder
|
|
15765
|
+
: Number.MAX_SAFE_INTEGER;
|
|
15766
|
+
const hasGovernedOptionSource = optionDrivenControls.has(controlType) ||
|
|
15767
|
+
Boolean(meta?.optionSource) ||
|
|
15768
|
+
Boolean(meta?.endpoint) ||
|
|
15769
|
+
Array.isArray(meta?.options);
|
|
15770
|
+
let capabilityScore = 15;
|
|
15771
|
+
if (hasGovernedOptionSource) {
|
|
15772
|
+
capabilityScore = 30;
|
|
15773
|
+
}
|
|
15774
|
+
else if (controlType === 'input' || controlType === 'text' || controlType === 'search') {
|
|
15775
|
+
capabilityScore = 25;
|
|
15776
|
+
}
|
|
15777
|
+
else if (rangeControls.has(controlType)) {
|
|
15778
|
+
capabilityScore = 20;
|
|
15779
|
+
}
|
|
15780
|
+
return { meta, explicitOrder, capabilityScore, index };
|
|
15781
|
+
})
|
|
15782
|
+
.filter((entry) => entry !== null)
|
|
15783
|
+
.sort((a, b) => a.explicitOrder - b.explicitOrder ||
|
|
15784
|
+
b.capabilityScore - a.capabilityScore ||
|
|
15785
|
+
a.index - b.index);
|
|
15786
|
+
return scored.slice(0, 3).map((entry) => entry.meta);
|
|
15787
|
+
}
|
|
15627
15788
|
applySchemaMetas() {
|
|
15628
15789
|
if (this.applySchemaQueued)
|
|
15629
15790
|
return;
|
|
@@ -15677,7 +15838,12 @@ class PraxisFilter {
|
|
|
15677
15838
|
}
|
|
15678
15839
|
}
|
|
15679
15840
|
}
|
|
15680
|
-
const
|
|
15841
|
+
const configuredAlways = this.pickMetasByOrder(metas, this.alwaysVisibleFields);
|
|
15842
|
+
const initialAlways = configuredAlways.length > 0
|
|
15843
|
+
? configuredAlways
|
|
15844
|
+
: this.shouldAutoPopulateStandaloneFilterFields()
|
|
15845
|
+
? this.pickDefaultStandaloneFilterMetas(metas)
|
|
15846
|
+
: [];
|
|
15681
15847
|
const alwaysSet = new Set(initialAlways.map((m) => m.name));
|
|
15682
15848
|
if (metas.length > 0 &&
|
|
15683
15849
|
Array.isArray(this.alwaysVisibleFields) &&
|
|
@@ -16179,23 +16345,26 @@ class PraxisFilter {
|
|
|
16179
16345
|
this.alwaysForm.valueChanges
|
|
16180
16346
|
.pipe(takeUntil$1(this.alwaysFormReset$), takeUntilDestroyed(this.destroyRef))
|
|
16181
16347
|
.subscribe((val) => {
|
|
16348
|
+
const projected = this.projectQueryPayload(val || {});
|
|
16349
|
+
if (projected === null || this.alwaysForm.invalid || this.alwaysForm.pending)
|
|
16350
|
+
return;
|
|
16182
16351
|
// O resumo visível é estado local da toolbar e precisa acompanhar a
|
|
16183
16352
|
// interação imediatamente. Apenas a emissão externa permanece
|
|
16184
16353
|
// debounced em bindAdvancedDebounce(). Evita a antiga espera dupla.
|
|
16185
16354
|
let hasCommittedChange = false;
|
|
16186
|
-
Object.keys(
|
|
16187
|
-
const fieldValue =
|
|
16355
|
+
Object.keys(projected).forEach((key) => {
|
|
16356
|
+
const fieldValue = projected[key];
|
|
16188
16357
|
if (this.isIncompleteInlineDateRangeValue(key, fieldValue)) {
|
|
16189
16358
|
return;
|
|
16190
16359
|
}
|
|
16191
16360
|
hasCommittedChange = true;
|
|
16192
16361
|
this.upsertDtoValue(key, fieldValue);
|
|
16193
16362
|
});
|
|
16194
|
-
if (!hasCommittedChange && Object.keys(
|
|
16363
|
+
if (!hasCommittedChange && Object.keys(projected).length > 0) {
|
|
16195
16364
|
return;
|
|
16196
16365
|
}
|
|
16197
16366
|
this.setActiveFiltersCount(Object.keys(this.dto).length);
|
|
16198
|
-
this.advancedChange$.next(
|
|
16367
|
+
this.advancedChange$.next(projected);
|
|
16199
16368
|
});
|
|
16200
16369
|
let advancedMetas = this.getAdvancedCandidateMetas(metas).map((m) => ({
|
|
16201
16370
|
...m,
|
|
@@ -17320,18 +17489,19 @@ class PraxisFilter {
|
|
|
17320
17489
|
}
|
|
17321
17490
|
onAdvancedSubmit(event) {
|
|
17322
17491
|
// Bloquear submit se inválido
|
|
17323
|
-
if (this.advancedForm &&
|
|
17492
|
+
if (this.advancedForm && (this.advancedForm.invalid || this.advancedForm.pending)) {
|
|
17324
17493
|
this.advancedForm.markAllAsTouched();
|
|
17325
17494
|
return;
|
|
17326
17495
|
}
|
|
17327
17496
|
// Mescla dados emitidos com quick e always
|
|
17328
17497
|
const advancedData = event?.formData ?? {};
|
|
17329
17498
|
const alwaysData = this.alwaysForm?.getRawValue?.() ?? {};
|
|
17330
|
-
const
|
|
17331
|
-
|
|
17332
|
-
|
|
17333
|
-
|
|
17334
|
-
|
|
17499
|
+
const projected = this.projectQueryPayload({ ...advancedData, ...alwaysData });
|
|
17500
|
+
if (projected === null || this.alwaysForm.invalid || this.alwaysForm.pending) {
|
|
17501
|
+
this.alwaysForm.markAllAsTouched();
|
|
17502
|
+
return;
|
|
17503
|
+
}
|
|
17504
|
+
this.dto = this.cleanFilterPayload(projected);
|
|
17335
17505
|
this.setActiveFiltersCount(Object.keys(this.dto).length);
|
|
17336
17506
|
this.emitSubmitDto();
|
|
17337
17507
|
this.persist();
|
|
@@ -17355,6 +17525,7 @@ class PraxisFilter {
|
|
|
17355
17525
|
// Mescla melhor esforço: prioriza valores atuais do form avançado (se aberto)
|
|
17356
17526
|
const raw = {
|
|
17357
17527
|
...(this.dto || {}),
|
|
17528
|
+
...(this.alwaysForm?.getRawValue?.() || {}),
|
|
17358
17529
|
...(this.advancedForm?.getRawValue?.() || {}),
|
|
17359
17530
|
};
|
|
17360
17531
|
this.saveAsShortcutFromDto(raw);
|
|
@@ -17366,9 +17537,14 @@ class PraxisFilter {
|
|
|
17366
17537
|
try {
|
|
17367
17538
|
if (!this.allowSaveTags)
|
|
17368
17539
|
return;
|
|
17540
|
+
if (this.alwaysForm.invalid || this.alwaysForm.pending || this.advancedForm?.invalid || this.advancedForm?.pending)
|
|
17541
|
+
return;
|
|
17542
|
+
const projected = this.projectQueryPayload(dto || {});
|
|
17543
|
+
if (projected === null)
|
|
17544
|
+
return;
|
|
17369
17545
|
// Limpa chaves com valores vazios para evitar chips "vazios"
|
|
17370
17546
|
const cleaned = {};
|
|
17371
|
-
Object.assign(cleaned, this.cleanFilterPayload(
|
|
17547
|
+
Object.assign(cleaned, this.cleanFilterPayload(projected));
|
|
17372
17548
|
if (!Object.keys(cleaned).length)
|
|
17373
17549
|
return;
|
|
17374
17550
|
this.requestShortcutLabel(this.i18nLabels.saveAsShortcut, '', (label) => {
|
|
@@ -17787,7 +17963,9 @@ class PraxisFilter {
|
|
|
17787
17963
|
this.advancedDebouncedSub = this.advancedChange$
|
|
17788
17964
|
.pipe(debounceTime(this.changeDebounceMs), takeUntilDestroyed(this.destroyRef))
|
|
17789
17965
|
.subscribe((val) => {
|
|
17790
|
-
const data = val ?? {};
|
|
17966
|
+
const data = this.projectQueryPayload(val ?? {});
|
|
17967
|
+
if (data === null || this.alwaysForm.invalid || this.alwaysForm.pending || this.advancedForm?.invalid || this.advancedForm?.pending)
|
|
17968
|
+
return;
|
|
17791
17969
|
Object.keys(data).forEach((key) => {
|
|
17792
17970
|
const value = data[key];
|
|
17793
17971
|
if (this.isIncompleteInlineDateRangeValue(key, value)) {
|
|
@@ -17808,11 +17986,12 @@ class PraxisFilter {
|
|
|
17808
17986
|
}
|
|
17809
17987
|
this.lastSubmitAt = now;
|
|
17810
17988
|
// Impedir submit se o avançado estiver aberto e inválido
|
|
17811
|
-
if (this.advancedOpen && this.advancedForm &&
|
|
17989
|
+
if (this.advancedOpen && this.advancedForm && (this.advancedForm.invalid || this.advancedForm.pending)) {
|
|
17812
17990
|
this.advancedForm.markAllAsTouched();
|
|
17813
17991
|
return;
|
|
17814
17992
|
}
|
|
17815
|
-
this.syncFormsToDto()
|
|
17993
|
+
if (!this.syncFormsToDto())
|
|
17994
|
+
return;
|
|
17816
17995
|
this.setActiveFiltersCount(Object.keys(this.dto).length);
|
|
17817
17996
|
this.emitSubmitDto();
|
|
17818
17997
|
this.persist();
|
|
@@ -17914,7 +18093,7 @@ class PraxisFilter {
|
|
|
17914
18093
|
this.advancedOpen = true;
|
|
17915
18094
|
this.saveConfig();
|
|
17916
18095
|
try {
|
|
17917
|
-
const { FilterFormDialogHostComponent } = await import('./praxisui-table-filter-form-dialog-host.component-
|
|
18096
|
+
const { FilterFormDialogHostComponent } = await import('./praxisui-table-filter-form-dialog-host.component-Cst6rkAK.mjs');
|
|
17918
18097
|
const formId = this.formId || this.filterId || 'filter';
|
|
17919
18098
|
const ref = this.dialog.open(FilterFormDialogHostComponent, {
|
|
17920
18099
|
width: '780px',
|
|
@@ -18257,10 +18436,21 @@ class PraxisFilter {
|
|
|
18257
18436
|
}
|
|
18258
18437
|
return false;
|
|
18259
18438
|
}
|
|
18439
|
+
projectQueryPayload(value) {
|
|
18440
|
+
const fields = new Map();
|
|
18441
|
+
for (const field of [...(this.advancedConfig?.fieldMetadata ?? []), ...(this.fieldMetadata ?? []), ...(this.schemaMetas ?? [])]) {
|
|
18442
|
+
fields.set(field.name, field);
|
|
18443
|
+
}
|
|
18444
|
+
return projectFilterPayload(value, [...fields.values()]);
|
|
18445
|
+
}
|
|
18260
18446
|
syncFormsToDto() {
|
|
18261
18447
|
// Mescla os valores dos forms (always, advanced) no DTO
|
|
18262
|
-
|
|
18263
|
-
|
|
18448
|
+
if (this.alwaysForm.invalid || this.alwaysForm.pending || this.advancedForm?.invalid || this.advancedForm?.pending)
|
|
18449
|
+
return false;
|
|
18450
|
+
const alwaysData = this.projectQueryPayload(this.alwaysForm?.getRawValue?.() ?? {});
|
|
18451
|
+
const advancedData = this.projectQueryPayload(this.advancedForm?.getRawValue?.() ?? {});
|
|
18452
|
+
if (alwaysData === null || advancedData === null)
|
|
18453
|
+
return false;
|
|
18264
18454
|
Object.keys(alwaysData).forEach((key) => {
|
|
18265
18455
|
const val = alwaysData[key];
|
|
18266
18456
|
if (this.isIncompleteInlineDateRangeValue(key, val)) {
|
|
@@ -18275,6 +18465,7 @@ class PraxisFilter {
|
|
|
18275
18465
|
}
|
|
18276
18466
|
this.upsertDtoValue(key, val);
|
|
18277
18467
|
});
|
|
18468
|
+
return true;
|
|
18278
18469
|
}
|
|
18279
18470
|
updateDisplayedTags() {
|
|
18280
18471
|
this.displayedTags = [...(this.tags ?? []), ...this.savedTags];
|
|
@@ -24759,7 +24950,7 @@ class PraxisTable {
|
|
|
24759
24950
|
if (this.aiAdapter || this.aiAdapterLoadStarted)
|
|
24760
24951
|
return;
|
|
24761
24952
|
this.aiAdapterLoadStarted = true;
|
|
24762
|
-
import('./praxisui-table-table-ai.adapter-
|
|
24953
|
+
import('./praxisui-table-table-ai.adapter-DEetBMv9.mjs')
|
|
24763
24954
|
.then(({ TableAiAdapter }) => {
|
|
24764
24955
|
if (!this.isAiAssistantEnabled()) {
|
|
24765
24956
|
this.aiAssistantOpenAfterAdapterLoad = false;
|
|
@@ -25531,7 +25722,7 @@ class PraxisTable {
|
|
|
25531
25722
|
initializeAiAssistantController() {
|
|
25532
25723
|
if (!this.aiAdapter || this.aiAssistantController)
|
|
25533
25724
|
return;
|
|
25534
|
-
import('./praxisui-table-table-agentic-authoring-turn-flow-
|
|
25725
|
+
import('./praxisui-table-table-agentic-authoring-turn-flow-sQz0BpSY.mjs')
|
|
25535
25726
|
.then(({ TableAgenticAuthoringTurnFlow }) => {
|
|
25536
25727
|
if (this.aiAssistantController || !this.aiAdapter)
|
|
25537
25728
|
return;
|
|
@@ -26171,6 +26362,19 @@ class PraxisTable {
|
|
|
26171
26362
|
return 'table_view';
|
|
26172
26363
|
}
|
|
26173
26364
|
emitLoadingState(phase, status, message, error, context) {
|
|
26365
|
+
const previousContext = phase === 'data' && status === 'error'
|
|
26366
|
+
? undefined
|
|
26367
|
+
: this.latestLoadingState?.context;
|
|
26368
|
+
const preservedCounts = {};
|
|
26369
|
+
if (previousContext?.totalItems !== undefined) {
|
|
26370
|
+
preservedCounts.totalItems = previousContext.totalItems;
|
|
26371
|
+
}
|
|
26372
|
+
if (previousContext?.loadedItemsCount !== undefined) {
|
|
26373
|
+
preservedCounts.loadedItemsCount = previousContext.loadedItemsCount;
|
|
26374
|
+
}
|
|
26375
|
+
if (previousContext?.page !== undefined) {
|
|
26376
|
+
preservedCounts.page = previousContext.page;
|
|
26377
|
+
}
|
|
26174
26378
|
this.latestLoadingState = {
|
|
26175
26379
|
phase,
|
|
26176
26380
|
status,
|
|
@@ -26180,6 +26384,7 @@ class PraxisTable {
|
|
|
26180
26384
|
componentType: 'praxis-table',
|
|
26181
26385
|
componentId: this.tableId,
|
|
26182
26386
|
resourcePath: this.resourcePath,
|
|
26387
|
+
...preservedCounts,
|
|
26183
26388
|
...(context || {}),
|
|
26184
26389
|
},
|
|
26185
26390
|
timestamp: new Date().toISOString(),
|
|
@@ -31463,6 +31668,28 @@ class PraxisTable {
|
|
|
31463
31668
|
await this.openResourceWorkflowAction(actionConfig, row, runtimeOptions?.focusOrigin);
|
|
31464
31669
|
return;
|
|
31465
31670
|
}
|
|
31671
|
+
const configuredQuickView = normalizeResourceQuickViewBinding(actionConfig?.quickView ?? runtimeOptions?.actionConfig?.quickView);
|
|
31672
|
+
if (configuredQuickView && this.quickViewService) {
|
|
31673
|
+
const anchorElement = isRuntimeFocusOrigin(runtimeOptions?.focusOrigin)
|
|
31674
|
+
? runtimeOptions.focusOrigin
|
|
31675
|
+
: this.hostRef?.nativeElement;
|
|
31676
|
+
if (anchorElement) {
|
|
31677
|
+
const endpointKey = this.getQuickViewEndpointKey();
|
|
31678
|
+
await this.quickViewService.openImmediate({
|
|
31679
|
+
binding: configuredQuickView,
|
|
31680
|
+
sourceRecord: row,
|
|
31681
|
+
anchor: {
|
|
31682
|
+
kind: 'element',
|
|
31683
|
+
element: anchorElement,
|
|
31684
|
+
focusOrigin: anchorElement,
|
|
31685
|
+
},
|
|
31686
|
+
trigger: 'explicit-button',
|
|
31687
|
+
...(endpointKey ? { endpointKey } : {}),
|
|
31688
|
+
sourceId: this.tableId || this.componentInstanceId || 'praxis-table',
|
|
31689
|
+
});
|
|
31690
|
+
return;
|
|
31691
|
+
}
|
|
31692
|
+
}
|
|
31466
31693
|
const configuredRecordSurface = this.toRecordSurfaceActionConfig(actionConfig);
|
|
31467
31694
|
if (this.crudContext
|
|
31468
31695
|
&& (configuredRecordSurface || this.isResourceSurfaceCatalogItem(actionConfig))) {
|
|
@@ -36584,11 +36811,35 @@ class PraxisTable {
|
|
|
36584
36811
|
this.applyAutoRenderer(field, column);
|
|
36585
36812
|
}
|
|
36586
36813
|
catch { }
|
|
36814
|
+
this.applySchemaComposeItemsQuickView(column, fieldsByName);
|
|
36815
|
+
}
|
|
36816
|
+
}
|
|
36817
|
+
applySchemaComposeItemsQuickView(col, fieldsByName) {
|
|
36818
|
+
const renderer = col?.renderer;
|
|
36819
|
+
if (renderer?.type !== 'compose' || !Array.isArray(renderer?.compose?.items)) {
|
|
36820
|
+
return;
|
|
36821
|
+
}
|
|
36822
|
+
for (const item of renderer.compose.items) {
|
|
36823
|
+
if (!item || typeof item !== 'object')
|
|
36824
|
+
continue;
|
|
36825
|
+
const itemType = typeof item.type === 'string' ? item.type.trim() : 'value';
|
|
36826
|
+
if (itemType !== 'value' || item.quickView !== undefined)
|
|
36827
|
+
continue;
|
|
36828
|
+
const itemFieldName = typeof item.field === 'string' ? item.field.trim() : '';
|
|
36829
|
+
if (!itemFieldName)
|
|
36830
|
+
continue;
|
|
36831
|
+
const itemField = fieldsByName.get(itemFieldName);
|
|
36832
|
+
if (itemField?.quickView) {
|
|
36833
|
+
item.quickView = this.clonePlainObject(itemField.quickView);
|
|
36834
|
+
}
|
|
36587
36835
|
}
|
|
36588
36836
|
}
|
|
36589
36837
|
applySchemaFieldPresentation(field, col) {
|
|
36590
36838
|
if (!field || !col)
|
|
36591
36839
|
return;
|
|
36840
|
+
if (field.quickView && !col.quickView) {
|
|
36841
|
+
col.quickView = this.clonePlainObject(field.quickView);
|
|
36842
|
+
}
|
|
36592
36843
|
const controlType = this.normalizePresentationToken(field.controlType);
|
|
36593
36844
|
const numericFormat = this.normalizePresentationToken(field.numericFormat ?? field.format);
|
|
36594
36845
|
const valuePresentationType = this.normalizePresentationToken(field.valuePresentation?.type);
|
|
@@ -41258,18 +41509,38 @@ class PraxisTable {
|
|
|
41258
41509
|
getItemEffectiveType(row, column, item) {
|
|
41259
41510
|
return this.getEffectiveRendererType(row, this.asItemColumn(column, item));
|
|
41260
41511
|
}
|
|
41512
|
+
hasRowQuickViewSourceIdentity(row, binding) {
|
|
41513
|
+
if (!binding)
|
|
41514
|
+
return false;
|
|
41515
|
+
if (!row || typeof row !== 'object')
|
|
41516
|
+
return false;
|
|
41517
|
+
const field = binding.recordOpen?.sourceIdentityField?.trim();
|
|
41518
|
+
if (!field)
|
|
41519
|
+
return false;
|
|
41520
|
+
const raw = this.getValueByPath?.(row, field) ?? row[field];
|
|
41521
|
+
if (raw === null || raw === undefined)
|
|
41522
|
+
return false;
|
|
41523
|
+
if (typeof raw === 'string')
|
|
41524
|
+
return raw.trim().length > 0;
|
|
41525
|
+
if (typeof raw === 'number')
|
|
41526
|
+
return Number.isFinite(raw);
|
|
41527
|
+
return false;
|
|
41528
|
+
}
|
|
41261
41529
|
getEffectiveQuickViewBinding(row, column) {
|
|
41262
41530
|
const eff = this.getEffectiveRenderer(row, column);
|
|
41263
41531
|
const type = typeof eff?.type === 'string' ? eff.type.trim() : '';
|
|
41264
41532
|
const rendererQuickView = type && eff?.[type] && typeof eff[type] === 'object'
|
|
41265
41533
|
? eff[type].quickView
|
|
41266
41534
|
: undefined;
|
|
41267
|
-
|
|
41535
|
+
const normalized = normalizeResourceQuickViewBinding(rendererQuickView ?? column?.quickView);
|
|
41536
|
+
return this.hasRowQuickViewSourceIdentity(row, normalized)
|
|
41537
|
+
? normalized
|
|
41538
|
+
: null;
|
|
41268
41539
|
}
|
|
41269
41540
|
getComposeValueQuickViewBinding(row, column, item) {
|
|
41270
41541
|
const direct = normalizeResourceQuickViewBinding(item?.quickView);
|
|
41271
41542
|
if (direct) {
|
|
41272
|
-
return direct;
|
|
41543
|
+
return this.hasRowQuickViewSourceIdentity(row, direct) ? direct : null;
|
|
41273
41544
|
}
|
|
41274
41545
|
const items = this.getComposeItems(row, column);
|
|
41275
41546
|
const anyItemHasQuickView = items.some((entry) => Boolean(entry?.quickView
|
|
@@ -41282,13 +41553,19 @@ class PraxisTable {
|
|
|
41282
41553
|
}
|
|
41283
41554
|
const firstValueItem = items.find((entry) => (entry?.type || 'value') === 'value');
|
|
41284
41555
|
if (firstValueItem === item) {
|
|
41285
|
-
|
|
41556
|
+
const colBinding = normalizeResourceQuickViewBinding(column?.quickView);
|
|
41557
|
+
return this.hasRowQuickViewSourceIdentity(row, colBinding)
|
|
41558
|
+
? colBinding
|
|
41559
|
+
: null;
|
|
41286
41560
|
}
|
|
41287
41561
|
return null;
|
|
41288
41562
|
}
|
|
41289
41563
|
getQuickViewEndpointKey() {
|
|
41290
41564
|
return this.crudContext?.endpointKey || null;
|
|
41291
41565
|
}
|
|
41566
|
+
getRowActionQuickViewBinding(action) {
|
|
41567
|
+
return normalizeResourceQuickViewBinding(action?.quickView);
|
|
41568
|
+
}
|
|
41292
41569
|
getQuickViewTriggerAriaLabel(label, column) {
|
|
41293
41570
|
const resolved = String(label || column?.header || column?.field || 'registro').trim();
|
|
41294
41571
|
return `Visualização rápida: ${resolved}`;
|
|
@@ -44452,7 +44729,7 @@ class PraxisTable {
|
|
|
44452
44729
|
TableDefaultsProvider,
|
|
44453
44730
|
FilterConfigService,
|
|
44454
44731
|
DataFormattingService
|
|
44455
|
-
], 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 (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 (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 defaultCellQuickView = getEffectiveQuickViewBinding(element, column);\n @if (defaultCellQuickView) {\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 >{{ getCellValue(element, column) }}</button>\n } @else {\n {{ getCellValue(element, column) }}\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 (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 (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 (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 (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%}\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"] }] });
|
|
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"] }] });
|
|
44456
44733
|
}
|
|
44457
44734
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisTable, decorators: [{
|
|
44458
44735
|
type: Component,
|
|
@@ -44493,7 +44770,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
44493
44770
|
TableDefaultsProvider,
|
|
44494
44771
|
FilterConfigService,
|
|
44495
44772
|
DataFormattingService
|
|
44496
|
-
], 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 (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 (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 defaultCellQuickView = getEffectiveQuickViewBinding(element, column);\n @if (defaultCellQuickView) {\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 >{{ getCellValue(element, column) }}</button>\n } @else {\n {{ getCellValue(element, column) }}\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 (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 (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 (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 (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%}\n"] }]
|
|
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"] }]
|
|
44497
44774
|
}], 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: [{
|
|
44498
44775
|
type: Inject,
|
|
44499
44776
|
args: [ASYNC_CONFIG_STORAGE]
|
|
@@ -89972,4 +90249,4 @@ function nativePath(value) {
|
|
|
89972
90249
|
* Generated bundle index. Do not edit.
|
|
89973
90250
|
*/
|
|
89974
90251
|
|
|
89975
|
-
export { TableRulesEditorComponent as $, ANALYTICS_TABLE_ROW_KEY_FIELD as A, BOOLEAN_PRESETS as B, CURRENCY_PRESETS as C, DATE_PRESETS as D, PraxisTable as E, FORMULA_TEMPLATES as F, PraxisTableConfigEditor as G, PraxisTableInlineAuthoringEditorComponent as H, PraxisTableToolbar as I, JsonConfigEditorComponent as J, PraxisTableWidgetConfigEditor as K, TABLE_COMPONENT_AI_CAPABILITIES as L, MessagesLocalizationEditorComponent as M, NUMBER_PRESETS as N, TABLE_COMPONENT_EDIT_PLAN_ALLOWED_CHANGE_KINDS as O, PERCENTAGE_PRESETS as P, TABLE_COMPONENT_EDIT_PLAN_BATCH_KIND as Q, TABLE_COMPONENT_EDIT_PLAN_EXPECTED_PATHS as R, STRING_PRESETS as S, TABLE_AI_CAPABILITIES as T, TABLE_COMPONENT_EDIT_PLAN_JSON_SCHEMA as U, TABLE_COMPONENT_EDIT_PLAN_KIND as V, TABLE_COMPONENT_EDIT_PLAN_OPERATION_IDS as W, TABLE_COMPONENT_EDIT_PLAN_VERSION as X, TABLE_GOVERNED_PAGE_PREVIEW_ADAPTER as Y, TASK_PRESETS as Z, TableDefaultsProvider as _, AnalyticalDrawerRegistryService as a, ToolbarActionsEditorComponent as a0, ValueMappingEditorComponent as a1, VisualFormulaBuilderComponent as a2, analyticsComparisonMetricField as a3, applyComputedFieldsToRows as a4, buildTableApplyPlan as a5, coerceTableComponentEditPlan as a6, coerceTableComponentEditPlans as a7, compileTableComponentEditPlan as a8, compileTableComponentEditPlans as a9, createTableAuthoringDocument as aa, decodeTablePageInputs as ab, encodeTablePageInputs as ac, formatComputedFieldValue as ad, getActionId as ae, getEnum as af, getTableCapabilities as ag, getTableComponentEditPlanCapabilities as ah, interpolateRelationEndpoint as ai, isAnalyticalDrawerSchema as aj, isTableRendererSupportedByRichContentP0 as ak, mapTableRendererToRichContentP0 as al, materializeTablePageRuntimeInputs as am, normalizeComputedFieldDefinition as an, normalizeTableAuthoringDocument as ao, parseLegacyOrTableDocument as ap,
|
|
90252
|
+
export { TableRulesEditorComponent as $, ANALYTICS_TABLE_ROW_KEY_FIELD as A, BOOLEAN_PRESETS as B, CURRENCY_PRESETS as C, DATE_PRESETS as D, PraxisTable as E, FORMULA_TEMPLATES as F, PraxisTableConfigEditor as G, PraxisTableInlineAuthoringEditorComponent as H, PraxisTableToolbar as I, JsonConfigEditorComponent as J, PraxisTableWidgetConfigEditor as K, TABLE_COMPONENT_AI_CAPABILITIES as L, MessagesLocalizationEditorComponent as M, NUMBER_PRESETS as N, TABLE_COMPONENT_EDIT_PLAN_ALLOWED_CHANGE_KINDS as O, PERCENTAGE_PRESETS as P, TABLE_COMPONENT_EDIT_PLAN_BATCH_KIND as Q, TABLE_COMPONENT_EDIT_PLAN_EXPECTED_PATHS as R, STRING_PRESETS as S, TABLE_AI_CAPABILITIES as T, TABLE_COMPONENT_EDIT_PLAN_JSON_SCHEMA as U, TABLE_COMPONENT_EDIT_PLAN_KIND as V, TABLE_COMPONENT_EDIT_PLAN_OPERATION_IDS as W, TABLE_COMPONENT_EDIT_PLAN_VERSION as X, TABLE_GOVERNED_PAGE_PREVIEW_ADAPTER as Y, TASK_PRESETS as Z, TableDefaultsProvider as _, AnalyticalDrawerRegistryService as a, ToolbarActionsEditorComponent as a0, ValueMappingEditorComponent as a1, VisualFormulaBuilderComponent as a2, analyticsComparisonMetricField as a3, applyComputedFieldsToRows as a4, buildTableApplyPlan as a5, coerceTableComponentEditPlan as a6, coerceTableComponentEditPlans as a7, compileTableComponentEditPlan as a8, compileTableComponentEditPlans as a9, validateTablePageWidget as aA, createTableAuthoringDocument as aa, decodeTablePageInputs as ab, encodeTablePageInputs as ac, formatComputedFieldValue as ad, getActionId as ae, getEnum as af, getTableCapabilities as ag, getTableComponentEditPlanCapabilities as ah, interpolateRelationEndpoint as ai, isAnalyticalDrawerSchema as aj, isTableRendererSupportedByRichContentP0 as ak, mapTableRendererToRichContentP0 as al, materializeTablePageRuntimeInputs as am, normalizeComputedFieldDefinition as an, normalizeTableAuthoringDocument as ao, parseLegacyOrTableDocument as ap, projectFilterPayload as aq, projectTablePageEditorChanges as ar, providePraxisAnalyticalDrawerSchemas as as, providePraxisFilterMetadata as at, providePraxisTableMetadata as au, providePraxisTableToolbarAppearance as av, serializeTableAuthoringDocument as aw, setTableActionGlobalActionRef as ax, toCanonicalTableConfig as ay, validateTableAuthoringDocument as az, AnalyticsTableConfigAdapterService as b, AnalyticsTableContractService as c, AnalyticsTableStatsApiService as d, BehaviorConfigEditorComponent as e, ColumnsConfigEditorComponent as f, DataFormatterComponent as g, DataFormattingService as h, FilterConfigService as i, FilterSettingsComponent as j, FormulaGeneratorService as k, PRAXIS_ANALYTICAL_DRAWER_SCHEMAS as l, PRAXIS_FILTER_AUTHORING_MANIFEST as m, PRAXIS_FILTER_COMPONENT_METADATA as n, PRAXIS_FILTER_VIEW_CONTEXT_SCHEMA_VERSION as o, PRAXIS_TABLE_AUTHORING_MANIFEST as p, PRAXIS_TABLE_COMPONENT_METADATA as q, PRAXIS_TABLE_TOOLBAR_APPEARANCE_PRESETS as r, PRAXIS_TABLE_TOOLBAR_DEFAULT_APPEARANCE as s, PRAXIS_TABLE_TOOLBAR_TOKEN_PRESETS as t, PraxisAnalyticalDrawerComponent as u, PraxisFilter as v, PraxisFilterOutletComponent as w, PraxisFilterOutletDirective as x, PraxisFilterWidgetConfigEditor as y, PraxisScopeBarComponent as z };
|