@praxisui/table 9.0.0-beta.47 → 9.0.0-beta.48

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.
@@ -96,10 +96,18 @@ const PRAXIS_TABLE_RUNTIME_I18N_CONFIG = {
96
96
  'table.chrome.disconnect': 'Desconectar',
97
97
  'table.chrome.disconnectTooltip': 'Desconectar da fonte de dados',
98
98
  'table.chrome.exportData': 'Exportar dados',
99
- 'table.chrome.exportVisibleExcel': 'Excel visível',
100
- 'table.export.completed': 'Exportacao concluida.',
101
- 'table.export.deferred': 'Exportacao enviada para processamento.',
102
- 'table.export.error': 'Nao foi possivel exportar os dados.',
99
+ 'table.chrome.exportVisibleExcel': 'Excel da página atual',
100
+ 'table.chrome.exportVisibleExcel.description': 'Baixa somente as linhas carregadas e as colunas visíveis da página atual.',
101
+ 'table.chrome.exportFormat.csv.provider': 'CSV via provider',
102
+ 'table.chrome.exportFormat.excel.provider': 'Excel via provider',
103
+ 'table.chrome.exportFormat.json.provider': 'JSON via provider',
104
+ 'table.chrome.exportFormat.pdf.provider': 'PDF via provider',
105
+ 'table.chrome.exportFormat.print.provider': 'Impressão via provider',
106
+ 'table.chrome.exportFormat.provider.description': 'Usa o provider de exportação configurado conforme o escopo canônico da coleção.',
107
+ 'table.chrome.exportFormat.excel.provider.description': 'Usa o provider de exportação configurado para gerar o Excel conforme o escopo canônico da coleção.',
108
+ 'table.export.completed': 'Exportação concluída.',
109
+ 'table.export.deferred': 'Exportação enviada para processamento.',
110
+ 'table.export.error': 'Não foi possível exportar os dados.',
103
111
  'table.chrome.moreActions': 'Mais ações',
104
112
  'table.chrome.rowActions.more': 'Mais ações',
105
113
  'table.chrome.rowActions.loading': 'Carregando ações contextuais',
@@ -110,6 +118,10 @@ const PRAXIS_TABLE_RUNTIME_I18N_CONFIG = {
110
118
  'table.chrome.collectionActions.create': 'Novo',
111
119
  'table.chrome.collectionActions.createTooltip': 'Criar novo registro',
112
120
  'table.chrome.collectionActions.createUnavailable': 'Criação indisponível no contexto atual',
121
+ 'table.chrome.actions.disabled.noSelection': 'Selecione ao menos um registro para executar esta ação.',
122
+ 'table.chrome.actions.disabled.minSelection': 'Selecione ao menos {min} registros para executar esta ação.',
123
+ 'table.chrome.actions.disabled.maxSelection': 'A seleção atual excede o limite permitido para esta ação.',
124
+ 'table.chrome.actions.disabled.generic': 'Ação indisponível no contexto atual.',
113
125
  'table.assistant.context.selectedRecords.label': 'Registros selecionados',
114
126
  'table.assistant.context.selectedRecords.value': '{count} registro(s) selecionado(s){ids}',
115
127
  'table.assistant.context.selectedRecords.value.singular': '{count} registro selecionado{ids}',
@@ -215,7 +227,15 @@ const PRAXIS_TABLE_RUNTIME_I18N_CONFIG = {
215
227
  'table.chrome.disconnect': 'Disconnect',
216
228
  'table.chrome.disconnectTooltip': 'Disconnect from the data source',
217
229
  'table.chrome.exportData': 'Export data',
218
- 'table.chrome.exportVisibleExcel': 'Visible Excel',
230
+ 'table.chrome.exportVisibleExcel': 'Current page Excel',
231
+ 'table.chrome.exportVisibleExcel.description': 'Downloads only the loaded rows and visible columns from the current page.',
232
+ 'table.chrome.exportFormat.csv.provider': 'CSV via provider',
233
+ 'table.chrome.exportFormat.excel.provider': 'Excel via provider',
234
+ 'table.chrome.exportFormat.json.provider': 'JSON via provider',
235
+ 'table.chrome.exportFormat.pdf.provider': 'PDF via provider',
236
+ 'table.chrome.exportFormat.print.provider': 'Print via provider',
237
+ 'table.chrome.exportFormat.provider.description': 'Uses the configured export provider according to the canonical collection scope.',
238
+ 'table.chrome.exportFormat.excel.provider.description': 'Uses the configured export provider to generate Excel according to the canonical collection scope.',
219
239
  'table.export.completed': 'Export completed.',
220
240
  'table.export.deferred': 'Export submitted for processing.',
221
241
  'table.export.error': 'Could not export the data.',
@@ -229,6 +249,10 @@ const PRAXIS_TABLE_RUNTIME_I18N_CONFIG = {
229
249
  'table.chrome.collectionActions.create': 'New',
230
250
  'table.chrome.collectionActions.createTooltip': 'Create a new record',
231
251
  'table.chrome.collectionActions.createUnavailable': 'Create is unavailable in the current context',
252
+ 'table.chrome.actions.disabled.noSelection': 'Select at least one record to run this action.',
253
+ 'table.chrome.actions.disabled.minSelection': 'Select at least {min} records to run this action.',
254
+ 'table.chrome.actions.disabled.maxSelection': 'The current selection exceeds the allowed limit for this action.',
255
+ 'table.chrome.actions.disabled.generic': 'Action unavailable in the current context.',
232
256
  'table.assistant.context.selectedRecords.label': 'Selected records',
233
257
  'table.assistant.context.selectedRecords.value': '{count} selected record(s){ids}',
234
258
  'table.assistant.context.selectedRecords.value.singular': '{count} selected record{ids}',
@@ -573,6 +597,7 @@ class PraxisTableToolbar {
573
597
  warnedInvalidToolbarActionTypes = new Set();
574
598
  warnedMenuWithoutChildren = new Set();
575
599
  warnedVisibleWhenFallback = new Set();
600
+ warnedDisabledWhenFallback = new Set();
576
601
  warnedInvalidShortcuts = new Set();
577
602
  warnedInvalidShortcutScopes = new Set();
578
603
  warnedShortcutConflicts = new Set();
@@ -628,7 +653,40 @@ class PraxisTableToolbar {
628
653
  return this.tx('table.chrome.exportData', 'Exportar dados');
629
654
  }
630
655
  getVisibleExcelExportLabel() {
631
- return this.tx('table.chrome.exportVisibleExcel', 'Excel (visível)');
656
+ return this.tx('table.chrome.exportVisibleExcel', 'Excel da página atual');
657
+ }
658
+ getVisibleExcelExportDescription() {
659
+ return this.tx('table.chrome.exportVisibleExcel.description', 'Baixa somente as linhas carregadas e as colunas visíveis da página atual.');
660
+ }
661
+ getVisibleExcelExportAriaLabel() {
662
+ return `${this.getVisibleExcelExportLabel()}. ${this.getVisibleExcelExportDescription()}`;
663
+ }
664
+ getExportFormatLabel(format) {
665
+ const normalized = this.normalizeExportFormat(format);
666
+ switch (normalized) {
667
+ case 'excel':
668
+ return this.tx('table.chrome.exportFormat.excel.provider', 'Excel via provider');
669
+ case 'csv':
670
+ return this.tx('table.chrome.exportFormat.csv.provider', 'CSV via provider');
671
+ case 'json':
672
+ return this.tx('table.chrome.exportFormat.json.provider', 'JSON via provider');
673
+ case 'pdf':
674
+ return this.tx('table.chrome.exportFormat.pdf.provider', 'PDF via provider');
675
+ case 'print':
676
+ return this.tx('table.chrome.exportFormat.print.provider', 'Impressão via provider');
677
+ default:
678
+ return String(format || '').trim().toUpperCase();
679
+ }
680
+ }
681
+ getExportFormatTooltip(format) {
682
+ const normalized = this.normalizeExportFormat(format);
683
+ if (normalized === 'excel') {
684
+ return this.tx('table.chrome.exportFormat.excel.provider.description', 'Usa o provider de exportação configurado para gerar o Excel conforme o escopo canônico da coleção.');
685
+ }
686
+ return this.tx('table.chrome.exportFormat.provider.description', 'Usa o provider de exportação configurado conforme o escopo canônico da coleção.');
687
+ }
688
+ getExportFormatAriaLabel(format) {
689
+ return `${this.getExportFormatLabel(format)}. ${this.getExportFormatTooltip(format)}`;
632
690
  }
633
691
  getMoreActionsLabel() {
634
692
  return this.tx('table.chrome.moreActions', 'Mais ações');
@@ -646,7 +704,15 @@ class PraxisTableToolbar {
646
704
  this.exportAction.emit({ format: 'excel', scope: 'currentPage', localOnly: true });
647
705
  }
648
706
  isExcelExportFormat(format) {
649
- return String(format || '').trim().toLowerCase() === 'excel';
707
+ const normalized = this.normalizeExportFormat(format);
708
+ return normalized === 'excel' || normalized === 'xlsx';
709
+ }
710
+ isVisibleExcelExportEnabled(format) {
711
+ return this.isExcelExportFormat(format)
712
+ && this.config?.export?.excel?.visibleCurrentPage !== false;
713
+ }
714
+ normalizeExportFormat(format) {
715
+ return String(format || '').trim().toLowerCase();
650
716
  }
651
717
  getColumnsVisibilityLabel() {
652
718
  return this.tx('table.chrome.columnsVisibility', 'Colunas');
@@ -693,10 +759,15 @@ class PraxisTableToolbar {
693
759
  toggleColumnVisibility(field, visible) {
694
760
  this.columnVisibilityToggle.emit({ field, visible });
695
761
  }
696
- tx(key, fallback) {
762
+ tx(key, fallback, params) {
697
763
  if (!this.i18n)
698
- return fallback;
699
- return translateTableRuntimeText(this.i18n, key, fallback, undefined, this.config?.localization?.locale);
764
+ return this.interpolateText(fallback, params);
765
+ return translateTableRuntimeText(this.i18n, key, fallback, params, this.config?.localization?.locale);
766
+ }
767
+ interpolateText(template, params) {
768
+ if (!params)
769
+ return template;
770
+ return Object.entries(params).reduce((current, [key, value]) => current.replace(new RegExp(`\\{${key}\\}`, 'g'), String(value ?? '')), template);
700
771
  }
701
772
  ngOnDestroy() {
702
773
  }
@@ -912,13 +983,36 @@ class PraxisTableToolbar {
912
983
  }
913
984
  getActionAriaLabel(action) {
914
985
  const label = String(action?.label || '').trim();
986
+ if (label && this.isActionDisabled(action)) {
987
+ return `${label}. ${this.resolveDisabledActionReason(action)}`;
988
+ }
915
989
  if (label)
916
990
  return label;
917
991
  const actionId = getActionId(action);
918
992
  return actionId || 'Acao';
919
993
  }
920
994
  isActionDisabled(action) {
921
- return action?.disabled === true;
995
+ if (!action)
996
+ return true;
997
+ if (action.disabled === true)
998
+ return true;
999
+ if (this.isBulkToolbarAction(action)) {
1000
+ const selectedCount = this.getSelectedCount();
1001
+ const minSelections = this.getBulkActionMinSelections(action);
1002
+ if (selectedCount < minSelections)
1003
+ return true;
1004
+ const maxSelections = this.getBulkActionMaxSelections(action);
1005
+ if (maxSelections !== null && selectedCount > maxSelections)
1006
+ return true;
1007
+ }
1008
+ return this.evaluateDisabledWhen(action);
1009
+ }
1010
+ getActionTooltip(action) {
1011
+ const configured = String(action?.tooltip || '').trim();
1012
+ if (this.isActionDisabled(action)) {
1013
+ return configured || this.resolveDisabledActionReason(action);
1014
+ }
1015
+ return configured || null;
922
1016
  }
923
1017
  onDocumentKeydown(event) {
924
1018
  if (this.wasShortcutAlreadyHandled(event))
@@ -967,6 +1061,10 @@ class PraxisTableToolbar {
967
1061
  return [];
968
1062
  return this.config?.actions?.bulk?.actions || [];
969
1063
  }
1064
+ isBulkToolbarAction(action) {
1065
+ const actionId = getActionId(action);
1066
+ return this.getBulkToolbarActions().some((candidate) => candidate === action || getActionId(candidate) === actionId);
1067
+ }
970
1068
  getVisibleToolbarActions() {
971
1069
  const actions = this.config?.toolbar?.actions || [];
972
1070
  const sorted = this.sortActions(actions);
@@ -1025,6 +1123,34 @@ class PraxisTableToolbar {
1025
1123
  }
1026
1124
  return this.resolveVisibleWhenFallback(action, String(expression ?? ''), 'invalid-non-json-logic-expression');
1027
1125
  }
1126
+ evaluateDisabledWhen(action) {
1127
+ const disabledWhen = action?.disabledWhen;
1128
+ if (disabledWhen === null
1129
+ || disabledWhen === undefined
1130
+ || (typeof disabledWhen === 'string' && !disabledWhen.trim())) {
1131
+ return false;
1132
+ }
1133
+ if (this.isJsonLogicExpression(disabledWhen)) {
1134
+ try {
1135
+ return this.jsonLogic.matches({
1136
+ condition: disabledWhen,
1137
+ data: this.buildEvaluationContext(),
1138
+ });
1139
+ }
1140
+ catch (error) {
1141
+ return this.resolveDisabledWhenFallback(action, JSON.stringify(disabledWhen), 'json-logic-eval-error', { error });
1142
+ }
1143
+ }
1144
+ return this.resolveDisabledWhenFallback(action, String(disabledWhen ?? ''), 'invalid-non-json-logic-expression');
1145
+ }
1146
+ resolveDisabledWhenFallback(action, expression, reason, extra) {
1147
+ this.warnDisabledWhenFallback(action, expression, reason, {
1148
+ policy: 'fail-closed',
1149
+ runtimeEnvironment: this.resolveRuntimeEnvironment(),
1150
+ ...(extra ? { details: extra } : {}),
1151
+ });
1152
+ return true;
1153
+ }
1028
1154
  isJsonLogicExpression(value) {
1029
1155
  return !!value && typeof value === 'object' && !Array.isArray(value);
1030
1156
  }
@@ -1074,6 +1200,42 @@ class PraxisTableToolbar {
1074
1200
  }
1075
1201
  return ctx;
1076
1202
  }
1203
+ getSelectedCount() {
1204
+ const selectedCount = Number(this.buildEvaluationContext()['selectedCount']);
1205
+ return Number.isFinite(selectedCount) && selectedCount > 0
1206
+ ? Math.floor(selectedCount)
1207
+ : 0;
1208
+ }
1209
+ getBulkActionMinSelections(action) {
1210
+ const value = Number(action?.minSelections);
1211
+ if (Number.isFinite(value)) {
1212
+ return Math.max(0, Math.floor(value));
1213
+ }
1214
+ return 1;
1215
+ }
1216
+ getBulkActionMaxSelections(action) {
1217
+ const value = Number(action?.maxSelections);
1218
+ if (!Number.isFinite(value))
1219
+ return null;
1220
+ return Math.max(0, Math.floor(value));
1221
+ }
1222
+ resolveDisabledActionReason(action) {
1223
+ if (this.isBulkToolbarAction(action)) {
1224
+ const selectedCount = this.getSelectedCount();
1225
+ const minSelections = this.getBulkActionMinSelections(action);
1226
+ if (selectedCount < minSelections) {
1227
+ if (minSelections > 1) {
1228
+ return this.tx('table.chrome.actions.disabled.minSelection', 'Selecione ao menos {min} registros para executar esta ação.', { min: minSelections });
1229
+ }
1230
+ return this.tx('table.chrome.actions.disabled.noSelection', 'Selecione ao menos um registro para executar esta ação.');
1231
+ }
1232
+ const maxSelections = this.getBulkActionMaxSelections(action);
1233
+ if (maxSelections !== null && selectedCount > maxSelections) {
1234
+ return this.tx('table.chrome.actions.disabled.maxSelection', 'A seleção atual excede o limite permitido para esta ação.');
1235
+ }
1236
+ }
1237
+ return this.tx('table.chrome.actions.disabled.generic', 'Ação indisponível no contexto atual.');
1238
+ }
1077
1239
  warnVisibleWhenFallback(action, expression, reason, extra) {
1078
1240
  const actionId = getActionId(action) || action?.label || 'unknown';
1079
1241
  const key = `${actionId}:${expression}:${reason}`;
@@ -1088,6 +1250,19 @@ class PraxisTableToolbar {
1088
1250
  ...(extra ? { extra } : {}),
1089
1251
  });
1090
1252
  }
1253
+ warnDisabledWhenFallback(action, expression, reason, extra) {
1254
+ const actionId = getActionId(action) || action?.label || 'unknown';
1255
+ const key = `${actionId}:${expression}:${reason}`;
1256
+ if (this.warnedDisabledWhenFallback.has(key))
1257
+ return;
1258
+ this.warnedDisabledWhenFallback.add(key);
1259
+ this.warnLog('[PraxisTableToolbar] disabledWhen evaluation failed; fail-closed policy applied.', {
1260
+ actionId,
1261
+ expression,
1262
+ reason,
1263
+ ...(extra ? { extra } : {}),
1264
+ });
1265
+ }
1091
1266
  collectShortcutBindings() {
1092
1267
  const map = new Map();
1093
1268
  const actions = [
@@ -1429,8 +1604,8 @@ class PraxisTableToolbar {
1429
1604
  [color]="getActionColor(action)"
1430
1605
  [disabled]="isActionDisabled(action)"
1431
1606
  (click)="emitToolbarAction($event, getActionId(action), action)"
1432
- [attr.aria-label]="action.label || getActionId(action)"
1433
- [matTooltip]="action.tooltip || action.label || getActionId(action)"
1607
+ [attr.aria-label]="getActionAriaLabel(action)"
1608
+ [matTooltip]="getActionTooltip(action) || action.label || getActionId(action)"
1434
1609
  matTooltipPosition="below"
1435
1610
  >
1436
1611
  <mat-icon [praxisIcon]="action.icon || 'bolt'"></mat-icon>
@@ -1442,8 +1617,8 @@ class PraxisTableToolbar {
1442
1617
  [color]="getActionColor(action)"
1443
1618
  [disabled]="isActionDisabled(action)"
1444
1619
  (click)="emitToolbarAction($event, getActionId(action), action)"
1445
- [attr.aria-label]="action.label || getActionId(action)"
1446
- [matTooltip]="action.tooltip || action.label || getActionId(action)"
1620
+ [attr.aria-label]="getActionAriaLabel(action)"
1621
+ [matTooltip]="getActionTooltip(action) || action.label || getActionId(action)"
1447
1622
  matTooltipPosition="below"
1448
1623
  >
1449
1624
  <mat-icon [praxisIcon]="action.icon || 'bolt'"></mat-icon>
@@ -1454,6 +1629,7 @@ class PraxisTableToolbar {
1454
1629
  mat-button
1455
1630
  [color]="getActionColor(action)"
1456
1631
  [disabled]="isActionDisabled(action)"
1632
+ [matTooltip]="getActionTooltip(action)"
1457
1633
  [matMenuTriggerFor]="startActionMenu"
1458
1634
  [attr.aria-label]="getActionAriaLabel(action)"
1459
1635
  >
@@ -1465,6 +1641,7 @@ class PraxisTableToolbar {
1465
1641
  <button
1466
1642
  mat-menu-item
1467
1643
  [disabled]="isActionDisabled(child)"
1644
+ [matTooltip]="getActionTooltip(child)"
1468
1645
  (click)="emitToolbarAction($event, getActionId(child), child)"
1469
1646
  >
1470
1647
  @if (child.icon) { <mat-icon [praxisIcon]="child.icon"></mat-icon> }
@@ -1478,6 +1655,7 @@ class PraxisTableToolbar {
1478
1655
  mat-button
1479
1656
  [color]="getActionColor(action)"
1480
1657
  [disabled]="isActionDisabled(action)"
1658
+ [matTooltip]="getActionTooltip(action)"
1481
1659
  (click)="emitToolbarAction($event, getActionId(action), action)"
1482
1660
  [attr.aria-label]="getActionAriaLabel(action)"
1483
1661
  >
@@ -1490,6 +1668,7 @@ class PraxisTableToolbar {
1490
1668
  mat-stroked-button
1491
1669
  [color]="getActionColor(action)"
1492
1670
  [disabled]="isActionDisabled(action)"
1671
+ [matTooltip]="getActionTooltip(action)"
1493
1672
  (click)="emitToolbarAction($event, getActionId(action), action)"
1494
1673
  [attr.aria-label]="getActionAriaLabel(action)"
1495
1674
  >
@@ -1502,6 +1681,7 @@ class PraxisTableToolbar {
1502
1681
  mat-raised-button
1503
1682
  [color]="getActionColor(action)"
1504
1683
  [disabled]="isActionDisabled(action)"
1684
+ [matTooltip]="getActionTooltip(action)"
1505
1685
  (click)="emitToolbarAction($event, getActionId(action), action)"
1506
1686
  [attr.aria-label]="getActionAriaLabel(action)"
1507
1687
  >
@@ -1514,6 +1694,7 @@ class PraxisTableToolbar {
1514
1694
  mat-button
1515
1695
  [color]="getActionColor(action)"
1516
1696
  [disabled]="isActionDisabled(action)"
1697
+ [matTooltip]="getActionTooltip(action)"
1517
1698
  (click)="emitToolbarAction($event, getActionId(action), action)"
1518
1699
  [attr.aria-label]="getActionAriaLabel(action)"
1519
1700
  >
@@ -1526,6 +1707,7 @@ class PraxisTableToolbar {
1526
1707
  mat-button
1527
1708
  [color]="getActionColor(action)"
1528
1709
  [disabled]="isActionDisabled(action)"
1710
+ [matTooltip]="getActionTooltip(action)"
1529
1711
  (click)="emitToolbarAction($event, getActionId(action), action)"
1530
1712
  [attr.aria-label]="getActionAriaLabel(action)"
1531
1713
  >
@@ -1538,6 +1720,7 @@ class PraxisTableToolbar {
1538
1720
  mat-flat-button
1539
1721
  [color]="getActionColor(action)"
1540
1722
  [disabled]="isActionDisabled(action)"
1723
+ [matTooltip]="getActionTooltip(action)"
1541
1724
  (click)="emitToolbarAction($event, getActionId(action), action)"
1542
1725
  [attr.aria-label]="getActionAriaLabel(action)"
1543
1726
  >
@@ -1555,8 +1738,8 @@ class PraxisTableToolbar {
1555
1738
  [color]="getActionColor(action)"
1556
1739
  [disabled]="isActionDisabled(action)"
1557
1740
  (click)="emitToolbarAction($event, getActionId(action), action)"
1558
- [attr.aria-label]="action.label || getActionId(action)"
1559
- [matTooltip]="action.tooltip || action.label || getActionId(action)"
1741
+ [attr.aria-label]="getActionAriaLabel(action)"
1742
+ [matTooltip]="getActionTooltip(action) || action.label || getActionId(action)"
1560
1743
  matTooltipPosition="below"
1561
1744
  >
1562
1745
  <mat-icon [praxisIcon]="action.icon || 'bolt'"></mat-icon>
@@ -1568,8 +1751,8 @@ class PraxisTableToolbar {
1568
1751
  [color]="getActionColor(action)"
1569
1752
  [disabled]="isActionDisabled(action)"
1570
1753
  (click)="emitToolbarAction($event, getActionId(action), action)"
1571
- [attr.aria-label]="action.label || getActionId(action)"
1572
- [matTooltip]="action.tooltip || action.label || getActionId(action)"
1754
+ [attr.aria-label]="getActionAriaLabel(action)"
1755
+ [matTooltip]="getActionTooltip(action) || action.label || getActionId(action)"
1573
1756
  matTooltipPosition="below"
1574
1757
  >
1575
1758
  <mat-icon [praxisIcon]="action.icon || 'bolt'"></mat-icon>
@@ -1580,6 +1763,7 @@ class PraxisTableToolbar {
1580
1763
  mat-button
1581
1764
  [color]="getActionColor(action)"
1582
1765
  [disabled]="isActionDisabled(action)"
1766
+ [matTooltip]="getActionTooltip(action)"
1583
1767
  [matMenuTriggerFor]="endActionMenu"
1584
1768
  [attr.aria-label]="getActionAriaLabel(action)"
1585
1769
  >
@@ -1591,6 +1775,7 @@ class PraxisTableToolbar {
1591
1775
  <button
1592
1776
  mat-menu-item
1593
1777
  [disabled]="isActionDisabled(child)"
1778
+ [matTooltip]="getActionTooltip(child)"
1594
1779
  (click)="emitToolbarAction($event, getActionId(child), child)"
1595
1780
  >
1596
1781
  @if (child.icon) { <mat-icon [praxisIcon]="child.icon"></mat-icon> }
@@ -1604,6 +1789,7 @@ class PraxisTableToolbar {
1604
1789
  mat-button
1605
1790
  [color]="getActionColor(action)"
1606
1791
  [disabled]="isActionDisabled(action)"
1792
+ [matTooltip]="getActionTooltip(action)"
1607
1793
  (click)="emitToolbarAction($event, getActionId(action), action)"
1608
1794
  [attr.aria-label]="getActionAriaLabel(action)"
1609
1795
  >
@@ -1616,6 +1802,7 @@ class PraxisTableToolbar {
1616
1802
  mat-stroked-button
1617
1803
  [color]="getActionColor(action)"
1618
1804
  [disabled]="isActionDisabled(action)"
1805
+ [matTooltip]="getActionTooltip(action)"
1619
1806
  (click)="emitToolbarAction($event, getActionId(action), action)"
1620
1807
  [attr.aria-label]="getActionAriaLabel(action)"
1621
1808
  >
@@ -1628,6 +1815,7 @@ class PraxisTableToolbar {
1628
1815
  mat-raised-button
1629
1816
  [color]="getActionColor(action)"
1630
1817
  [disabled]="isActionDisabled(action)"
1818
+ [matTooltip]="getActionTooltip(action)"
1631
1819
  (click)="emitToolbarAction($event, getActionId(action), action)"
1632
1820
  [attr.aria-label]="getActionAriaLabel(action)"
1633
1821
  >
@@ -1640,6 +1828,7 @@ class PraxisTableToolbar {
1640
1828
  mat-button
1641
1829
  [color]="getActionColor(action)"
1642
1830
  [disabled]="isActionDisabled(action)"
1831
+ [matTooltip]="getActionTooltip(action)"
1643
1832
  (click)="emitToolbarAction($event, getActionId(action), action)"
1644
1833
  [attr.aria-label]="getActionAriaLabel(action)"
1645
1834
  >
@@ -1652,6 +1841,7 @@ class PraxisTableToolbar {
1652
1841
  mat-button
1653
1842
  [color]="getActionColor(action)"
1654
1843
  [disabled]="isActionDisabled(action)"
1844
+ [matTooltip]="getActionTooltip(action)"
1655
1845
  (click)="emitToolbarAction($event, getActionId(action), action)"
1656
1846
  [attr.aria-label]="getActionAriaLabel(action)"
1657
1847
  >
@@ -1664,6 +1854,7 @@ class PraxisTableToolbar {
1664
1854
  mat-flat-button
1665
1855
  [color]="getActionColor(action)"
1666
1856
  [disabled]="isActionDisabled(action)"
1857
+ [matTooltip]="getActionTooltip(action)"
1667
1858
  (click)="emitToolbarAction($event, getActionId(action), action)"
1668
1859
  [attr.aria-label]="getActionAriaLabel(action)"
1669
1860
  >
@@ -1680,6 +1871,7 @@ class PraxisTableToolbar {
1680
1871
  mat-button
1681
1872
  [color]="getActionColor(action)"
1682
1873
  [disabled]="isActionDisabled(action)"
1874
+ [matTooltip]="getActionTooltip(action)"
1683
1875
  (click)="emitToolbarAction($event, getActionId(action), action)"
1684
1876
  [attr.aria-label]="getActionAriaLabel(action)"
1685
1877
  >
@@ -1706,16 +1898,22 @@ class PraxisTableToolbar {
1706
1898
  @for (format of config?.export?.formats; track format) {
1707
1899
  <button
1708
1900
  mat-menu-item
1901
+ class="praxis-table-export-menu-item"
1709
1902
  [disabled]="exportBusy"
1903
+ [matTooltip]="getExportFormatTooltip(format)"
1904
+ [attr.aria-label]="getExportFormatAriaLabel(format)"
1710
1905
  (click)="emitExportAction($event, format)"
1711
1906
  >
1712
1907
  <mat-icon [praxisIcon]="getExportIcon(format)"></mat-icon>
1713
- {{ format.toUpperCase() }}
1908
+ {{ getExportFormatLabel(format) }}
1714
1909
  </button>
1715
- @if (isExcelExportFormat(format)) {
1910
+ @if (isVisibleExcelExportEnabled(format)) {
1716
1911
  <button
1717
1912
  mat-menu-item
1913
+ class="praxis-table-export-menu-item"
1718
1914
  [disabled]="exportBusy"
1915
+ [matTooltip]="getVisibleExcelExportDescription()"
1916
+ [attr.aria-label]="getVisibleExcelExportAriaLabel()"
1719
1917
  (click)="emitVisibleExcelExportAction($event)"
1720
1918
  >
1721
1919
  <mat-icon [praxisIcon]="'table_view'"></mat-icon>
@@ -1792,6 +1990,7 @@ class PraxisTableToolbar {
1792
1990
  <button
1793
1991
  mat-menu-item
1794
1992
  [disabled]="isActionDisabled(action)"
1993
+ [matTooltip]="getActionTooltip(action)"
1795
1994
  (click)="emitToolbarAction($event, getActionId(action), action)"
1796
1995
  >
1797
1996
  @if (action.icon) { <mat-icon [praxisIcon]="action.icon"></mat-icon> }
@@ -1814,16 +2013,22 @@ class PraxisTableToolbar {
1814
2013
  @for (format of config?.export?.formats; track format) {
1815
2014
  <button
1816
2015
  mat-menu-item
2016
+ class="praxis-table-export-menu-item"
1817
2017
  [disabled]="exportBusy"
2018
+ [matTooltip]="getExportFormatTooltip(format)"
2019
+ [attr.aria-label]="getExportFormatAriaLabel(format)"
1818
2020
  (click)="emitExportAction($event, format)"
1819
2021
  >
1820
2022
  <mat-icon>{{ getExportIcon(format) }}</mat-icon>
1821
- {{ format.toUpperCase() }}
2023
+ {{ getExportFormatLabel(format) }}
1822
2024
  </button>
1823
- @if (isExcelExportFormat(format)) {
2025
+ @if (isVisibleExcelExportEnabled(format)) {
1824
2026
  <button
1825
2027
  mat-menu-item
2028
+ class="praxis-table-export-menu-item"
1826
2029
  [disabled]="exportBusy"
2030
+ [matTooltip]="getVisibleExcelExportDescription()"
2031
+ [attr.aria-label]="getVisibleExcelExportAriaLabel()"
1827
2032
  (click)="emitVisibleExcelExportAction($event)"
1828
2033
  >
1829
2034
  <mat-icon [praxisIcon]="'table_view'"></mat-icon>
@@ -1877,7 +2082,7 @@ class PraxisTableToolbar {
1877
2082
  }
1878
2083
  </div>
1879
2084
  </mat-toolbar>
1880
- `, isInline: true, styles: [":host{display:block}.praxis-toolbar{--p-table-toolbar-bg-default: linear-gradient( 180deg, color-mix(in srgb, var(--md-sys-color-surface, #fff) 96%, transparent), color-mix(in srgb, var(--md-sys-color-surface-container-low, #f6f8fc) 100%, transparent) );--p-table-toolbar-fg-default: var(--md-sys-color-on-surface, currentColor);--p-table-toolbar-border-color-default: color-mix(in srgb, var(--md-sys-color-outline-variant, #d7dbe5) 78%, transparent);--p-table-toolbar-divider-color-default: color-mix(in srgb, var(--md-sys-color-outline) 42%, transparent);--p-table-toolbar-action-hover-bg-default: color-mix(in srgb, var(--md-sys-color-primary) 10%, transparent);--p-table-toolbar-action-active-bg-default: color-mix(in srgb, var(--md-sys-color-primary) 16%, transparent);--p-table-toolbar-action-focus-ring-default: color-mix(in srgb, var(--md-sys-color-primary) 52%, transparent);--p-table-toolbar-ai-accent-color-default: var(--md-sys-color-primary, #0b72d9);--p-table-toolbar-status-fg-default: var(--md-sys-color-on-surface-variant, currentColor);background:var(--p-table-toolbar-bg, var(--p-table-toolbar-bg-default));color:var(--p-table-toolbar-fg, var(--p-table-toolbar-fg-default));box-shadow:var(--p-table-toolbar-shadow, none);padding:var(--p-table-toolbar-padding-block, var(--pfx-toolbar-pad-y, 6px)) var(--p-table-toolbar-padding-inline, var(--pfx-toolbar-pad-x, 12px));min-height:var(--p-table-toolbar-min-height, var(--pfx-filter-h, 44px));display:flex;flex-direction:row;align-items:center;gap:var(--p-table-toolbar-gap, 6px);flex-wrap:wrap;border:var(--p-table-toolbar-border-width, 1px) solid var(--p-table-toolbar-border-color, var(--p-table-toolbar-border-color-default));border-radius:var(--p-table-toolbar-radius, 10px)}.praxis-toolbar.p-table-toolbar--flat{--p-table-toolbar-border-width: 0;--p-table-toolbar-shadow: none}.praxis-toolbar.p-table-toolbar--elevated{--p-table-toolbar-shadow: 0 12px 28px color-mix(in srgb, var(--md-sys-color-shadow, #000) 12%, transparent)}.praxis-toolbar.p-table-toolbar--integrated{--p-table-toolbar-bg: transparent;--p-table-toolbar-border-width: 0;--p-table-toolbar-radius: 0}.praxis-toolbar.p-table-toolbar--compact{--p-table-toolbar-min-height: 36px;--p-table-toolbar-padding-block: 4px;--p-table-toolbar-padding-inline: 10px;--p-table-toolbar-gap: 4px;--p-table-toolbar-actions-gap: 4px;--p-table-toolbar-action-size: 32px;--p-table-toolbar-action-radius: 7px}.praxis-toolbar.p-table-toolbar--comfortable{--p-table-toolbar-min-height: 44px;--p-table-toolbar-action-size: 36px}.praxis-toolbar.p-table-toolbar--spacious{--p-table-toolbar-min-height: 52px;--p-table-toolbar-padding-block: 8px;--p-table-toolbar-padding-inline: 16px;--p-table-toolbar-gap: 8px;--p-table-toolbar-actions-gap: 8px;--p-table-toolbar-action-size: 40px}.praxis-toolbar.p-table-toolbar--square{--p-table-toolbar-radius: 0;--p-table-toolbar-action-radius: 4px}.praxis-toolbar.p-table-toolbar--pill{--p-table-toolbar-radius: 999px;--p-table-toolbar-action-radius: 999px}:host(.praxis-toolbar-stack-top) .praxis-toolbar{border-bottom-left-radius:0;border-bottom-right-radius:0}:host(.praxis-toolbar-footer) .praxis-toolbar{border-top-left-radius:0;border-top-right-radius:0}:host(.praxis-toolbar-footer.footer-flat) .praxis-toolbar{border-bottom-left-radius:0;border-bottom-right-radius:0}.praxis-toolbar.mat-toolbar-single-row,.praxis-toolbar .mat-toolbar-row{height:auto}.praxis-toolbar.mat-toolbar-multiple-rows{min-height:var(--p-table-toolbar-min-height, var(--pfx-filter-h, 44px))}.toolbar-main{display:flex;align-items:center;justify-content:flex-start;min-width:0;column-gap:var(--p-table-toolbar-gap, 6px);row-gap:var(--p-table-toolbar-identity-filter-gap, 8px);min-height:var(--p-table-toolbar-min-height, var(--pfx-filter-h, 44px));flex:1 1 360px;flex-wrap:wrap;container-type:inline-size}.toolbar-identity{display:flex;align-items:center;gap:var(--p-table-toolbar-identity-gap, 8px);min-width:0;max-width:100%;min-height:var(--p-table-toolbar-identity-min-height, 30px);flex:1 1 100%;margin-block-end:var(--p-table-toolbar-identity-margin-bottom, 2px);padding-inline:2px;color:var(--p-table-toolbar-title-fg, var(--p-table-toolbar-fg, var(--p-table-toolbar-fg-default)))}.toolbar-identity--center{text-align:center;justify-content:center}.toolbar-identity--end{text-align:end;justify-content:flex-end}.toolbar-identity--center .toolbar-identity__copy{align-items:center}.toolbar-identity--end .toolbar-identity__copy{align-items:flex-end}.toolbar-identity__icon{width:var(--p-table-toolbar-identity-icon-size, 28px);height:var(--p-table-toolbar-identity-icon-size, 28px);border-radius:var(--p-table-toolbar-identity-icon-radius, 8px);display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;color:var(--p-table-toolbar-icon-fg, var(--md-sys-color-primary, currentColor));background:color-mix(in srgb,var(--p-table-toolbar-icon-fg, var(--md-sys-color-primary, currentColor)) 8%,transparent);border:1px solid color-mix(in srgb,var(--p-table-toolbar-icon-fg, var(--md-sys-color-primary, currentColor)) 18%,transparent)}.toolbar-identity__icon .mat-icon{font-size:18px;width:18px;height:18px;line-height:18px}.toolbar-identity__copy{display:flex;flex-direction:column;min-width:0;max-width:100%;gap:1px}.toolbar-identity__title,.toolbar-identity__subtitle{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.toolbar-identity__title{font-size:var(--p-table-toolbar-title-font-size, 14px);font-weight:var(--p-table-toolbar-title-font-weight, 700);line-height:1.2;letter-spacing:0;color:var(--p-table-toolbar-title-fg, currentColor)}.toolbar-identity__subtitle{font-size:var(--p-table-toolbar-subtitle-font-size, 11.5px);line-height:1.25;color:var(--p-table-toolbar-subtitle-fg, var(--p-table-toolbar-status-fg, var(--p-table-toolbar-status-fg-default)))}.toolbar-main>*{min-width:0}@container (max-width: 720px){.toolbar-identity{flex-basis:100%;max-width:100%}}@container (max-width: 420px){.toolbar-identity{min-width:0;flex-basis:auto}.toolbar-identity__subtitle{display:none}}.toolbar-actions{display:flex;align-items:center;align-self:flex-end;justify-content:flex-end;gap:var(--p-table-toolbar-gap, 6px);min-height:var(--p-table-toolbar-min-height, var(--pfx-filter-h, 44px));flex:0 0 auto;margin-left:auto}.actions-group{display:flex;align-items:center;gap:var(--p-table-toolbar-actions-gap, 6px)}.action-btn{height:var(--p-table-toolbar-action-size, 36px);min-width:var(--p-table-toolbar-action-size, 36px);border-radius:var(--p-table-toolbar-action-radius, 8px);font-size:12px;line-height:1.2;color:var(--p-table-toolbar-action-fg, inherit);background:var(--p-table-toolbar-action-bg, transparent)}.action-btn:hover:not(:disabled),.overflow-trigger:hover:not(:disabled),.end-actions ::ng-deep .mat-mdc-icon-button:hover:not(:disabled){background:var(--p-table-toolbar-action-hover-bg, var(--p-table-toolbar-action-hover-bg-default))}.action-btn:focus-visible,.overflow-trigger:focus-visible,.end-actions ::ng-deep .mat-mdc-icon-button:focus-visible{outline:2px solid var(--p-table-toolbar-action-focus-ring, var(--p-table-toolbar-action-focus-ring-default));outline-offset:2px}.action-btn--utility{color:var(--p-table-toolbar-status-fg, var(--p-table-toolbar-status-fg-default))}.praxis-table-toolbar-action--columns.action-btn{width:var(--p-table-toolbar-action-size, 36px);padding:0}.praxis-table-toolbar-action--columns mat-icon{margin:0}.toolbar-icon-btn{width:var(--p-table-toolbar-action-size, 36px);height:var(--p-table-toolbar-action-size, 36px);border-radius:var(--p-table-toolbar-action-radius, 8px);color:var(--md-sys-color-primary);background:color-mix(in srgb,var(--md-sys-color-primary) 9%,transparent);border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 22%,transparent)}.toolbar-icon-btn:hover:not(:disabled){color:var(--md-sys-color-on-primary-container);background:color-mix(in srgb,var(--md-sys-color-primary) 16%,transparent);border-color:color-mix(in srgb,var(--md-sys-color-primary) 36%,transparent)}.action-btn--fab{width:42px;height:42px;box-shadow:none}.pfx-tonal{background:var(--md-sys-color-secondary-container);color:var(--md-sys-color-on-secondary-container)}.pfx-tonal:hover{background:var(--md-sys-color-secondary-container)}.mobile-actions{display:none;align-items:center;gap:var(--p-table-toolbar-actions-gap, 6px)}.overflow-trigger{height:var(--p-table-toolbar-action-size, 36px)}.action-btn .mat-icon,.action-btn--fab .mat-icon,.overflow-trigger .mat-icon{font-size:18px;width:18px;height:18px;line-height:18px}.praxis-table-toolbar-action--columns .mat-icon{font-size:24px;width:24px;height:24px;line-height:24px}.praxis-table-column-menu-item.mat-mdc-menu-item{min-height:40px}.praxis-table-column-menu-content{align-items:center;display:flex;gap:10px;min-height:40px;width:100%}.praxis-table-column-menu-check.mat-icon{color:var(--md-sys-color-primary, currentColor);flex:0 0 20px;font-size:20px;height:20px;line-height:20px;margin-inline-end:0;width:20px}.action-btn.mat-mdc-button-base,.action-btn--fab.mat-mdc-button-base,.overflow-trigger.mat-mdc-button-base,.toolbar-icon-btn.mat-mdc-button-base{--mdc-text-button-container-height: var(--p-table-toolbar-action-size, 36px);--mdc-filled-button-container-height: var(--p-table-toolbar-action-size, 36px);--mdc-protected-button-container-height: var(--p-table-toolbar-action-size, 36px);--mdc-outlined-button-container-height: var(--p-table-toolbar-action-size, 36px);--mdc-icon-button-state-layer-size: var(--p-table-toolbar-action-size, 36px)}.action-btn.mat-mdc-unelevated-button:not(:disabled),.action-btn.mat-mdc-outlined-button:not(:disabled),.action-btn.pfx-tonal:not(:disabled){border-color:color-mix(in srgb,var(--md-sys-color-outline-variant, #d7dbe5) 82%,transparent)}.action-btn.mat-mdc-unelevated-button:not(:disabled){box-shadow:none}.action-btn.mat-mdc-unelevated-button.mat-primary:not(:disabled){--mdc-filled-button-container-color: var(--md-sys-color-primary);--mdc-filled-button-label-text-color: var(--md-sys-color-on-primary);--mat-filled-button-state-layer-color: var(--md-sys-color-on-primary);background:var(--md-sys-color-primary)!important;border-color:transparent;color:var(--md-sys-color-on-primary)!important;box-shadow:0 8px 18px color-mix(in srgb,var(--md-sys-color-primary) 22%,transparent)}.action-btn.mat-mdc-unelevated-button.mat-primary:not(:disabled):hover{background:color-mix(in srgb,var(--md-sys-color-primary) 88%,var(--md-sys-color-on-primary) 12%)!important}.action-btn.mat-mdc-unelevated-button.mat-primary:not(:disabled) .mat-icon{color:var(--md-sys-color-on-primary)!important}.action-btn.mat-mdc-button-base:not(.mat-mdc-icon-button){padding-inline:10px}.end-actions{display:flex;align-items:center;gap:var(--p-table-toolbar-actions-gap, 6px);margin-left:4px;padding-left:10px;border-left:1px solid var(--p-table-toolbar-divider-color, var(--p-table-toolbar-divider-color-default))}.end-actions:empty{display:none;gap:0;margin-left:0;padding-left:0;border-left:0}.end-actions ::ng-deep .mat-mdc-icon-button{width:var(--p-table-toolbar-action-size, 36px);height:var(--p-table-toolbar-action-size, 36px);display:inline-grid;place-items:center;padding:0;line-height:0;--mdc-icon-button-state-layer-size: var(--p-table-toolbar-action-size, 36px);--mat-icon-button-state-layer-size: var(--p-table-toolbar-action-size, 36px)}.end-actions ::ng-deep .mat-mdc-icon-button .mat-icon{display:block;flex:0 0 auto;font-size:24px;width:24px;height:24px;line-height:24px;margin:0}.praxis-toolbar.p-table-toolbar--divider-between-groups .actions-group,.praxis-toolbar.p-table-toolbar--divider-start .toolbar-main{padding-right:10px;border-right:1px solid var(--p-table-toolbar-divider-color, var(--p-table-toolbar-divider-color-default))}.end-actions ::ng-deep .praxis-table-toolbar-action--ai,.end-actions ::ng-deep .praxis-table-ai-trigger{color:var(--p-table-toolbar-ai-accent-color, var(--p-table-toolbar-ai-accent-color-default));background:color-mix(in srgb,var(--p-table-toolbar-ai-accent-color, var(--p-table-toolbar-ai-accent-color-default)) 10%,transparent);border:1px solid color-mix(in srgb,var(--p-table-toolbar-ai-accent-color, var(--p-table-toolbar-ai-accent-color-default)) 24%,transparent)}.end-actions ::ng-deep [data-role=table-settings]{color:var(--p-table-toolbar-status-fg, var(--p-table-toolbar-status-fg-default))}@media(min-width:1024px){.toolbar-actions{justify-content:flex-end}}@media(max-width:1023px){.actions-group{display:none}.mobile-actions{display:flex}.toolbar-actions{justify-content:flex-end}.toolbar-identity{min-width:0;max-width:100%;flex:1 1 100%}}\n"], dependencies: [{ kind: "ngmodule", type: MatToolbarModule }, { kind: "component", type: i2.MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i3.MatFabButton, selector: "button[mat-fab], a[mat-fab], button[matFab], a[matFab]", inputs: ["extended"], exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: PraxisIconDirective, selector: "mat-icon[praxisIcon]", inputs: ["praxisIcon"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i5.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i5.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i5.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i10.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }] });
2085
+ `, isInline: true, styles: [":host{display:block}.praxis-toolbar{--p-table-toolbar-bg-default: linear-gradient( 180deg, color-mix(in srgb, var(--md-sys-color-surface, #fff) 96%, transparent), color-mix(in srgb, var(--md-sys-color-surface-container-low, #f6f8fc) 100%, transparent) );--p-table-toolbar-fg-default: var(--md-sys-color-on-surface, currentColor);--p-table-toolbar-border-color-default: color-mix(in srgb, var(--md-sys-color-outline-variant, #d7dbe5) 78%, transparent);--p-table-toolbar-divider-color-default: color-mix(in srgb, var(--md-sys-color-outline) 42%, transparent);--p-table-toolbar-action-hover-bg-default: color-mix(in srgb, var(--md-sys-color-primary) 10%, transparent);--p-table-toolbar-action-active-bg-default: color-mix(in srgb, var(--md-sys-color-primary) 16%, transparent);--p-table-toolbar-action-focus-ring-default: color-mix(in srgb, var(--md-sys-color-primary) 52%, transparent);--p-table-toolbar-ai-accent-color-default: var(--md-sys-color-primary, #0b72d9);--p-table-toolbar-status-fg-default: var(--md-sys-color-on-surface-variant, currentColor);background:var(--p-table-toolbar-bg, var(--p-table-toolbar-bg-default));color:var(--p-table-toolbar-fg, var(--p-table-toolbar-fg-default));box-shadow:var(--p-table-toolbar-shadow, none);padding:var(--p-table-toolbar-padding-block, var(--pfx-toolbar-pad-y, 6px)) var(--p-table-toolbar-padding-inline, var(--pfx-toolbar-pad-x, 12px));min-height:var(--p-table-toolbar-min-height, var(--pfx-filter-h, 44px));display:flex;flex-direction:row;align-items:center;gap:var(--p-table-toolbar-gap, 6px);flex-wrap:wrap;border:var(--p-table-toolbar-border-width, 1px) solid var(--p-table-toolbar-border-color, var(--p-table-toolbar-border-color-default));border-radius:var(--p-table-toolbar-radius, 10px)}.praxis-toolbar.p-table-toolbar--flat{--p-table-toolbar-border-width: 0;--p-table-toolbar-shadow: none}.praxis-toolbar.p-table-toolbar--elevated{--p-table-toolbar-shadow: 0 12px 28px color-mix(in srgb, var(--md-sys-color-shadow, #000) 12%, transparent)}.praxis-toolbar.p-table-toolbar--integrated{--p-table-toolbar-bg: transparent;--p-table-toolbar-border-width: 0;--p-table-toolbar-radius: 0}.praxis-toolbar.p-table-toolbar--compact{--p-table-toolbar-min-height: 36px;--p-table-toolbar-padding-block: 4px;--p-table-toolbar-padding-inline: 10px;--p-table-toolbar-gap: 4px;--p-table-toolbar-actions-gap: 4px;--p-table-toolbar-action-size: 32px;--p-table-toolbar-action-radius: 7px}.praxis-toolbar.p-table-toolbar--comfortable{--p-table-toolbar-min-height: 44px;--p-table-toolbar-action-size: 36px}.praxis-toolbar.p-table-toolbar--spacious{--p-table-toolbar-min-height: 52px;--p-table-toolbar-padding-block: 8px;--p-table-toolbar-padding-inline: 16px;--p-table-toolbar-gap: 8px;--p-table-toolbar-actions-gap: 8px;--p-table-toolbar-action-size: 40px}.praxis-toolbar.p-table-toolbar--square{--p-table-toolbar-radius: 0;--p-table-toolbar-action-radius: 4px}.praxis-toolbar.p-table-toolbar--pill{--p-table-toolbar-radius: 999px;--p-table-toolbar-action-radius: 999px}:host(.praxis-toolbar-stack-top) .praxis-toolbar{border-bottom-left-radius:0;border-bottom-right-radius:0}:host(.praxis-toolbar-footer) .praxis-toolbar{border-top-left-radius:0;border-top-right-radius:0}:host(.praxis-toolbar-footer.footer-flat) .praxis-toolbar{border-bottom-left-radius:0;border-bottom-right-radius:0}.praxis-toolbar.mat-toolbar-single-row,.praxis-toolbar .mat-toolbar-row{height:auto}.praxis-toolbar.mat-toolbar-multiple-rows{min-height:var(--p-table-toolbar-min-height, var(--pfx-filter-h, 44px))}.toolbar-main{display:flex;align-items:center;justify-content:flex-start;min-width:0;column-gap:var(--p-table-toolbar-gap, 6px);row-gap:var(--p-table-toolbar-identity-filter-gap, 8px);min-height:var(--p-table-toolbar-min-height, var(--pfx-filter-h, 44px));flex:1 1 360px;flex-wrap:wrap;container-type:inline-size}.toolbar-identity{display:flex;align-items:center;gap:var(--p-table-toolbar-identity-gap, 8px);min-width:0;max-width:100%;min-height:var(--p-table-toolbar-identity-min-height, 30px);flex:1 1 100%;margin-block-end:var(--p-table-toolbar-identity-margin-bottom, 2px);padding-inline:2px;color:var(--p-table-toolbar-title-fg, var(--p-table-toolbar-fg, var(--p-table-toolbar-fg-default)))}.toolbar-identity--center{text-align:center;justify-content:center}.toolbar-identity--end{text-align:end;justify-content:flex-end}.toolbar-identity--center .toolbar-identity__copy{align-items:center}.toolbar-identity--end .toolbar-identity__copy{align-items:flex-end}.toolbar-identity__icon{width:var(--p-table-toolbar-identity-icon-size, 28px);height:var(--p-table-toolbar-identity-icon-size, 28px);border-radius:var(--p-table-toolbar-identity-icon-radius, 8px);display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;color:var(--p-table-toolbar-icon-fg, var(--md-sys-color-primary, currentColor));background:color-mix(in srgb,var(--p-table-toolbar-icon-fg, var(--md-sys-color-primary, currentColor)) 8%,transparent);border:1px solid color-mix(in srgb,var(--p-table-toolbar-icon-fg, var(--md-sys-color-primary, currentColor)) 18%,transparent)}.toolbar-identity__icon .mat-icon{font-size:18px;width:18px;height:18px;line-height:18px}.toolbar-identity__copy{display:flex;flex-direction:column;min-width:0;max-width:100%;gap:1px}.toolbar-identity__title,.toolbar-identity__subtitle{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.toolbar-identity__title{font-size:var(--p-table-toolbar-title-font-size, 14px);font-weight:var(--p-table-toolbar-title-font-weight, 700);line-height:1.2;letter-spacing:0;color:var(--p-table-toolbar-title-fg, currentColor)}.toolbar-identity__subtitle{font-size:var(--p-table-toolbar-subtitle-font-size, 11.5px);line-height:1.25;color:var(--p-table-toolbar-subtitle-fg, var(--p-table-toolbar-status-fg, var(--p-table-toolbar-status-fg-default)))}.toolbar-main>*{min-width:0}@container (max-width: 720px){.toolbar-identity{flex-basis:100%;max-width:100%}}@container (max-width: 420px){.toolbar-identity{min-width:0;flex-basis:auto}.toolbar-identity__subtitle{display:none}}.toolbar-actions{display:flex;align-items:center;align-self:flex-end;justify-content:flex-end;gap:var(--p-table-toolbar-gap, 6px);min-height:var(--p-table-toolbar-min-height, var(--pfx-filter-h, 44px));flex:0 0 auto;margin-left:auto}.actions-group{display:flex;align-items:center;gap:var(--p-table-toolbar-actions-gap, 6px)}.action-btn{height:var(--p-table-toolbar-action-size, 36px);min-width:var(--p-table-toolbar-action-size, 36px);border-radius:var(--p-table-toolbar-action-radius, 8px);font-size:12px;line-height:1.2;color:var(--p-table-toolbar-action-fg, inherit);background:var(--p-table-toolbar-action-bg, transparent)}.action-btn:hover:not(:disabled),.overflow-trigger:hover:not(:disabled),.end-actions ::ng-deep .mat-mdc-icon-button:hover:not(:disabled){background:var(--p-table-toolbar-action-hover-bg, var(--p-table-toolbar-action-hover-bg-default))}.action-btn:focus-visible,.overflow-trigger:focus-visible,.end-actions ::ng-deep .mat-mdc-icon-button:focus-visible{outline:2px solid var(--p-table-toolbar-action-focus-ring, var(--p-table-toolbar-action-focus-ring-default));outline-offset:2px}.action-btn--utility{color:var(--p-table-toolbar-status-fg, var(--p-table-toolbar-status-fg-default))}.praxis-table-toolbar-action--columns.action-btn{width:var(--p-table-toolbar-action-size, 36px);padding:0}.praxis-table-toolbar-action--columns mat-icon{margin:0}.toolbar-icon-btn{width:var(--p-table-toolbar-action-size, 36px);height:var(--p-table-toolbar-action-size, 36px);border-radius:var(--p-table-toolbar-action-radius, 8px);color:var(--md-sys-color-primary);background:color-mix(in srgb,var(--md-sys-color-primary) 9%,transparent);border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 22%,transparent)}.toolbar-icon-btn:hover:not(:disabled){color:var(--md-sys-color-on-primary-container);background:color-mix(in srgb,var(--md-sys-color-primary) 16%,transparent);border-color:color-mix(in srgb,var(--md-sys-color-primary) 36%,transparent)}.action-btn--fab{width:42px;height:42px;box-shadow:none}.pfx-tonal{background:var(--md-sys-color-secondary-container);color:var(--md-sys-color-on-secondary-container)}.pfx-tonal:hover{background:var(--md-sys-color-secondary-container)}.mobile-actions{display:none;align-items:center;gap:var(--p-table-toolbar-actions-gap, 6px)}.overflow-trigger{height:var(--p-table-toolbar-action-size, 36px)}.action-btn .mat-icon,.action-btn--fab .mat-icon,.overflow-trigger .mat-icon{font-size:18px;width:18px;height:18px;line-height:18px}.praxis-table-toolbar-action--columns .mat-icon{font-size:24px;width:24px;height:24px;line-height:24px}.praxis-table-column-menu-item.mat-mdc-menu-item{min-height:40px}.praxis-table-export-menu-item.mat-mdc-menu-item{min-width:280px;white-space:nowrap}.praxis-table-column-menu-content{align-items:center;display:flex;gap:10px;min-height:40px;width:100%}.praxis-table-column-menu-check.mat-icon{color:var(--md-sys-color-primary, currentColor);flex:0 0 20px;font-size:20px;height:20px;line-height:20px;margin-inline-end:0;width:20px}.action-btn.mat-mdc-button-base,.action-btn--fab.mat-mdc-button-base,.overflow-trigger.mat-mdc-button-base,.toolbar-icon-btn.mat-mdc-button-base{--mdc-text-button-container-height: var(--p-table-toolbar-action-size, 36px);--mdc-filled-button-container-height: var(--p-table-toolbar-action-size, 36px);--mdc-protected-button-container-height: var(--p-table-toolbar-action-size, 36px);--mdc-outlined-button-container-height: var(--p-table-toolbar-action-size, 36px);--mdc-icon-button-state-layer-size: var(--p-table-toolbar-action-size, 36px)}.action-btn.mat-mdc-unelevated-button:not(:disabled),.action-btn.mat-mdc-outlined-button:not(:disabled),.action-btn.pfx-tonal:not(:disabled){border-color:color-mix(in srgb,var(--md-sys-color-outline-variant, #d7dbe5) 82%,transparent)}.action-btn.mat-mdc-unelevated-button:not(:disabled){box-shadow:none}.action-btn.mat-mdc-unelevated-button.mat-primary:not(:disabled){--mdc-filled-button-container-color: var(--md-sys-color-primary);--mdc-filled-button-label-text-color: var(--md-sys-color-on-primary);--mat-filled-button-state-layer-color: var(--md-sys-color-on-primary);background:var(--md-sys-color-primary)!important;border-color:transparent;color:var(--md-sys-color-on-primary)!important;box-shadow:0 8px 18px color-mix(in srgb,var(--md-sys-color-primary) 22%,transparent)}.action-btn.mat-mdc-unelevated-button.mat-primary:not(:disabled):hover{background:color-mix(in srgb,var(--md-sys-color-primary) 88%,var(--md-sys-color-on-primary) 12%)!important}.action-btn.mat-mdc-unelevated-button.mat-primary:not(:disabled) .mat-icon{color:var(--md-sys-color-on-primary)!important}.action-btn.mat-mdc-button-base:not(.mat-mdc-icon-button){padding-inline:10px}.end-actions{display:flex;align-items:center;gap:var(--p-table-toolbar-actions-gap, 6px);margin-left:4px;padding-left:10px;border-left:1px solid var(--p-table-toolbar-divider-color, var(--p-table-toolbar-divider-color-default))}.end-actions:empty{display:none;gap:0;margin-left:0;padding-left:0;border-left:0}.end-actions ::ng-deep .mat-mdc-icon-button{width:var(--p-table-toolbar-action-size, 36px);height:var(--p-table-toolbar-action-size, 36px);display:inline-grid;place-items:center;padding:0;line-height:0;--mdc-icon-button-state-layer-size: var(--p-table-toolbar-action-size, 36px);--mat-icon-button-state-layer-size: var(--p-table-toolbar-action-size, 36px)}.end-actions ::ng-deep .mat-mdc-icon-button .mat-icon{display:block;flex:0 0 auto;font-size:24px;width:24px;height:24px;line-height:24px;margin:0}.praxis-toolbar.p-table-toolbar--divider-between-groups .actions-group,.praxis-toolbar.p-table-toolbar--divider-start .toolbar-main{padding-right:10px;border-right:1px solid var(--p-table-toolbar-divider-color, var(--p-table-toolbar-divider-color-default))}.end-actions ::ng-deep .praxis-table-toolbar-action--ai,.end-actions ::ng-deep .praxis-table-ai-trigger{color:var(--p-table-toolbar-ai-accent-color, var(--p-table-toolbar-ai-accent-color-default));background:color-mix(in srgb,var(--p-table-toolbar-ai-accent-color, var(--p-table-toolbar-ai-accent-color-default)) 10%,transparent);border:1px solid color-mix(in srgb,var(--p-table-toolbar-ai-accent-color, var(--p-table-toolbar-ai-accent-color-default)) 24%,transparent)}.end-actions ::ng-deep [data-role=table-settings]{color:var(--p-table-toolbar-status-fg, var(--p-table-toolbar-status-fg-default))}@media(min-width:1024px){.toolbar-actions{justify-content:flex-end}}@media(max-width:1023px){.actions-group{display:none}.mobile-actions{display:flex}.toolbar-actions{justify-content:flex-end}.toolbar-identity{min-width:0;max-width:100%;flex:1 1 100%}}\n"], dependencies: [{ kind: "ngmodule", type: MatToolbarModule }, { kind: "component", type: i2.MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i3.MatFabButton, selector: "button[mat-fab], a[mat-fab], button[matFab], a[matFab]", inputs: ["extended"], exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: PraxisIconDirective, selector: "mat-icon[praxisIcon]", inputs: ["praxisIcon"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i5.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i5.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i5.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i10.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }] });
1881
2086
  }
1882
2087
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisTableToolbar, decorators: [{
1883
2088
  type: Component,
@@ -1983,8 +2188,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
1983
2188
  [color]="getActionColor(action)"
1984
2189
  [disabled]="isActionDisabled(action)"
1985
2190
  (click)="emitToolbarAction($event, getActionId(action), action)"
1986
- [attr.aria-label]="action.label || getActionId(action)"
1987
- [matTooltip]="action.tooltip || action.label || getActionId(action)"
2191
+ [attr.aria-label]="getActionAriaLabel(action)"
2192
+ [matTooltip]="getActionTooltip(action) || action.label || getActionId(action)"
1988
2193
  matTooltipPosition="below"
1989
2194
  >
1990
2195
  <mat-icon [praxisIcon]="action.icon || 'bolt'"></mat-icon>
@@ -1996,8 +2201,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
1996
2201
  [color]="getActionColor(action)"
1997
2202
  [disabled]="isActionDisabled(action)"
1998
2203
  (click)="emitToolbarAction($event, getActionId(action), action)"
1999
- [attr.aria-label]="action.label || getActionId(action)"
2000
- [matTooltip]="action.tooltip || action.label || getActionId(action)"
2204
+ [attr.aria-label]="getActionAriaLabel(action)"
2205
+ [matTooltip]="getActionTooltip(action) || action.label || getActionId(action)"
2001
2206
  matTooltipPosition="below"
2002
2207
  >
2003
2208
  <mat-icon [praxisIcon]="action.icon || 'bolt'"></mat-icon>
@@ -2008,6 +2213,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
2008
2213
  mat-button
2009
2214
  [color]="getActionColor(action)"
2010
2215
  [disabled]="isActionDisabled(action)"
2216
+ [matTooltip]="getActionTooltip(action)"
2011
2217
  [matMenuTriggerFor]="startActionMenu"
2012
2218
  [attr.aria-label]="getActionAriaLabel(action)"
2013
2219
  >
@@ -2019,6 +2225,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
2019
2225
  <button
2020
2226
  mat-menu-item
2021
2227
  [disabled]="isActionDisabled(child)"
2228
+ [matTooltip]="getActionTooltip(child)"
2022
2229
  (click)="emitToolbarAction($event, getActionId(child), child)"
2023
2230
  >
2024
2231
  @if (child.icon) { <mat-icon [praxisIcon]="child.icon"></mat-icon> }
@@ -2032,6 +2239,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
2032
2239
  mat-button
2033
2240
  [color]="getActionColor(action)"
2034
2241
  [disabled]="isActionDisabled(action)"
2242
+ [matTooltip]="getActionTooltip(action)"
2035
2243
  (click)="emitToolbarAction($event, getActionId(action), action)"
2036
2244
  [attr.aria-label]="getActionAriaLabel(action)"
2037
2245
  >
@@ -2044,6 +2252,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
2044
2252
  mat-stroked-button
2045
2253
  [color]="getActionColor(action)"
2046
2254
  [disabled]="isActionDisabled(action)"
2255
+ [matTooltip]="getActionTooltip(action)"
2047
2256
  (click)="emitToolbarAction($event, getActionId(action), action)"
2048
2257
  [attr.aria-label]="getActionAriaLabel(action)"
2049
2258
  >
@@ -2056,6 +2265,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
2056
2265
  mat-raised-button
2057
2266
  [color]="getActionColor(action)"
2058
2267
  [disabled]="isActionDisabled(action)"
2268
+ [matTooltip]="getActionTooltip(action)"
2059
2269
  (click)="emitToolbarAction($event, getActionId(action), action)"
2060
2270
  [attr.aria-label]="getActionAriaLabel(action)"
2061
2271
  >
@@ -2068,6 +2278,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
2068
2278
  mat-button
2069
2279
  [color]="getActionColor(action)"
2070
2280
  [disabled]="isActionDisabled(action)"
2281
+ [matTooltip]="getActionTooltip(action)"
2071
2282
  (click)="emitToolbarAction($event, getActionId(action), action)"
2072
2283
  [attr.aria-label]="getActionAriaLabel(action)"
2073
2284
  >
@@ -2080,6 +2291,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
2080
2291
  mat-button
2081
2292
  [color]="getActionColor(action)"
2082
2293
  [disabled]="isActionDisabled(action)"
2294
+ [matTooltip]="getActionTooltip(action)"
2083
2295
  (click)="emitToolbarAction($event, getActionId(action), action)"
2084
2296
  [attr.aria-label]="getActionAriaLabel(action)"
2085
2297
  >
@@ -2092,6 +2304,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
2092
2304
  mat-flat-button
2093
2305
  [color]="getActionColor(action)"
2094
2306
  [disabled]="isActionDisabled(action)"
2307
+ [matTooltip]="getActionTooltip(action)"
2095
2308
  (click)="emitToolbarAction($event, getActionId(action), action)"
2096
2309
  [attr.aria-label]="getActionAriaLabel(action)"
2097
2310
  >
@@ -2109,8 +2322,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
2109
2322
  [color]="getActionColor(action)"
2110
2323
  [disabled]="isActionDisabled(action)"
2111
2324
  (click)="emitToolbarAction($event, getActionId(action), action)"
2112
- [attr.aria-label]="action.label || getActionId(action)"
2113
- [matTooltip]="action.tooltip || action.label || getActionId(action)"
2325
+ [attr.aria-label]="getActionAriaLabel(action)"
2326
+ [matTooltip]="getActionTooltip(action) || action.label || getActionId(action)"
2114
2327
  matTooltipPosition="below"
2115
2328
  >
2116
2329
  <mat-icon [praxisIcon]="action.icon || 'bolt'"></mat-icon>
@@ -2122,8 +2335,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
2122
2335
  [color]="getActionColor(action)"
2123
2336
  [disabled]="isActionDisabled(action)"
2124
2337
  (click)="emitToolbarAction($event, getActionId(action), action)"
2125
- [attr.aria-label]="action.label || getActionId(action)"
2126
- [matTooltip]="action.tooltip || action.label || getActionId(action)"
2338
+ [attr.aria-label]="getActionAriaLabel(action)"
2339
+ [matTooltip]="getActionTooltip(action) || action.label || getActionId(action)"
2127
2340
  matTooltipPosition="below"
2128
2341
  >
2129
2342
  <mat-icon [praxisIcon]="action.icon || 'bolt'"></mat-icon>
@@ -2134,6 +2347,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
2134
2347
  mat-button
2135
2348
  [color]="getActionColor(action)"
2136
2349
  [disabled]="isActionDisabled(action)"
2350
+ [matTooltip]="getActionTooltip(action)"
2137
2351
  [matMenuTriggerFor]="endActionMenu"
2138
2352
  [attr.aria-label]="getActionAriaLabel(action)"
2139
2353
  >
@@ -2145,6 +2359,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
2145
2359
  <button
2146
2360
  mat-menu-item
2147
2361
  [disabled]="isActionDisabled(child)"
2362
+ [matTooltip]="getActionTooltip(child)"
2148
2363
  (click)="emitToolbarAction($event, getActionId(child), child)"
2149
2364
  >
2150
2365
  @if (child.icon) { <mat-icon [praxisIcon]="child.icon"></mat-icon> }
@@ -2158,6 +2373,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
2158
2373
  mat-button
2159
2374
  [color]="getActionColor(action)"
2160
2375
  [disabled]="isActionDisabled(action)"
2376
+ [matTooltip]="getActionTooltip(action)"
2161
2377
  (click)="emitToolbarAction($event, getActionId(action), action)"
2162
2378
  [attr.aria-label]="getActionAriaLabel(action)"
2163
2379
  >
@@ -2170,6 +2386,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
2170
2386
  mat-stroked-button
2171
2387
  [color]="getActionColor(action)"
2172
2388
  [disabled]="isActionDisabled(action)"
2389
+ [matTooltip]="getActionTooltip(action)"
2173
2390
  (click)="emitToolbarAction($event, getActionId(action), action)"
2174
2391
  [attr.aria-label]="getActionAriaLabel(action)"
2175
2392
  >
@@ -2182,6 +2399,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
2182
2399
  mat-raised-button
2183
2400
  [color]="getActionColor(action)"
2184
2401
  [disabled]="isActionDisabled(action)"
2402
+ [matTooltip]="getActionTooltip(action)"
2185
2403
  (click)="emitToolbarAction($event, getActionId(action), action)"
2186
2404
  [attr.aria-label]="getActionAriaLabel(action)"
2187
2405
  >
@@ -2194,6 +2412,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
2194
2412
  mat-button
2195
2413
  [color]="getActionColor(action)"
2196
2414
  [disabled]="isActionDisabled(action)"
2415
+ [matTooltip]="getActionTooltip(action)"
2197
2416
  (click)="emitToolbarAction($event, getActionId(action), action)"
2198
2417
  [attr.aria-label]="getActionAriaLabel(action)"
2199
2418
  >
@@ -2206,6 +2425,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
2206
2425
  mat-button
2207
2426
  [color]="getActionColor(action)"
2208
2427
  [disabled]="isActionDisabled(action)"
2428
+ [matTooltip]="getActionTooltip(action)"
2209
2429
  (click)="emitToolbarAction($event, getActionId(action), action)"
2210
2430
  [attr.aria-label]="getActionAriaLabel(action)"
2211
2431
  >
@@ -2218,6 +2438,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
2218
2438
  mat-flat-button
2219
2439
  [color]="getActionColor(action)"
2220
2440
  [disabled]="isActionDisabled(action)"
2441
+ [matTooltip]="getActionTooltip(action)"
2221
2442
  (click)="emitToolbarAction($event, getActionId(action), action)"
2222
2443
  [attr.aria-label]="getActionAriaLabel(action)"
2223
2444
  >
@@ -2234,6 +2455,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
2234
2455
  mat-button
2235
2456
  [color]="getActionColor(action)"
2236
2457
  [disabled]="isActionDisabled(action)"
2458
+ [matTooltip]="getActionTooltip(action)"
2237
2459
  (click)="emitToolbarAction($event, getActionId(action), action)"
2238
2460
  [attr.aria-label]="getActionAriaLabel(action)"
2239
2461
  >
@@ -2260,16 +2482,22 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
2260
2482
  @for (format of config?.export?.formats; track format) {
2261
2483
  <button
2262
2484
  mat-menu-item
2485
+ class="praxis-table-export-menu-item"
2263
2486
  [disabled]="exportBusy"
2487
+ [matTooltip]="getExportFormatTooltip(format)"
2488
+ [attr.aria-label]="getExportFormatAriaLabel(format)"
2264
2489
  (click)="emitExportAction($event, format)"
2265
2490
  >
2266
2491
  <mat-icon [praxisIcon]="getExportIcon(format)"></mat-icon>
2267
- {{ format.toUpperCase() }}
2492
+ {{ getExportFormatLabel(format) }}
2268
2493
  </button>
2269
- @if (isExcelExportFormat(format)) {
2494
+ @if (isVisibleExcelExportEnabled(format)) {
2270
2495
  <button
2271
2496
  mat-menu-item
2497
+ class="praxis-table-export-menu-item"
2272
2498
  [disabled]="exportBusy"
2499
+ [matTooltip]="getVisibleExcelExportDescription()"
2500
+ [attr.aria-label]="getVisibleExcelExportAriaLabel()"
2273
2501
  (click)="emitVisibleExcelExportAction($event)"
2274
2502
  >
2275
2503
  <mat-icon [praxisIcon]="'table_view'"></mat-icon>
@@ -2346,6 +2574,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
2346
2574
  <button
2347
2575
  mat-menu-item
2348
2576
  [disabled]="isActionDisabled(action)"
2577
+ [matTooltip]="getActionTooltip(action)"
2349
2578
  (click)="emitToolbarAction($event, getActionId(action), action)"
2350
2579
  >
2351
2580
  @if (action.icon) { <mat-icon [praxisIcon]="action.icon"></mat-icon> }
@@ -2368,16 +2597,22 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
2368
2597
  @for (format of config?.export?.formats; track format) {
2369
2598
  <button
2370
2599
  mat-menu-item
2600
+ class="praxis-table-export-menu-item"
2371
2601
  [disabled]="exportBusy"
2602
+ [matTooltip]="getExportFormatTooltip(format)"
2603
+ [attr.aria-label]="getExportFormatAriaLabel(format)"
2372
2604
  (click)="emitExportAction($event, format)"
2373
2605
  >
2374
2606
  <mat-icon>{{ getExportIcon(format) }}</mat-icon>
2375
- {{ format.toUpperCase() }}
2607
+ {{ getExportFormatLabel(format) }}
2376
2608
  </button>
2377
- @if (isExcelExportFormat(format)) {
2609
+ @if (isVisibleExcelExportEnabled(format)) {
2378
2610
  <button
2379
2611
  mat-menu-item
2612
+ class="praxis-table-export-menu-item"
2380
2613
  [disabled]="exportBusy"
2614
+ [matTooltip]="getVisibleExcelExportDescription()"
2615
+ [attr.aria-label]="getVisibleExcelExportAriaLabel()"
2381
2616
  (click)="emitVisibleExcelExportAction($event)"
2382
2617
  >
2383
2618
  <mat-icon [praxisIcon]="'table_view'"></mat-icon>
@@ -2434,7 +2669,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
2434
2669
  `, host: {
2435
2670
  '[class.praxis-toolbar-footer]': "placement === 'footer'",
2436
2671
  '(document:keydown)': 'onDocumentKeydown($event)',
2437
- }, styles: [":host{display:block}.praxis-toolbar{--p-table-toolbar-bg-default: linear-gradient( 180deg, color-mix(in srgb, var(--md-sys-color-surface, #fff) 96%, transparent), color-mix(in srgb, var(--md-sys-color-surface-container-low, #f6f8fc) 100%, transparent) );--p-table-toolbar-fg-default: var(--md-sys-color-on-surface, currentColor);--p-table-toolbar-border-color-default: color-mix(in srgb, var(--md-sys-color-outline-variant, #d7dbe5) 78%, transparent);--p-table-toolbar-divider-color-default: color-mix(in srgb, var(--md-sys-color-outline) 42%, transparent);--p-table-toolbar-action-hover-bg-default: color-mix(in srgb, var(--md-sys-color-primary) 10%, transparent);--p-table-toolbar-action-active-bg-default: color-mix(in srgb, var(--md-sys-color-primary) 16%, transparent);--p-table-toolbar-action-focus-ring-default: color-mix(in srgb, var(--md-sys-color-primary) 52%, transparent);--p-table-toolbar-ai-accent-color-default: var(--md-sys-color-primary, #0b72d9);--p-table-toolbar-status-fg-default: var(--md-sys-color-on-surface-variant, currentColor);background:var(--p-table-toolbar-bg, var(--p-table-toolbar-bg-default));color:var(--p-table-toolbar-fg, var(--p-table-toolbar-fg-default));box-shadow:var(--p-table-toolbar-shadow, none);padding:var(--p-table-toolbar-padding-block, var(--pfx-toolbar-pad-y, 6px)) var(--p-table-toolbar-padding-inline, var(--pfx-toolbar-pad-x, 12px));min-height:var(--p-table-toolbar-min-height, var(--pfx-filter-h, 44px));display:flex;flex-direction:row;align-items:center;gap:var(--p-table-toolbar-gap, 6px);flex-wrap:wrap;border:var(--p-table-toolbar-border-width, 1px) solid var(--p-table-toolbar-border-color, var(--p-table-toolbar-border-color-default));border-radius:var(--p-table-toolbar-radius, 10px)}.praxis-toolbar.p-table-toolbar--flat{--p-table-toolbar-border-width: 0;--p-table-toolbar-shadow: none}.praxis-toolbar.p-table-toolbar--elevated{--p-table-toolbar-shadow: 0 12px 28px color-mix(in srgb, var(--md-sys-color-shadow, #000) 12%, transparent)}.praxis-toolbar.p-table-toolbar--integrated{--p-table-toolbar-bg: transparent;--p-table-toolbar-border-width: 0;--p-table-toolbar-radius: 0}.praxis-toolbar.p-table-toolbar--compact{--p-table-toolbar-min-height: 36px;--p-table-toolbar-padding-block: 4px;--p-table-toolbar-padding-inline: 10px;--p-table-toolbar-gap: 4px;--p-table-toolbar-actions-gap: 4px;--p-table-toolbar-action-size: 32px;--p-table-toolbar-action-radius: 7px}.praxis-toolbar.p-table-toolbar--comfortable{--p-table-toolbar-min-height: 44px;--p-table-toolbar-action-size: 36px}.praxis-toolbar.p-table-toolbar--spacious{--p-table-toolbar-min-height: 52px;--p-table-toolbar-padding-block: 8px;--p-table-toolbar-padding-inline: 16px;--p-table-toolbar-gap: 8px;--p-table-toolbar-actions-gap: 8px;--p-table-toolbar-action-size: 40px}.praxis-toolbar.p-table-toolbar--square{--p-table-toolbar-radius: 0;--p-table-toolbar-action-radius: 4px}.praxis-toolbar.p-table-toolbar--pill{--p-table-toolbar-radius: 999px;--p-table-toolbar-action-radius: 999px}:host(.praxis-toolbar-stack-top) .praxis-toolbar{border-bottom-left-radius:0;border-bottom-right-radius:0}:host(.praxis-toolbar-footer) .praxis-toolbar{border-top-left-radius:0;border-top-right-radius:0}:host(.praxis-toolbar-footer.footer-flat) .praxis-toolbar{border-bottom-left-radius:0;border-bottom-right-radius:0}.praxis-toolbar.mat-toolbar-single-row,.praxis-toolbar .mat-toolbar-row{height:auto}.praxis-toolbar.mat-toolbar-multiple-rows{min-height:var(--p-table-toolbar-min-height, var(--pfx-filter-h, 44px))}.toolbar-main{display:flex;align-items:center;justify-content:flex-start;min-width:0;column-gap:var(--p-table-toolbar-gap, 6px);row-gap:var(--p-table-toolbar-identity-filter-gap, 8px);min-height:var(--p-table-toolbar-min-height, var(--pfx-filter-h, 44px));flex:1 1 360px;flex-wrap:wrap;container-type:inline-size}.toolbar-identity{display:flex;align-items:center;gap:var(--p-table-toolbar-identity-gap, 8px);min-width:0;max-width:100%;min-height:var(--p-table-toolbar-identity-min-height, 30px);flex:1 1 100%;margin-block-end:var(--p-table-toolbar-identity-margin-bottom, 2px);padding-inline:2px;color:var(--p-table-toolbar-title-fg, var(--p-table-toolbar-fg, var(--p-table-toolbar-fg-default)))}.toolbar-identity--center{text-align:center;justify-content:center}.toolbar-identity--end{text-align:end;justify-content:flex-end}.toolbar-identity--center .toolbar-identity__copy{align-items:center}.toolbar-identity--end .toolbar-identity__copy{align-items:flex-end}.toolbar-identity__icon{width:var(--p-table-toolbar-identity-icon-size, 28px);height:var(--p-table-toolbar-identity-icon-size, 28px);border-radius:var(--p-table-toolbar-identity-icon-radius, 8px);display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;color:var(--p-table-toolbar-icon-fg, var(--md-sys-color-primary, currentColor));background:color-mix(in srgb,var(--p-table-toolbar-icon-fg, var(--md-sys-color-primary, currentColor)) 8%,transparent);border:1px solid color-mix(in srgb,var(--p-table-toolbar-icon-fg, var(--md-sys-color-primary, currentColor)) 18%,transparent)}.toolbar-identity__icon .mat-icon{font-size:18px;width:18px;height:18px;line-height:18px}.toolbar-identity__copy{display:flex;flex-direction:column;min-width:0;max-width:100%;gap:1px}.toolbar-identity__title,.toolbar-identity__subtitle{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.toolbar-identity__title{font-size:var(--p-table-toolbar-title-font-size, 14px);font-weight:var(--p-table-toolbar-title-font-weight, 700);line-height:1.2;letter-spacing:0;color:var(--p-table-toolbar-title-fg, currentColor)}.toolbar-identity__subtitle{font-size:var(--p-table-toolbar-subtitle-font-size, 11.5px);line-height:1.25;color:var(--p-table-toolbar-subtitle-fg, var(--p-table-toolbar-status-fg, var(--p-table-toolbar-status-fg-default)))}.toolbar-main>*{min-width:0}@container (max-width: 720px){.toolbar-identity{flex-basis:100%;max-width:100%}}@container (max-width: 420px){.toolbar-identity{min-width:0;flex-basis:auto}.toolbar-identity__subtitle{display:none}}.toolbar-actions{display:flex;align-items:center;align-self:flex-end;justify-content:flex-end;gap:var(--p-table-toolbar-gap, 6px);min-height:var(--p-table-toolbar-min-height, var(--pfx-filter-h, 44px));flex:0 0 auto;margin-left:auto}.actions-group{display:flex;align-items:center;gap:var(--p-table-toolbar-actions-gap, 6px)}.action-btn{height:var(--p-table-toolbar-action-size, 36px);min-width:var(--p-table-toolbar-action-size, 36px);border-radius:var(--p-table-toolbar-action-radius, 8px);font-size:12px;line-height:1.2;color:var(--p-table-toolbar-action-fg, inherit);background:var(--p-table-toolbar-action-bg, transparent)}.action-btn:hover:not(:disabled),.overflow-trigger:hover:not(:disabled),.end-actions ::ng-deep .mat-mdc-icon-button:hover:not(:disabled){background:var(--p-table-toolbar-action-hover-bg, var(--p-table-toolbar-action-hover-bg-default))}.action-btn:focus-visible,.overflow-trigger:focus-visible,.end-actions ::ng-deep .mat-mdc-icon-button:focus-visible{outline:2px solid var(--p-table-toolbar-action-focus-ring, var(--p-table-toolbar-action-focus-ring-default));outline-offset:2px}.action-btn--utility{color:var(--p-table-toolbar-status-fg, var(--p-table-toolbar-status-fg-default))}.praxis-table-toolbar-action--columns.action-btn{width:var(--p-table-toolbar-action-size, 36px);padding:0}.praxis-table-toolbar-action--columns mat-icon{margin:0}.toolbar-icon-btn{width:var(--p-table-toolbar-action-size, 36px);height:var(--p-table-toolbar-action-size, 36px);border-radius:var(--p-table-toolbar-action-radius, 8px);color:var(--md-sys-color-primary);background:color-mix(in srgb,var(--md-sys-color-primary) 9%,transparent);border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 22%,transparent)}.toolbar-icon-btn:hover:not(:disabled){color:var(--md-sys-color-on-primary-container);background:color-mix(in srgb,var(--md-sys-color-primary) 16%,transparent);border-color:color-mix(in srgb,var(--md-sys-color-primary) 36%,transparent)}.action-btn--fab{width:42px;height:42px;box-shadow:none}.pfx-tonal{background:var(--md-sys-color-secondary-container);color:var(--md-sys-color-on-secondary-container)}.pfx-tonal:hover{background:var(--md-sys-color-secondary-container)}.mobile-actions{display:none;align-items:center;gap:var(--p-table-toolbar-actions-gap, 6px)}.overflow-trigger{height:var(--p-table-toolbar-action-size, 36px)}.action-btn .mat-icon,.action-btn--fab .mat-icon,.overflow-trigger .mat-icon{font-size:18px;width:18px;height:18px;line-height:18px}.praxis-table-toolbar-action--columns .mat-icon{font-size:24px;width:24px;height:24px;line-height:24px}.praxis-table-column-menu-item.mat-mdc-menu-item{min-height:40px}.praxis-table-column-menu-content{align-items:center;display:flex;gap:10px;min-height:40px;width:100%}.praxis-table-column-menu-check.mat-icon{color:var(--md-sys-color-primary, currentColor);flex:0 0 20px;font-size:20px;height:20px;line-height:20px;margin-inline-end:0;width:20px}.action-btn.mat-mdc-button-base,.action-btn--fab.mat-mdc-button-base,.overflow-trigger.mat-mdc-button-base,.toolbar-icon-btn.mat-mdc-button-base{--mdc-text-button-container-height: var(--p-table-toolbar-action-size, 36px);--mdc-filled-button-container-height: var(--p-table-toolbar-action-size, 36px);--mdc-protected-button-container-height: var(--p-table-toolbar-action-size, 36px);--mdc-outlined-button-container-height: var(--p-table-toolbar-action-size, 36px);--mdc-icon-button-state-layer-size: var(--p-table-toolbar-action-size, 36px)}.action-btn.mat-mdc-unelevated-button:not(:disabled),.action-btn.mat-mdc-outlined-button:not(:disabled),.action-btn.pfx-tonal:not(:disabled){border-color:color-mix(in srgb,var(--md-sys-color-outline-variant, #d7dbe5) 82%,transparent)}.action-btn.mat-mdc-unelevated-button:not(:disabled){box-shadow:none}.action-btn.mat-mdc-unelevated-button.mat-primary:not(:disabled){--mdc-filled-button-container-color: var(--md-sys-color-primary);--mdc-filled-button-label-text-color: var(--md-sys-color-on-primary);--mat-filled-button-state-layer-color: var(--md-sys-color-on-primary);background:var(--md-sys-color-primary)!important;border-color:transparent;color:var(--md-sys-color-on-primary)!important;box-shadow:0 8px 18px color-mix(in srgb,var(--md-sys-color-primary) 22%,transparent)}.action-btn.mat-mdc-unelevated-button.mat-primary:not(:disabled):hover{background:color-mix(in srgb,var(--md-sys-color-primary) 88%,var(--md-sys-color-on-primary) 12%)!important}.action-btn.mat-mdc-unelevated-button.mat-primary:not(:disabled) .mat-icon{color:var(--md-sys-color-on-primary)!important}.action-btn.mat-mdc-button-base:not(.mat-mdc-icon-button){padding-inline:10px}.end-actions{display:flex;align-items:center;gap:var(--p-table-toolbar-actions-gap, 6px);margin-left:4px;padding-left:10px;border-left:1px solid var(--p-table-toolbar-divider-color, var(--p-table-toolbar-divider-color-default))}.end-actions:empty{display:none;gap:0;margin-left:0;padding-left:0;border-left:0}.end-actions ::ng-deep .mat-mdc-icon-button{width:var(--p-table-toolbar-action-size, 36px);height:var(--p-table-toolbar-action-size, 36px);display:inline-grid;place-items:center;padding:0;line-height:0;--mdc-icon-button-state-layer-size: var(--p-table-toolbar-action-size, 36px);--mat-icon-button-state-layer-size: var(--p-table-toolbar-action-size, 36px)}.end-actions ::ng-deep .mat-mdc-icon-button .mat-icon{display:block;flex:0 0 auto;font-size:24px;width:24px;height:24px;line-height:24px;margin:0}.praxis-toolbar.p-table-toolbar--divider-between-groups .actions-group,.praxis-toolbar.p-table-toolbar--divider-start .toolbar-main{padding-right:10px;border-right:1px solid var(--p-table-toolbar-divider-color, var(--p-table-toolbar-divider-color-default))}.end-actions ::ng-deep .praxis-table-toolbar-action--ai,.end-actions ::ng-deep .praxis-table-ai-trigger{color:var(--p-table-toolbar-ai-accent-color, var(--p-table-toolbar-ai-accent-color-default));background:color-mix(in srgb,var(--p-table-toolbar-ai-accent-color, var(--p-table-toolbar-ai-accent-color-default)) 10%,transparent);border:1px solid color-mix(in srgb,var(--p-table-toolbar-ai-accent-color, var(--p-table-toolbar-ai-accent-color-default)) 24%,transparent)}.end-actions ::ng-deep [data-role=table-settings]{color:var(--p-table-toolbar-status-fg, var(--p-table-toolbar-status-fg-default))}@media(min-width:1024px){.toolbar-actions{justify-content:flex-end}}@media(max-width:1023px){.actions-group{display:none}.mobile-actions{display:flex}.toolbar-actions{justify-content:flex-end}.toolbar-identity{min-width:0;max-width:100%;flex:1 1 100%}}\n"] }]
2672
+ }, styles: [":host{display:block}.praxis-toolbar{--p-table-toolbar-bg-default: linear-gradient( 180deg, color-mix(in srgb, var(--md-sys-color-surface, #fff) 96%, transparent), color-mix(in srgb, var(--md-sys-color-surface-container-low, #f6f8fc) 100%, transparent) );--p-table-toolbar-fg-default: var(--md-sys-color-on-surface, currentColor);--p-table-toolbar-border-color-default: color-mix(in srgb, var(--md-sys-color-outline-variant, #d7dbe5) 78%, transparent);--p-table-toolbar-divider-color-default: color-mix(in srgb, var(--md-sys-color-outline) 42%, transparent);--p-table-toolbar-action-hover-bg-default: color-mix(in srgb, var(--md-sys-color-primary) 10%, transparent);--p-table-toolbar-action-active-bg-default: color-mix(in srgb, var(--md-sys-color-primary) 16%, transparent);--p-table-toolbar-action-focus-ring-default: color-mix(in srgb, var(--md-sys-color-primary) 52%, transparent);--p-table-toolbar-ai-accent-color-default: var(--md-sys-color-primary, #0b72d9);--p-table-toolbar-status-fg-default: var(--md-sys-color-on-surface-variant, currentColor);background:var(--p-table-toolbar-bg, var(--p-table-toolbar-bg-default));color:var(--p-table-toolbar-fg, var(--p-table-toolbar-fg-default));box-shadow:var(--p-table-toolbar-shadow, none);padding:var(--p-table-toolbar-padding-block, var(--pfx-toolbar-pad-y, 6px)) var(--p-table-toolbar-padding-inline, var(--pfx-toolbar-pad-x, 12px));min-height:var(--p-table-toolbar-min-height, var(--pfx-filter-h, 44px));display:flex;flex-direction:row;align-items:center;gap:var(--p-table-toolbar-gap, 6px);flex-wrap:wrap;border:var(--p-table-toolbar-border-width, 1px) solid var(--p-table-toolbar-border-color, var(--p-table-toolbar-border-color-default));border-radius:var(--p-table-toolbar-radius, 10px)}.praxis-toolbar.p-table-toolbar--flat{--p-table-toolbar-border-width: 0;--p-table-toolbar-shadow: none}.praxis-toolbar.p-table-toolbar--elevated{--p-table-toolbar-shadow: 0 12px 28px color-mix(in srgb, var(--md-sys-color-shadow, #000) 12%, transparent)}.praxis-toolbar.p-table-toolbar--integrated{--p-table-toolbar-bg: transparent;--p-table-toolbar-border-width: 0;--p-table-toolbar-radius: 0}.praxis-toolbar.p-table-toolbar--compact{--p-table-toolbar-min-height: 36px;--p-table-toolbar-padding-block: 4px;--p-table-toolbar-padding-inline: 10px;--p-table-toolbar-gap: 4px;--p-table-toolbar-actions-gap: 4px;--p-table-toolbar-action-size: 32px;--p-table-toolbar-action-radius: 7px}.praxis-toolbar.p-table-toolbar--comfortable{--p-table-toolbar-min-height: 44px;--p-table-toolbar-action-size: 36px}.praxis-toolbar.p-table-toolbar--spacious{--p-table-toolbar-min-height: 52px;--p-table-toolbar-padding-block: 8px;--p-table-toolbar-padding-inline: 16px;--p-table-toolbar-gap: 8px;--p-table-toolbar-actions-gap: 8px;--p-table-toolbar-action-size: 40px}.praxis-toolbar.p-table-toolbar--square{--p-table-toolbar-radius: 0;--p-table-toolbar-action-radius: 4px}.praxis-toolbar.p-table-toolbar--pill{--p-table-toolbar-radius: 999px;--p-table-toolbar-action-radius: 999px}:host(.praxis-toolbar-stack-top) .praxis-toolbar{border-bottom-left-radius:0;border-bottom-right-radius:0}:host(.praxis-toolbar-footer) .praxis-toolbar{border-top-left-radius:0;border-top-right-radius:0}:host(.praxis-toolbar-footer.footer-flat) .praxis-toolbar{border-bottom-left-radius:0;border-bottom-right-radius:0}.praxis-toolbar.mat-toolbar-single-row,.praxis-toolbar .mat-toolbar-row{height:auto}.praxis-toolbar.mat-toolbar-multiple-rows{min-height:var(--p-table-toolbar-min-height, var(--pfx-filter-h, 44px))}.toolbar-main{display:flex;align-items:center;justify-content:flex-start;min-width:0;column-gap:var(--p-table-toolbar-gap, 6px);row-gap:var(--p-table-toolbar-identity-filter-gap, 8px);min-height:var(--p-table-toolbar-min-height, var(--pfx-filter-h, 44px));flex:1 1 360px;flex-wrap:wrap;container-type:inline-size}.toolbar-identity{display:flex;align-items:center;gap:var(--p-table-toolbar-identity-gap, 8px);min-width:0;max-width:100%;min-height:var(--p-table-toolbar-identity-min-height, 30px);flex:1 1 100%;margin-block-end:var(--p-table-toolbar-identity-margin-bottom, 2px);padding-inline:2px;color:var(--p-table-toolbar-title-fg, var(--p-table-toolbar-fg, var(--p-table-toolbar-fg-default)))}.toolbar-identity--center{text-align:center;justify-content:center}.toolbar-identity--end{text-align:end;justify-content:flex-end}.toolbar-identity--center .toolbar-identity__copy{align-items:center}.toolbar-identity--end .toolbar-identity__copy{align-items:flex-end}.toolbar-identity__icon{width:var(--p-table-toolbar-identity-icon-size, 28px);height:var(--p-table-toolbar-identity-icon-size, 28px);border-radius:var(--p-table-toolbar-identity-icon-radius, 8px);display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;color:var(--p-table-toolbar-icon-fg, var(--md-sys-color-primary, currentColor));background:color-mix(in srgb,var(--p-table-toolbar-icon-fg, var(--md-sys-color-primary, currentColor)) 8%,transparent);border:1px solid color-mix(in srgb,var(--p-table-toolbar-icon-fg, var(--md-sys-color-primary, currentColor)) 18%,transparent)}.toolbar-identity__icon .mat-icon{font-size:18px;width:18px;height:18px;line-height:18px}.toolbar-identity__copy{display:flex;flex-direction:column;min-width:0;max-width:100%;gap:1px}.toolbar-identity__title,.toolbar-identity__subtitle{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.toolbar-identity__title{font-size:var(--p-table-toolbar-title-font-size, 14px);font-weight:var(--p-table-toolbar-title-font-weight, 700);line-height:1.2;letter-spacing:0;color:var(--p-table-toolbar-title-fg, currentColor)}.toolbar-identity__subtitle{font-size:var(--p-table-toolbar-subtitle-font-size, 11.5px);line-height:1.25;color:var(--p-table-toolbar-subtitle-fg, var(--p-table-toolbar-status-fg, var(--p-table-toolbar-status-fg-default)))}.toolbar-main>*{min-width:0}@container (max-width: 720px){.toolbar-identity{flex-basis:100%;max-width:100%}}@container (max-width: 420px){.toolbar-identity{min-width:0;flex-basis:auto}.toolbar-identity__subtitle{display:none}}.toolbar-actions{display:flex;align-items:center;align-self:flex-end;justify-content:flex-end;gap:var(--p-table-toolbar-gap, 6px);min-height:var(--p-table-toolbar-min-height, var(--pfx-filter-h, 44px));flex:0 0 auto;margin-left:auto}.actions-group{display:flex;align-items:center;gap:var(--p-table-toolbar-actions-gap, 6px)}.action-btn{height:var(--p-table-toolbar-action-size, 36px);min-width:var(--p-table-toolbar-action-size, 36px);border-radius:var(--p-table-toolbar-action-radius, 8px);font-size:12px;line-height:1.2;color:var(--p-table-toolbar-action-fg, inherit);background:var(--p-table-toolbar-action-bg, transparent)}.action-btn:hover:not(:disabled),.overflow-trigger:hover:not(:disabled),.end-actions ::ng-deep .mat-mdc-icon-button:hover:not(:disabled){background:var(--p-table-toolbar-action-hover-bg, var(--p-table-toolbar-action-hover-bg-default))}.action-btn:focus-visible,.overflow-trigger:focus-visible,.end-actions ::ng-deep .mat-mdc-icon-button:focus-visible{outline:2px solid var(--p-table-toolbar-action-focus-ring, var(--p-table-toolbar-action-focus-ring-default));outline-offset:2px}.action-btn--utility{color:var(--p-table-toolbar-status-fg, var(--p-table-toolbar-status-fg-default))}.praxis-table-toolbar-action--columns.action-btn{width:var(--p-table-toolbar-action-size, 36px);padding:0}.praxis-table-toolbar-action--columns mat-icon{margin:0}.toolbar-icon-btn{width:var(--p-table-toolbar-action-size, 36px);height:var(--p-table-toolbar-action-size, 36px);border-radius:var(--p-table-toolbar-action-radius, 8px);color:var(--md-sys-color-primary);background:color-mix(in srgb,var(--md-sys-color-primary) 9%,transparent);border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 22%,transparent)}.toolbar-icon-btn:hover:not(:disabled){color:var(--md-sys-color-on-primary-container);background:color-mix(in srgb,var(--md-sys-color-primary) 16%,transparent);border-color:color-mix(in srgb,var(--md-sys-color-primary) 36%,transparent)}.action-btn--fab{width:42px;height:42px;box-shadow:none}.pfx-tonal{background:var(--md-sys-color-secondary-container);color:var(--md-sys-color-on-secondary-container)}.pfx-tonal:hover{background:var(--md-sys-color-secondary-container)}.mobile-actions{display:none;align-items:center;gap:var(--p-table-toolbar-actions-gap, 6px)}.overflow-trigger{height:var(--p-table-toolbar-action-size, 36px)}.action-btn .mat-icon,.action-btn--fab .mat-icon,.overflow-trigger .mat-icon{font-size:18px;width:18px;height:18px;line-height:18px}.praxis-table-toolbar-action--columns .mat-icon{font-size:24px;width:24px;height:24px;line-height:24px}.praxis-table-column-menu-item.mat-mdc-menu-item{min-height:40px}.praxis-table-export-menu-item.mat-mdc-menu-item{min-width:280px;white-space:nowrap}.praxis-table-column-menu-content{align-items:center;display:flex;gap:10px;min-height:40px;width:100%}.praxis-table-column-menu-check.mat-icon{color:var(--md-sys-color-primary, currentColor);flex:0 0 20px;font-size:20px;height:20px;line-height:20px;margin-inline-end:0;width:20px}.action-btn.mat-mdc-button-base,.action-btn--fab.mat-mdc-button-base,.overflow-trigger.mat-mdc-button-base,.toolbar-icon-btn.mat-mdc-button-base{--mdc-text-button-container-height: var(--p-table-toolbar-action-size, 36px);--mdc-filled-button-container-height: var(--p-table-toolbar-action-size, 36px);--mdc-protected-button-container-height: var(--p-table-toolbar-action-size, 36px);--mdc-outlined-button-container-height: var(--p-table-toolbar-action-size, 36px);--mdc-icon-button-state-layer-size: var(--p-table-toolbar-action-size, 36px)}.action-btn.mat-mdc-unelevated-button:not(:disabled),.action-btn.mat-mdc-outlined-button:not(:disabled),.action-btn.pfx-tonal:not(:disabled){border-color:color-mix(in srgb,var(--md-sys-color-outline-variant, #d7dbe5) 82%,transparent)}.action-btn.mat-mdc-unelevated-button:not(:disabled){box-shadow:none}.action-btn.mat-mdc-unelevated-button.mat-primary:not(:disabled){--mdc-filled-button-container-color: var(--md-sys-color-primary);--mdc-filled-button-label-text-color: var(--md-sys-color-on-primary);--mat-filled-button-state-layer-color: var(--md-sys-color-on-primary);background:var(--md-sys-color-primary)!important;border-color:transparent;color:var(--md-sys-color-on-primary)!important;box-shadow:0 8px 18px color-mix(in srgb,var(--md-sys-color-primary) 22%,transparent)}.action-btn.mat-mdc-unelevated-button.mat-primary:not(:disabled):hover{background:color-mix(in srgb,var(--md-sys-color-primary) 88%,var(--md-sys-color-on-primary) 12%)!important}.action-btn.mat-mdc-unelevated-button.mat-primary:not(:disabled) .mat-icon{color:var(--md-sys-color-on-primary)!important}.action-btn.mat-mdc-button-base:not(.mat-mdc-icon-button){padding-inline:10px}.end-actions{display:flex;align-items:center;gap:var(--p-table-toolbar-actions-gap, 6px);margin-left:4px;padding-left:10px;border-left:1px solid var(--p-table-toolbar-divider-color, var(--p-table-toolbar-divider-color-default))}.end-actions:empty{display:none;gap:0;margin-left:0;padding-left:0;border-left:0}.end-actions ::ng-deep .mat-mdc-icon-button{width:var(--p-table-toolbar-action-size, 36px);height:var(--p-table-toolbar-action-size, 36px);display:inline-grid;place-items:center;padding:0;line-height:0;--mdc-icon-button-state-layer-size: var(--p-table-toolbar-action-size, 36px);--mat-icon-button-state-layer-size: var(--p-table-toolbar-action-size, 36px)}.end-actions ::ng-deep .mat-mdc-icon-button .mat-icon{display:block;flex:0 0 auto;font-size:24px;width:24px;height:24px;line-height:24px;margin:0}.praxis-toolbar.p-table-toolbar--divider-between-groups .actions-group,.praxis-toolbar.p-table-toolbar--divider-start .toolbar-main{padding-right:10px;border-right:1px solid var(--p-table-toolbar-divider-color, var(--p-table-toolbar-divider-color-default))}.end-actions ::ng-deep .praxis-table-toolbar-action--ai,.end-actions ::ng-deep .praxis-table-ai-trigger{color:var(--p-table-toolbar-ai-accent-color, var(--p-table-toolbar-ai-accent-color-default));background:color-mix(in srgb,var(--p-table-toolbar-ai-accent-color, var(--p-table-toolbar-ai-accent-color-default)) 10%,transparent);border:1px solid color-mix(in srgb,var(--p-table-toolbar-ai-accent-color, var(--p-table-toolbar-ai-accent-color-default)) 24%,transparent)}.end-actions ::ng-deep [data-role=table-settings]{color:var(--p-table-toolbar-status-fg, var(--p-table-toolbar-status-fg-default))}@media(min-width:1024px){.toolbar-actions{justify-content:flex-end}}@media(max-width:1023px){.actions-group{display:none}.mobile-actions{display:flex}.toolbar-actions{justify-content:flex-end}.toolbar-identity{min-width:0;max-width:100%;flex:1 1 100%}}\n"] }]
2438
2673
  }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.LoggerService, decorators: [{
2439
2674
  type: Optional
2440
2675
  }] }, { type: i1.PraxisI18nService, decorators: [{
@@ -8403,6 +8638,7 @@ const PRAXIS_TABLE_EDITOR_I18N_CONFIG = {
8403
8638
  'toolbar.export.fileName': 'Nome padrão do arquivo',
8404
8639
  'toolbar.export.fileName.placeholder': 'dados-export',
8405
8640
  'toolbar.export.includeHeaders': 'Incluir cabeçalhos',
8641
+ 'toolbar.export.visibleCurrentPage': 'Exibir Excel da página atual',
8406
8642
  'toolbar.export.scope': 'Escopo da exportação',
8407
8643
  'toolbar.export.scope.auto': 'Seleção ou visão atual',
8408
8644
  'toolbar.export.scope.selected': 'Linhas selecionadas',
@@ -9507,6 +9743,7 @@ const PRAXIS_TABLE_EDITOR_I18N_CONFIG = {
9507
9743
  'toolbar.export.fileName': 'Default file name',
9508
9744
  'toolbar.export.fileName.placeholder': 'data-export',
9509
9745
  'toolbar.export.includeHeaders': 'Include headers',
9746
+ 'toolbar.export.visibleCurrentPage': 'Show current-page Excel',
9510
9747
  'toolbar.export.scope': 'Export scope',
9511
9748
  'toolbar.export.scope.auto': 'Selection or current view',
9512
9749
  'toolbar.export.scope.selected': 'Selected rows',
@@ -19649,6 +19886,7 @@ class ToolbarActionsEditorComponent {
19649
19886
  exportFormats: [['excel', 'csv']],
19650
19887
  exportFileName: [this.tx('toolbar.export.fileName.placeholder', 'data-export')],
19651
19888
  exportIncludeHeaders: [true],
19889
+ exportVisibleCurrentPage: [true],
19652
19890
  exportScope: ['auto'],
19653
19891
  exportMaxRows: [10000],
19654
19892
  });
@@ -19699,6 +19937,7 @@ class ToolbarActionsEditorComponent {
19699
19937
  exportFileName: v2Config.export.general?.defaultFileName ||
19700
19938
  this.tx('toolbar.export.fileName.placeholder', 'data-export'),
19701
19939
  exportIncludeHeaders: v2Config.export.general?.includeHeaders !== false,
19940
+ exportVisibleCurrentPage: v2Config.export.excel?.visibleCurrentPage !== false,
19702
19941
  exportScope: v2Config.export.general?.scope || 'auto',
19703
19942
  exportMaxRows: v2Config.export.general?.maxRows || 10000,
19704
19943
  });
@@ -19924,6 +20163,15 @@ class ToolbarActionsEditorComponent {
19924
20163
  v2Config.export = {
19925
20164
  enabled: values.exportEnabled,
19926
20165
  formats: values.exportFormats,
20166
+ excel: {
20167
+ ...(v2Config.export?.excel || {
20168
+ sheetName: 'Export',
20169
+ includeFormulas: false,
20170
+ freezeHeaders: true,
20171
+ autoFitColumns: true,
20172
+ }),
20173
+ visibleCurrentPage: values.exportVisibleCurrentPage !== false,
20174
+ },
19927
20175
  general: {
19928
20176
  includeHeaders: values.exportIncludeHeaders,
19929
20177
  scope: values.exportScope || 'auto',
@@ -22435,6 +22683,12 @@ class ToolbarActionsEditorComponent {
22435
22683
  >
22436
22684
  {{ tx('toolbar.export.includeHeaders', 'Include headers') }}
22437
22685
  </mat-slide-toggle>
22686
+ <mat-slide-toggle
22687
+ formControlName="exportVisibleCurrentPage"
22688
+ class="toggle-field"
22689
+ >
22690
+ {{ tx('toolbar.export.visibleCurrentPage', 'Show current-page Excel') }}
22691
+ </mat-slide-toggle>
22438
22692
  <mat-form-field appearance="outline">
22439
22693
  <mat-label>{{ tx('toolbar.export.scope', 'Export scope') }}</mat-label>
22440
22694
  <mat-select formControlName="exportScope">
@@ -24091,6 +24345,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
24091
24345
  >
24092
24346
  {{ tx('toolbar.export.includeHeaders', 'Include headers') }}
24093
24347
  </mat-slide-toggle>
24348
+ <mat-slide-toggle
24349
+ formControlName="exportVisibleCurrentPage"
24350
+ class="toggle-field"
24351
+ >
24352
+ {{ tx('toolbar.export.visibleCurrentPage', 'Show current-page Excel') }}
24353
+ </mat-slide-toggle>
24094
24354
  <mat-form-field appearance="outline">
24095
24355
  <mat-label>{{ tx('toolbar.export.scope', 'Export scope') }}</mat-label>
24096
24356
  <mat-select formControlName="exportScope">
@@ -41592,7 +41852,7 @@ class PraxisTable {
41592
41852
  if (this.aiAdapter || this.aiAdapterLoadStarted)
41593
41853
  return;
41594
41854
  this.aiAdapterLoadStarted = true;
41595
- import('./praxisui-table-table-ai.adapter-0cYAJ5hm.mjs')
41855
+ import('./praxisui-table-table-ai.adapter-DE5WpZ-t.mjs')
41596
41856
  .then(({ TableAiAdapter }) => {
41597
41857
  if (!this.isAiAssistantEnabled()) {
41598
41858
  this.aiAssistantOpenAfterAdapterLoad = false;
@@ -47721,11 +47981,11 @@ class PraxisTable {
47721
47981
  }
47722
47982
  showExportFeedback(result) {
47723
47983
  if (result.status === 'deferred') {
47724
- this.exportStatusMessage = translateTableRuntimeText(this.i18n, 'table.export.deferred', 'Exportacao enviada para processamento.');
47984
+ this.exportStatusMessage = translateTableRuntimeText(this.i18n, 'table.export.deferred', 'Exportação enviada para processamento.');
47725
47985
  this.snackBar.open(this.exportStatusMessage, undefined, { duration: 3000 });
47726
47986
  return;
47727
47987
  }
47728
- this.exportStatusMessage = translateTableRuntimeText(this.i18n, 'table.export.completed', 'Exportacao concluida.');
47988
+ this.exportStatusMessage = translateTableRuntimeText(this.i18n, 'table.export.completed', 'Exportação concluída.');
47729
47989
  this.snackBar.open(this.exportStatusMessage, undefined, { duration: 2500 });
47730
47990
  }
47731
47991
  onAdvancedFilterSubmit(criteria) {
@@ -57261,7 +57521,10 @@ const tableExportSchema = {
57261
57521
  },
57262
57522
  excel: {
57263
57523
  type: 'object',
57264
- properties: { autoFitColumns: { type: 'boolean' } }
57524
+ properties: {
57525
+ autoFitColumns: { type: 'boolean' },
57526
+ visibleCurrentPage: { type: 'boolean' }
57527
+ }
57265
57528
  },
57266
57529
  pdf: {
57267
57530
  type: 'object',
@@ -62383,6 +62646,7 @@ const TABLE_AI_CAPABILITIES = {
62383
62646
  { path: 'export.general.includeHeaders', category: 'export', valueKind: 'boolean', description: 'Inclui cabeçalhos no arquivo exportado.', intentExamples: ['incluir cabeçalho no excel'] },
62384
62647
  { path: 'export.general.scope', category: 'export', valueKind: 'enum', allowedValues: ENUMS.exportScope, description: 'Define o escopo dos dados exportados: auto, selected, filtered, currentPage ou all.', dependsOn: 'export.enabled', intentExamples: ['exportar apenas selecionados', 'exportar filtrados', 'exportar pagina atual'], example: '"auto"' },
62385
62648
  { path: 'export.general.maxRows', category: 'export', valueKind: 'number', description: 'Limite de linhas para exportação.', dependsOn: 'export.enabled', critical: true, example: '5000', safetyNotes: 'Previne exportações pesadas ou vazamento de massa de dados.', intentExamples: ['limite de exportação 5000'] },
62649
+ { path: 'export.excel.visibleCurrentPage', category: 'export', valueKind: 'boolean', description: 'Exibe a ação local "Excel da página atual", separada do Excel via provider.', dependsOn: 'export.enabled + export.formats contains excel', critical: true, intentExamples: ['esconder excel da pagina atual', 'permitir apenas excel via provider'], safetyNotes: 'Use false quando a política corporativa exigir que exportações passem pelo provider governado.' },
62386
62650
  { path: 'export.excel.autoFitColumns', category: 'export', valueKind: 'boolean', description: 'Auto-ajusta largura de colunas na planilha.', dependsOn: 'export.enabled', intentExamples: ['ajustar colunas no excel'] },
62387
62651
  { path: 'export.pdf.orientation', category: 'export', valueKind: 'enum', allowedValues: ENUMS.pdfOrientation, description: 'Orientação do PDF.', dependsOn: 'export.enabled', intentExamples: ['pdf paisagem', 'pdf retrato'] },
62388
62652
  { path: 'export.pdf.pageSize', category: 'export', valueKind: 'enum', allowedValues: ENUMS.pdfPageSize, description: 'Tamanho da página no PDF.', dependsOn: 'export.enabled' },