@praxisui/table 9.0.0-beta.46 → 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,9 +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.export.completed': 'Exportacao concluida.',
100
- 'table.export.deferred': 'Exportacao enviada para processamento.',
101
- '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.',
102
111
  'table.chrome.moreActions': 'Mais ações',
103
112
  'table.chrome.rowActions.more': 'Mais ações',
104
113
  'table.chrome.rowActions.loading': 'Carregando ações contextuais',
@@ -109,6 +118,10 @@ const PRAXIS_TABLE_RUNTIME_I18N_CONFIG = {
109
118
  'table.chrome.collectionActions.create': 'Novo',
110
119
  'table.chrome.collectionActions.createTooltip': 'Criar novo registro',
111
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.',
112
125
  'table.assistant.context.selectedRecords.label': 'Registros selecionados',
113
126
  'table.assistant.context.selectedRecords.value': '{count} registro(s) selecionado(s){ids}',
114
127
  'table.assistant.context.selectedRecords.value.singular': '{count} registro selecionado{ids}',
@@ -214,6 +227,15 @@ const PRAXIS_TABLE_RUNTIME_I18N_CONFIG = {
214
227
  'table.chrome.disconnect': 'Disconnect',
215
228
  'table.chrome.disconnectTooltip': 'Disconnect from the data source',
216
229
  'table.chrome.exportData': 'Export data',
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.',
217
239
  'table.export.completed': 'Export completed.',
218
240
  'table.export.deferred': 'Export submitted for processing.',
219
241
  'table.export.error': 'Could not export the data.',
@@ -227,6 +249,10 @@ const PRAXIS_TABLE_RUNTIME_I18N_CONFIG = {
227
249
  'table.chrome.collectionActions.create': 'New',
228
250
  'table.chrome.collectionActions.createTooltip': 'Create a new record',
229
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.',
230
256
  'table.assistant.context.selectedRecords.label': 'Selected records',
231
257
  'table.assistant.context.selectedRecords.value': '{count} selected record(s){ids}',
232
258
  'table.assistant.context.selectedRecords.value.singular': '{count} selected record{ids}',
@@ -571,6 +597,7 @@ class PraxisTableToolbar {
571
597
  warnedInvalidToolbarActionTypes = new Set();
572
598
  warnedMenuWithoutChildren = new Set();
573
599
  warnedVisibleWhenFallback = new Set();
600
+ warnedDisabledWhenFallback = new Set();
574
601
  warnedInvalidShortcuts = new Set();
575
602
  warnedInvalidShortcutScopes = new Set();
576
603
  warnedShortcutConflicts = new Set();
@@ -625,6 +652,42 @@ class PraxisTableToolbar {
625
652
  getExportDataLabel() {
626
653
  return this.tx('table.chrome.exportData', 'Exportar dados');
627
654
  }
655
+ getVisibleExcelExportLabel() {
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)}`;
690
+ }
628
691
  getMoreActionsLabel() {
629
692
  return this.tx('table.chrome.moreActions', 'Mais ações');
630
693
  }
@@ -634,6 +697,23 @@ class PraxisTableToolbar {
634
697
  event.target?.blur?.();
635
698
  this.exportAction.emit({ format });
636
699
  }
700
+ emitVisibleExcelExportAction(event) {
701
+ if (this.exportBusy)
702
+ return;
703
+ event.target?.blur?.();
704
+ this.exportAction.emit({ format: 'excel', scope: 'currentPage', localOnly: true });
705
+ }
706
+ isExcelExportFormat(format) {
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();
716
+ }
637
717
  getColumnsVisibilityLabel() {
638
718
  return this.tx('table.chrome.columnsVisibility', 'Colunas');
639
719
  }
@@ -679,10 +759,15 @@ class PraxisTableToolbar {
679
759
  toggleColumnVisibility(field, visible) {
680
760
  this.columnVisibilityToggle.emit({ field, visible });
681
761
  }
682
- tx(key, fallback) {
762
+ tx(key, fallback, params) {
683
763
  if (!this.i18n)
684
- return fallback;
685
- 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);
686
771
  }
687
772
  ngOnDestroy() {
688
773
  }
@@ -898,13 +983,36 @@ class PraxisTableToolbar {
898
983
  }
899
984
  getActionAriaLabel(action) {
900
985
  const label = String(action?.label || '').trim();
986
+ if (label && this.isActionDisabled(action)) {
987
+ return `${label}. ${this.resolveDisabledActionReason(action)}`;
988
+ }
901
989
  if (label)
902
990
  return label;
903
991
  const actionId = getActionId(action);
904
992
  return actionId || 'Acao';
905
993
  }
906
994
  isActionDisabled(action) {
907
- 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;
908
1016
  }
909
1017
  onDocumentKeydown(event) {
910
1018
  if (this.wasShortcutAlreadyHandled(event))
@@ -953,6 +1061,10 @@ class PraxisTableToolbar {
953
1061
  return [];
954
1062
  return this.config?.actions?.bulk?.actions || [];
955
1063
  }
1064
+ isBulkToolbarAction(action) {
1065
+ const actionId = getActionId(action);
1066
+ return this.getBulkToolbarActions().some((candidate) => candidate === action || getActionId(candidate) === actionId);
1067
+ }
956
1068
  getVisibleToolbarActions() {
957
1069
  const actions = this.config?.toolbar?.actions || [];
958
1070
  const sorted = this.sortActions(actions);
@@ -1011,6 +1123,34 @@ class PraxisTableToolbar {
1011
1123
  }
1012
1124
  return this.resolveVisibleWhenFallback(action, String(expression ?? ''), 'invalid-non-json-logic-expression');
1013
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
+ }
1014
1154
  isJsonLogicExpression(value) {
1015
1155
  return !!value && typeof value === 'object' && !Array.isArray(value);
1016
1156
  }
@@ -1060,6 +1200,42 @@ class PraxisTableToolbar {
1060
1200
  }
1061
1201
  return ctx;
1062
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
+ }
1063
1239
  warnVisibleWhenFallback(action, expression, reason, extra) {
1064
1240
  const actionId = getActionId(action) || action?.label || 'unknown';
1065
1241
  const key = `${actionId}:${expression}:${reason}`;
@@ -1074,6 +1250,19 @@ class PraxisTableToolbar {
1074
1250
  ...(extra ? { extra } : {}),
1075
1251
  });
1076
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
+ }
1077
1266
  collectShortcutBindings() {
1078
1267
  const map = new Map();
1079
1268
  const actions = [
@@ -1415,8 +1604,8 @@ class PraxisTableToolbar {
1415
1604
  [color]="getActionColor(action)"
1416
1605
  [disabled]="isActionDisabled(action)"
1417
1606
  (click)="emitToolbarAction($event, getActionId(action), action)"
1418
- [attr.aria-label]="action.label || getActionId(action)"
1419
- [matTooltip]="action.tooltip || action.label || getActionId(action)"
1607
+ [attr.aria-label]="getActionAriaLabel(action)"
1608
+ [matTooltip]="getActionTooltip(action) || action.label || getActionId(action)"
1420
1609
  matTooltipPosition="below"
1421
1610
  >
1422
1611
  <mat-icon [praxisIcon]="action.icon || 'bolt'"></mat-icon>
@@ -1428,8 +1617,8 @@ class PraxisTableToolbar {
1428
1617
  [color]="getActionColor(action)"
1429
1618
  [disabled]="isActionDisabled(action)"
1430
1619
  (click)="emitToolbarAction($event, getActionId(action), action)"
1431
- [attr.aria-label]="action.label || getActionId(action)"
1432
- [matTooltip]="action.tooltip || action.label || getActionId(action)"
1620
+ [attr.aria-label]="getActionAriaLabel(action)"
1621
+ [matTooltip]="getActionTooltip(action) || action.label || getActionId(action)"
1433
1622
  matTooltipPosition="below"
1434
1623
  >
1435
1624
  <mat-icon [praxisIcon]="action.icon || 'bolt'"></mat-icon>
@@ -1440,6 +1629,7 @@ class PraxisTableToolbar {
1440
1629
  mat-button
1441
1630
  [color]="getActionColor(action)"
1442
1631
  [disabled]="isActionDisabled(action)"
1632
+ [matTooltip]="getActionTooltip(action)"
1443
1633
  [matMenuTriggerFor]="startActionMenu"
1444
1634
  [attr.aria-label]="getActionAriaLabel(action)"
1445
1635
  >
@@ -1451,6 +1641,7 @@ class PraxisTableToolbar {
1451
1641
  <button
1452
1642
  mat-menu-item
1453
1643
  [disabled]="isActionDisabled(child)"
1644
+ [matTooltip]="getActionTooltip(child)"
1454
1645
  (click)="emitToolbarAction($event, getActionId(child), child)"
1455
1646
  >
1456
1647
  @if (child.icon) { <mat-icon [praxisIcon]="child.icon"></mat-icon> }
@@ -1464,6 +1655,7 @@ class PraxisTableToolbar {
1464
1655
  mat-button
1465
1656
  [color]="getActionColor(action)"
1466
1657
  [disabled]="isActionDisabled(action)"
1658
+ [matTooltip]="getActionTooltip(action)"
1467
1659
  (click)="emitToolbarAction($event, getActionId(action), action)"
1468
1660
  [attr.aria-label]="getActionAriaLabel(action)"
1469
1661
  >
@@ -1476,6 +1668,7 @@ class PraxisTableToolbar {
1476
1668
  mat-stroked-button
1477
1669
  [color]="getActionColor(action)"
1478
1670
  [disabled]="isActionDisabled(action)"
1671
+ [matTooltip]="getActionTooltip(action)"
1479
1672
  (click)="emitToolbarAction($event, getActionId(action), action)"
1480
1673
  [attr.aria-label]="getActionAriaLabel(action)"
1481
1674
  >
@@ -1488,6 +1681,7 @@ class PraxisTableToolbar {
1488
1681
  mat-raised-button
1489
1682
  [color]="getActionColor(action)"
1490
1683
  [disabled]="isActionDisabled(action)"
1684
+ [matTooltip]="getActionTooltip(action)"
1491
1685
  (click)="emitToolbarAction($event, getActionId(action), action)"
1492
1686
  [attr.aria-label]="getActionAriaLabel(action)"
1493
1687
  >
@@ -1500,6 +1694,7 @@ class PraxisTableToolbar {
1500
1694
  mat-button
1501
1695
  [color]="getActionColor(action)"
1502
1696
  [disabled]="isActionDisabled(action)"
1697
+ [matTooltip]="getActionTooltip(action)"
1503
1698
  (click)="emitToolbarAction($event, getActionId(action), action)"
1504
1699
  [attr.aria-label]="getActionAriaLabel(action)"
1505
1700
  >
@@ -1512,6 +1707,7 @@ class PraxisTableToolbar {
1512
1707
  mat-button
1513
1708
  [color]="getActionColor(action)"
1514
1709
  [disabled]="isActionDisabled(action)"
1710
+ [matTooltip]="getActionTooltip(action)"
1515
1711
  (click)="emitToolbarAction($event, getActionId(action), action)"
1516
1712
  [attr.aria-label]="getActionAriaLabel(action)"
1517
1713
  >
@@ -1524,6 +1720,7 @@ class PraxisTableToolbar {
1524
1720
  mat-flat-button
1525
1721
  [color]="getActionColor(action)"
1526
1722
  [disabled]="isActionDisabled(action)"
1723
+ [matTooltip]="getActionTooltip(action)"
1527
1724
  (click)="emitToolbarAction($event, getActionId(action), action)"
1528
1725
  [attr.aria-label]="getActionAriaLabel(action)"
1529
1726
  >
@@ -1541,8 +1738,8 @@ class PraxisTableToolbar {
1541
1738
  [color]="getActionColor(action)"
1542
1739
  [disabled]="isActionDisabled(action)"
1543
1740
  (click)="emitToolbarAction($event, getActionId(action), action)"
1544
- [attr.aria-label]="action.label || getActionId(action)"
1545
- [matTooltip]="action.tooltip || action.label || getActionId(action)"
1741
+ [attr.aria-label]="getActionAriaLabel(action)"
1742
+ [matTooltip]="getActionTooltip(action) || action.label || getActionId(action)"
1546
1743
  matTooltipPosition="below"
1547
1744
  >
1548
1745
  <mat-icon [praxisIcon]="action.icon || 'bolt'"></mat-icon>
@@ -1554,8 +1751,8 @@ class PraxisTableToolbar {
1554
1751
  [color]="getActionColor(action)"
1555
1752
  [disabled]="isActionDisabled(action)"
1556
1753
  (click)="emitToolbarAction($event, getActionId(action), action)"
1557
- [attr.aria-label]="action.label || getActionId(action)"
1558
- [matTooltip]="action.tooltip || action.label || getActionId(action)"
1754
+ [attr.aria-label]="getActionAriaLabel(action)"
1755
+ [matTooltip]="getActionTooltip(action) || action.label || getActionId(action)"
1559
1756
  matTooltipPosition="below"
1560
1757
  >
1561
1758
  <mat-icon [praxisIcon]="action.icon || 'bolt'"></mat-icon>
@@ -1566,6 +1763,7 @@ class PraxisTableToolbar {
1566
1763
  mat-button
1567
1764
  [color]="getActionColor(action)"
1568
1765
  [disabled]="isActionDisabled(action)"
1766
+ [matTooltip]="getActionTooltip(action)"
1569
1767
  [matMenuTriggerFor]="endActionMenu"
1570
1768
  [attr.aria-label]="getActionAriaLabel(action)"
1571
1769
  >
@@ -1577,6 +1775,7 @@ class PraxisTableToolbar {
1577
1775
  <button
1578
1776
  mat-menu-item
1579
1777
  [disabled]="isActionDisabled(child)"
1778
+ [matTooltip]="getActionTooltip(child)"
1580
1779
  (click)="emitToolbarAction($event, getActionId(child), child)"
1581
1780
  >
1582
1781
  @if (child.icon) { <mat-icon [praxisIcon]="child.icon"></mat-icon> }
@@ -1590,6 +1789,7 @@ class PraxisTableToolbar {
1590
1789
  mat-button
1591
1790
  [color]="getActionColor(action)"
1592
1791
  [disabled]="isActionDisabled(action)"
1792
+ [matTooltip]="getActionTooltip(action)"
1593
1793
  (click)="emitToolbarAction($event, getActionId(action), action)"
1594
1794
  [attr.aria-label]="getActionAriaLabel(action)"
1595
1795
  >
@@ -1602,6 +1802,7 @@ class PraxisTableToolbar {
1602
1802
  mat-stroked-button
1603
1803
  [color]="getActionColor(action)"
1604
1804
  [disabled]="isActionDisabled(action)"
1805
+ [matTooltip]="getActionTooltip(action)"
1605
1806
  (click)="emitToolbarAction($event, getActionId(action), action)"
1606
1807
  [attr.aria-label]="getActionAriaLabel(action)"
1607
1808
  >
@@ -1614,6 +1815,7 @@ class PraxisTableToolbar {
1614
1815
  mat-raised-button
1615
1816
  [color]="getActionColor(action)"
1616
1817
  [disabled]="isActionDisabled(action)"
1818
+ [matTooltip]="getActionTooltip(action)"
1617
1819
  (click)="emitToolbarAction($event, getActionId(action), action)"
1618
1820
  [attr.aria-label]="getActionAriaLabel(action)"
1619
1821
  >
@@ -1626,6 +1828,7 @@ class PraxisTableToolbar {
1626
1828
  mat-button
1627
1829
  [color]="getActionColor(action)"
1628
1830
  [disabled]="isActionDisabled(action)"
1831
+ [matTooltip]="getActionTooltip(action)"
1629
1832
  (click)="emitToolbarAction($event, getActionId(action), action)"
1630
1833
  [attr.aria-label]="getActionAriaLabel(action)"
1631
1834
  >
@@ -1638,6 +1841,7 @@ class PraxisTableToolbar {
1638
1841
  mat-button
1639
1842
  [color]="getActionColor(action)"
1640
1843
  [disabled]="isActionDisabled(action)"
1844
+ [matTooltip]="getActionTooltip(action)"
1641
1845
  (click)="emitToolbarAction($event, getActionId(action), action)"
1642
1846
  [attr.aria-label]="getActionAriaLabel(action)"
1643
1847
  >
@@ -1650,6 +1854,7 @@ class PraxisTableToolbar {
1650
1854
  mat-flat-button
1651
1855
  [color]="getActionColor(action)"
1652
1856
  [disabled]="isActionDisabled(action)"
1857
+ [matTooltip]="getActionTooltip(action)"
1653
1858
  (click)="emitToolbarAction($event, getActionId(action), action)"
1654
1859
  [attr.aria-label]="getActionAriaLabel(action)"
1655
1860
  >
@@ -1666,6 +1871,7 @@ class PraxisTableToolbar {
1666
1871
  mat-button
1667
1872
  [color]="getActionColor(action)"
1668
1873
  [disabled]="isActionDisabled(action)"
1874
+ [matTooltip]="getActionTooltip(action)"
1669
1875
  (click)="emitToolbarAction($event, getActionId(action), action)"
1670
1876
  [attr.aria-label]="getActionAriaLabel(action)"
1671
1877
  >
@@ -1692,12 +1898,28 @@ class PraxisTableToolbar {
1692
1898
  @for (format of config?.export?.formats; track format) {
1693
1899
  <button
1694
1900
  mat-menu-item
1901
+ class="praxis-table-export-menu-item"
1695
1902
  [disabled]="exportBusy"
1903
+ [matTooltip]="getExportFormatTooltip(format)"
1904
+ [attr.aria-label]="getExportFormatAriaLabel(format)"
1696
1905
  (click)="emitExportAction($event, format)"
1697
1906
  >
1698
1907
  <mat-icon [praxisIcon]="getExportIcon(format)"></mat-icon>
1699
- {{ format.toUpperCase() }}
1908
+ {{ getExportFormatLabel(format) }}
1700
1909
  </button>
1910
+ @if (isVisibleExcelExportEnabled(format)) {
1911
+ <button
1912
+ mat-menu-item
1913
+ class="praxis-table-export-menu-item"
1914
+ [disabled]="exportBusy"
1915
+ [matTooltip]="getVisibleExcelExportDescription()"
1916
+ [attr.aria-label]="getVisibleExcelExportAriaLabel()"
1917
+ (click)="emitVisibleExcelExportAction($event)"
1918
+ >
1919
+ <mat-icon [praxisIcon]="'table_view'"></mat-icon>
1920
+ {{ getVisibleExcelExportLabel() }}
1921
+ </button>
1922
+ }
1701
1923
  }
1702
1924
  </mat-menu>
1703
1925
  }
@@ -1768,6 +1990,7 @@ class PraxisTableToolbar {
1768
1990
  <button
1769
1991
  mat-menu-item
1770
1992
  [disabled]="isActionDisabled(action)"
1993
+ [matTooltip]="getActionTooltip(action)"
1771
1994
  (click)="emitToolbarAction($event, getActionId(action), action)"
1772
1995
  >
1773
1996
  @if (action.icon) { <mat-icon [praxisIcon]="action.icon"></mat-icon> }
@@ -1790,12 +2013,28 @@ class PraxisTableToolbar {
1790
2013
  @for (format of config?.export?.formats; track format) {
1791
2014
  <button
1792
2015
  mat-menu-item
2016
+ class="praxis-table-export-menu-item"
1793
2017
  [disabled]="exportBusy"
2018
+ [matTooltip]="getExportFormatTooltip(format)"
2019
+ [attr.aria-label]="getExportFormatAriaLabel(format)"
1794
2020
  (click)="emitExportAction($event, format)"
1795
2021
  >
1796
2022
  <mat-icon>{{ getExportIcon(format) }}</mat-icon>
1797
- {{ format.toUpperCase() }}
2023
+ {{ getExportFormatLabel(format) }}
1798
2024
  </button>
2025
+ @if (isVisibleExcelExportEnabled(format)) {
2026
+ <button
2027
+ mat-menu-item
2028
+ class="praxis-table-export-menu-item"
2029
+ [disabled]="exportBusy"
2030
+ [matTooltip]="getVisibleExcelExportDescription()"
2031
+ [attr.aria-label]="getVisibleExcelExportAriaLabel()"
2032
+ (click)="emitVisibleExcelExportAction($event)"
2033
+ >
2034
+ <mat-icon [praxisIcon]="'table_view'"></mat-icon>
2035
+ {{ getVisibleExcelExportLabel() }}
2036
+ </button>
2037
+ }
1799
2038
  }
1800
2039
  </mat-menu>
1801
2040
  }
@@ -1843,7 +2082,7 @@ class PraxisTableToolbar {
1843
2082
  }
1844
2083
  </div>
1845
2084
  </mat-toolbar>
1846
- `, isInline: true, styles: [":host{display:block}.praxis-toolbar{--p-table-toolbar-bg-default: linear-gradient( 180deg, color-mix(in srgb, var(--md-sys-color-surface, #fff) 96%, transparent), color-mix(in srgb, var(--md-sys-color-surface-container-low, #f6f8fc) 100%, transparent) );--p-table-toolbar-fg-default: var(--md-sys-color-on-surface, currentColor);--p-table-toolbar-border-color-default: color-mix(in srgb, var(--md-sys-color-outline-variant, #d7dbe5) 78%, transparent);--p-table-toolbar-divider-color-default: color-mix(in srgb, var(--md-sys-color-outline) 42%, transparent);--p-table-toolbar-action-hover-bg-default: color-mix(in srgb, var(--md-sys-color-primary) 10%, transparent);--p-table-toolbar-action-active-bg-default: color-mix(in srgb, var(--md-sys-color-primary) 16%, transparent);--p-table-toolbar-action-focus-ring-default: color-mix(in srgb, var(--md-sys-color-primary) 52%, transparent);--p-table-toolbar-ai-accent-color-default: var(--md-sys-color-primary, #0b72d9);--p-table-toolbar-status-fg-default: var(--md-sys-color-on-surface-variant, currentColor);background:var(--p-table-toolbar-bg, var(--p-table-toolbar-bg-default));color:var(--p-table-toolbar-fg, var(--p-table-toolbar-fg-default));box-shadow:var(--p-table-toolbar-shadow, none);padding:var(--p-table-toolbar-padding-block, var(--pfx-toolbar-pad-y, 6px)) var(--p-table-toolbar-padding-inline, var(--pfx-toolbar-pad-x, 12px));min-height:var(--p-table-toolbar-min-height, var(--pfx-filter-h, 44px));display:flex;flex-direction:row;align-items:center;gap:var(--p-table-toolbar-gap, 6px);flex-wrap:wrap;border:var(--p-table-toolbar-border-width, 1px) solid var(--p-table-toolbar-border-color, var(--p-table-toolbar-border-color-default));border-radius:var(--p-table-toolbar-radius, 10px)}.praxis-toolbar.p-table-toolbar--flat{--p-table-toolbar-border-width: 0;--p-table-toolbar-shadow: none}.praxis-toolbar.p-table-toolbar--elevated{--p-table-toolbar-shadow: 0 12px 28px color-mix(in srgb, var(--md-sys-color-shadow, #000) 12%, transparent)}.praxis-toolbar.p-table-toolbar--integrated{--p-table-toolbar-bg: transparent;--p-table-toolbar-border-width: 0;--p-table-toolbar-radius: 0}.praxis-toolbar.p-table-toolbar--compact{--p-table-toolbar-min-height: 36px;--p-table-toolbar-padding-block: 4px;--p-table-toolbar-padding-inline: 10px;--p-table-toolbar-gap: 4px;--p-table-toolbar-actions-gap: 4px;--p-table-toolbar-action-size: 32px;--p-table-toolbar-action-radius: 7px}.praxis-toolbar.p-table-toolbar--comfortable{--p-table-toolbar-min-height: 44px;--p-table-toolbar-action-size: 36px}.praxis-toolbar.p-table-toolbar--spacious{--p-table-toolbar-min-height: 52px;--p-table-toolbar-padding-block: 8px;--p-table-toolbar-padding-inline: 16px;--p-table-toolbar-gap: 8px;--p-table-toolbar-actions-gap: 8px;--p-table-toolbar-action-size: 40px}.praxis-toolbar.p-table-toolbar--square{--p-table-toolbar-radius: 0;--p-table-toolbar-action-radius: 4px}.praxis-toolbar.p-table-toolbar--pill{--p-table-toolbar-radius: 999px;--p-table-toolbar-action-radius: 999px}:host(.praxis-toolbar-stack-top) .praxis-toolbar{border-bottom-left-radius:0;border-bottom-right-radius:0}:host(.praxis-toolbar-footer) .praxis-toolbar{border-top-left-radius:0;border-top-right-radius:0}:host(.praxis-toolbar-footer.footer-flat) .praxis-toolbar{border-bottom-left-radius:0;border-bottom-right-radius:0}.praxis-toolbar.mat-toolbar-single-row,.praxis-toolbar .mat-toolbar-row{height:auto}.praxis-toolbar.mat-toolbar-multiple-rows{min-height:var(--p-table-toolbar-min-height, var(--pfx-filter-h, 44px))}.toolbar-main{display:flex;align-items:center;justify-content:flex-start;min-width:0;column-gap:var(--p-table-toolbar-gap, 6px);row-gap:var(--p-table-toolbar-identity-filter-gap, 8px);min-height:var(--p-table-toolbar-min-height, var(--pfx-filter-h, 44px));flex:1 1 360px;flex-wrap:wrap;container-type:inline-size}.toolbar-identity{display:flex;align-items:center;gap:var(--p-table-toolbar-identity-gap, 8px);min-width:0;max-width:100%;min-height:var(--p-table-toolbar-identity-min-height, 30px);flex:1 1 100%;margin-block-end:var(--p-table-toolbar-identity-margin-bottom, 2px);padding-inline:2px;color:var(--p-table-toolbar-title-fg, var(--p-table-toolbar-fg, var(--p-table-toolbar-fg-default)))}.toolbar-identity--center{text-align:center;justify-content:center}.toolbar-identity--end{text-align:end;justify-content:flex-end}.toolbar-identity--center .toolbar-identity__copy{align-items:center}.toolbar-identity--end .toolbar-identity__copy{align-items:flex-end}.toolbar-identity__icon{width:var(--p-table-toolbar-identity-icon-size, 28px);height:var(--p-table-toolbar-identity-icon-size, 28px);border-radius:var(--p-table-toolbar-identity-icon-radius, 8px);display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;color:var(--p-table-toolbar-icon-fg, var(--md-sys-color-primary, currentColor));background:color-mix(in srgb,var(--p-table-toolbar-icon-fg, var(--md-sys-color-primary, currentColor)) 8%,transparent);border:1px solid color-mix(in srgb,var(--p-table-toolbar-icon-fg, var(--md-sys-color-primary, currentColor)) 18%,transparent)}.toolbar-identity__icon .mat-icon{font-size:18px;width:18px;height:18px;line-height:18px}.toolbar-identity__copy{display:flex;flex-direction:column;min-width:0;max-width:100%;gap:1px}.toolbar-identity__title,.toolbar-identity__subtitle{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.toolbar-identity__title{font-size:var(--p-table-toolbar-title-font-size, 14px);font-weight:var(--p-table-toolbar-title-font-weight, 700);line-height:1.2;letter-spacing:0;color:var(--p-table-toolbar-title-fg, currentColor)}.toolbar-identity__subtitle{font-size:var(--p-table-toolbar-subtitle-font-size, 11.5px);line-height:1.25;color:var(--p-table-toolbar-subtitle-fg, var(--p-table-toolbar-status-fg, var(--p-table-toolbar-status-fg-default)))}.toolbar-main>*{min-width:0}@container (max-width: 720px){.toolbar-identity{flex-basis:100%;max-width:100%}}@container (max-width: 420px){.toolbar-identity{min-width:0;flex-basis:auto}.toolbar-identity__subtitle{display:none}}.toolbar-actions{display:flex;align-items:center;align-self:flex-end;justify-content:flex-end;gap:var(--p-table-toolbar-gap, 6px);min-height:var(--p-table-toolbar-min-height, var(--pfx-filter-h, 44px));flex:0 0 auto;margin-left:auto}.actions-group{display:flex;align-items:center;gap:var(--p-table-toolbar-actions-gap, 6px)}.action-btn{height:var(--p-table-toolbar-action-size, 36px);min-width:var(--p-table-toolbar-action-size, 36px);border-radius:var(--p-table-toolbar-action-radius, 8px);font-size:12px;line-height:1.2;color:var(--p-table-toolbar-action-fg, inherit);background:var(--p-table-toolbar-action-bg, transparent)}.action-btn:hover:not(:disabled),.overflow-trigger:hover:not(:disabled),.end-actions ::ng-deep .mat-mdc-icon-button:hover:not(:disabled){background:var(--p-table-toolbar-action-hover-bg, var(--p-table-toolbar-action-hover-bg-default))}.action-btn:focus-visible,.overflow-trigger:focus-visible,.end-actions ::ng-deep .mat-mdc-icon-button:focus-visible{outline:2px solid var(--p-table-toolbar-action-focus-ring, var(--p-table-toolbar-action-focus-ring-default));outline-offset:2px}.action-btn--utility{color:var(--p-table-toolbar-status-fg, var(--p-table-toolbar-status-fg-default))}.praxis-table-toolbar-action--columns.action-btn{width:var(--p-table-toolbar-action-size, 36px);padding:0}.praxis-table-toolbar-action--columns mat-icon{margin:0}.toolbar-icon-btn{width:var(--p-table-toolbar-action-size, 36px);height:var(--p-table-toolbar-action-size, 36px);border-radius:var(--p-table-toolbar-action-radius, 8px);color:var(--md-sys-color-primary);background:color-mix(in srgb,var(--md-sys-color-primary) 9%,transparent);border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 22%,transparent)}.toolbar-icon-btn:hover:not(:disabled){color:var(--md-sys-color-on-primary-container);background:color-mix(in srgb,var(--md-sys-color-primary) 16%,transparent);border-color:color-mix(in srgb,var(--md-sys-color-primary) 36%,transparent)}.action-btn--fab{width:42px;height:42px;box-shadow:none}.pfx-tonal{background:var(--md-sys-color-secondary-container);color:var(--md-sys-color-on-secondary-container)}.pfx-tonal:hover{background:var(--md-sys-color-secondary-container)}.mobile-actions{display:none;align-items:center;gap:var(--p-table-toolbar-actions-gap, 6px)}.overflow-trigger{height:var(--p-table-toolbar-action-size, 36px)}.action-btn .mat-icon,.action-btn--fab .mat-icon,.overflow-trigger .mat-icon{font-size:18px;width:18px;height:18px;line-height:18px}.praxis-table-toolbar-action--columns .mat-icon{font-size:24px;width:24px;height:24px;line-height:24px}.praxis-table-column-menu-item.mat-mdc-menu-item{min-height:40px}.praxis-table-column-menu-content{align-items:center;display:flex;gap:10px;min-height:40px;width:100%}.praxis-table-column-menu-check.mat-icon{color:var(--md-sys-color-primary, currentColor);flex:0 0 20px;font-size:20px;height:20px;line-height:20px;margin-inline-end:0;width:20px}.action-btn.mat-mdc-button-base,.action-btn--fab.mat-mdc-button-base,.overflow-trigger.mat-mdc-button-base,.toolbar-icon-btn.mat-mdc-button-base{--mdc-text-button-container-height: var(--p-table-toolbar-action-size, 36px);--mdc-filled-button-container-height: var(--p-table-toolbar-action-size, 36px);--mdc-protected-button-container-height: var(--p-table-toolbar-action-size, 36px);--mdc-outlined-button-container-height: var(--p-table-toolbar-action-size, 36px);--mdc-icon-button-state-layer-size: var(--p-table-toolbar-action-size, 36px)}.action-btn.mat-mdc-unelevated-button:not(:disabled),.action-btn.mat-mdc-outlined-button:not(:disabled),.action-btn.pfx-tonal:not(:disabled){border-color:color-mix(in srgb,var(--md-sys-color-outline-variant, #d7dbe5) 82%,transparent)}.action-btn.mat-mdc-unelevated-button:not(:disabled){box-shadow:none}.action-btn.mat-mdc-unelevated-button.mat-primary:not(:disabled){--mdc-filled-button-container-color: var(--md-sys-color-primary);--mdc-filled-button-label-text-color: var(--md-sys-color-on-primary);--mat-filled-button-state-layer-color: var(--md-sys-color-on-primary);background:var(--md-sys-color-primary)!important;border-color:transparent;color:var(--md-sys-color-on-primary)!important;box-shadow:0 8px 18px color-mix(in srgb,var(--md-sys-color-primary) 22%,transparent)}.action-btn.mat-mdc-unelevated-button.mat-primary:not(:disabled):hover{background:color-mix(in srgb,var(--md-sys-color-primary) 88%,var(--md-sys-color-on-primary) 12%)!important}.action-btn.mat-mdc-unelevated-button.mat-primary:not(:disabled) .mat-icon{color:var(--md-sys-color-on-primary)!important}.action-btn.mat-mdc-button-base:not(.mat-mdc-icon-button){padding-inline:10px}.end-actions{display:flex;align-items:center;gap:var(--p-table-toolbar-actions-gap, 6px);margin-left:4px;padding-left:10px;border-left:1px solid var(--p-table-toolbar-divider-color, var(--p-table-toolbar-divider-color-default))}.end-actions:empty{display:none;gap:0;margin-left:0;padding-left:0;border-left:0}.end-actions ::ng-deep .mat-mdc-icon-button{width:var(--p-table-toolbar-action-size, 36px);height:var(--p-table-toolbar-action-size, 36px);display:inline-grid;place-items:center;padding:0;line-height:0;--mdc-icon-button-state-layer-size: var(--p-table-toolbar-action-size, 36px);--mat-icon-button-state-layer-size: var(--p-table-toolbar-action-size, 36px)}.end-actions ::ng-deep .mat-mdc-icon-button .mat-icon{display:block;flex:0 0 auto;font-size:24px;width:24px;height:24px;line-height:24px;margin:0}.praxis-toolbar.p-table-toolbar--divider-between-groups .actions-group,.praxis-toolbar.p-table-toolbar--divider-start .toolbar-main{padding-right:10px;border-right:1px solid var(--p-table-toolbar-divider-color, var(--p-table-toolbar-divider-color-default))}.end-actions ::ng-deep .praxis-table-toolbar-action--ai,.end-actions ::ng-deep .praxis-table-ai-trigger{color:var(--p-table-toolbar-ai-accent-color, var(--p-table-toolbar-ai-accent-color-default));background:color-mix(in srgb,var(--p-table-toolbar-ai-accent-color, var(--p-table-toolbar-ai-accent-color-default)) 10%,transparent);border:1px solid color-mix(in srgb,var(--p-table-toolbar-ai-accent-color, var(--p-table-toolbar-ai-accent-color-default)) 24%,transparent)}.end-actions ::ng-deep [data-role=table-settings]{color:var(--p-table-toolbar-status-fg, var(--p-table-toolbar-status-fg-default))}@media(min-width:1024px){.toolbar-actions{justify-content:flex-end}}@media(max-width:1023px){.actions-group{display:none}.mobile-actions{display:flex}.toolbar-actions{justify-content:flex-end}.toolbar-identity{min-width:0;max-width:100%;flex:1 1 100%}}\n"], dependencies: [{ kind: "ngmodule", type: MatToolbarModule }, { kind: "component", type: i2.MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i3.MatFabButton, selector: "button[mat-fab], a[mat-fab], button[matFab], a[matFab]", inputs: ["extended"], exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: PraxisIconDirective, selector: "mat-icon[praxisIcon]", inputs: ["praxisIcon"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i5.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i5.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i5.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i10.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }] });
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"] }] });
1847
2086
  }
1848
2087
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisTableToolbar, decorators: [{
1849
2088
  type: Component,
@@ -1949,8 +2188,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
1949
2188
  [color]="getActionColor(action)"
1950
2189
  [disabled]="isActionDisabled(action)"
1951
2190
  (click)="emitToolbarAction($event, getActionId(action), action)"
1952
- [attr.aria-label]="action.label || getActionId(action)"
1953
- [matTooltip]="action.tooltip || action.label || getActionId(action)"
2191
+ [attr.aria-label]="getActionAriaLabel(action)"
2192
+ [matTooltip]="getActionTooltip(action) || action.label || getActionId(action)"
1954
2193
  matTooltipPosition="below"
1955
2194
  >
1956
2195
  <mat-icon [praxisIcon]="action.icon || 'bolt'"></mat-icon>
@@ -1962,8 +2201,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
1962
2201
  [color]="getActionColor(action)"
1963
2202
  [disabled]="isActionDisabled(action)"
1964
2203
  (click)="emitToolbarAction($event, getActionId(action), action)"
1965
- [attr.aria-label]="action.label || getActionId(action)"
1966
- [matTooltip]="action.tooltip || action.label || getActionId(action)"
2204
+ [attr.aria-label]="getActionAriaLabel(action)"
2205
+ [matTooltip]="getActionTooltip(action) || action.label || getActionId(action)"
1967
2206
  matTooltipPosition="below"
1968
2207
  >
1969
2208
  <mat-icon [praxisIcon]="action.icon || 'bolt'"></mat-icon>
@@ -1974,6 +2213,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
1974
2213
  mat-button
1975
2214
  [color]="getActionColor(action)"
1976
2215
  [disabled]="isActionDisabled(action)"
2216
+ [matTooltip]="getActionTooltip(action)"
1977
2217
  [matMenuTriggerFor]="startActionMenu"
1978
2218
  [attr.aria-label]="getActionAriaLabel(action)"
1979
2219
  >
@@ -1985,6 +2225,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
1985
2225
  <button
1986
2226
  mat-menu-item
1987
2227
  [disabled]="isActionDisabled(child)"
2228
+ [matTooltip]="getActionTooltip(child)"
1988
2229
  (click)="emitToolbarAction($event, getActionId(child), child)"
1989
2230
  >
1990
2231
  @if (child.icon) { <mat-icon [praxisIcon]="child.icon"></mat-icon> }
@@ -1998,6 +2239,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
1998
2239
  mat-button
1999
2240
  [color]="getActionColor(action)"
2000
2241
  [disabled]="isActionDisabled(action)"
2242
+ [matTooltip]="getActionTooltip(action)"
2001
2243
  (click)="emitToolbarAction($event, getActionId(action), action)"
2002
2244
  [attr.aria-label]="getActionAriaLabel(action)"
2003
2245
  >
@@ -2010,6 +2252,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
2010
2252
  mat-stroked-button
2011
2253
  [color]="getActionColor(action)"
2012
2254
  [disabled]="isActionDisabled(action)"
2255
+ [matTooltip]="getActionTooltip(action)"
2013
2256
  (click)="emitToolbarAction($event, getActionId(action), action)"
2014
2257
  [attr.aria-label]="getActionAriaLabel(action)"
2015
2258
  >
@@ -2022,6 +2265,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
2022
2265
  mat-raised-button
2023
2266
  [color]="getActionColor(action)"
2024
2267
  [disabled]="isActionDisabled(action)"
2268
+ [matTooltip]="getActionTooltip(action)"
2025
2269
  (click)="emitToolbarAction($event, getActionId(action), action)"
2026
2270
  [attr.aria-label]="getActionAriaLabel(action)"
2027
2271
  >
@@ -2034,6 +2278,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
2034
2278
  mat-button
2035
2279
  [color]="getActionColor(action)"
2036
2280
  [disabled]="isActionDisabled(action)"
2281
+ [matTooltip]="getActionTooltip(action)"
2037
2282
  (click)="emitToolbarAction($event, getActionId(action), action)"
2038
2283
  [attr.aria-label]="getActionAriaLabel(action)"
2039
2284
  >
@@ -2046,6 +2291,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
2046
2291
  mat-button
2047
2292
  [color]="getActionColor(action)"
2048
2293
  [disabled]="isActionDisabled(action)"
2294
+ [matTooltip]="getActionTooltip(action)"
2049
2295
  (click)="emitToolbarAction($event, getActionId(action), action)"
2050
2296
  [attr.aria-label]="getActionAriaLabel(action)"
2051
2297
  >
@@ -2058,6 +2304,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
2058
2304
  mat-flat-button
2059
2305
  [color]="getActionColor(action)"
2060
2306
  [disabled]="isActionDisabled(action)"
2307
+ [matTooltip]="getActionTooltip(action)"
2061
2308
  (click)="emitToolbarAction($event, getActionId(action), action)"
2062
2309
  [attr.aria-label]="getActionAriaLabel(action)"
2063
2310
  >
@@ -2075,8 +2322,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
2075
2322
  [color]="getActionColor(action)"
2076
2323
  [disabled]="isActionDisabled(action)"
2077
2324
  (click)="emitToolbarAction($event, getActionId(action), action)"
2078
- [attr.aria-label]="action.label || getActionId(action)"
2079
- [matTooltip]="action.tooltip || action.label || getActionId(action)"
2325
+ [attr.aria-label]="getActionAriaLabel(action)"
2326
+ [matTooltip]="getActionTooltip(action) || action.label || getActionId(action)"
2080
2327
  matTooltipPosition="below"
2081
2328
  >
2082
2329
  <mat-icon [praxisIcon]="action.icon || 'bolt'"></mat-icon>
@@ -2088,8 +2335,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
2088
2335
  [color]="getActionColor(action)"
2089
2336
  [disabled]="isActionDisabled(action)"
2090
2337
  (click)="emitToolbarAction($event, getActionId(action), action)"
2091
- [attr.aria-label]="action.label || getActionId(action)"
2092
- [matTooltip]="action.tooltip || action.label || getActionId(action)"
2338
+ [attr.aria-label]="getActionAriaLabel(action)"
2339
+ [matTooltip]="getActionTooltip(action) || action.label || getActionId(action)"
2093
2340
  matTooltipPosition="below"
2094
2341
  >
2095
2342
  <mat-icon [praxisIcon]="action.icon || 'bolt'"></mat-icon>
@@ -2100,6 +2347,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
2100
2347
  mat-button
2101
2348
  [color]="getActionColor(action)"
2102
2349
  [disabled]="isActionDisabled(action)"
2350
+ [matTooltip]="getActionTooltip(action)"
2103
2351
  [matMenuTriggerFor]="endActionMenu"
2104
2352
  [attr.aria-label]="getActionAriaLabel(action)"
2105
2353
  >
@@ -2111,6 +2359,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
2111
2359
  <button
2112
2360
  mat-menu-item
2113
2361
  [disabled]="isActionDisabled(child)"
2362
+ [matTooltip]="getActionTooltip(child)"
2114
2363
  (click)="emitToolbarAction($event, getActionId(child), child)"
2115
2364
  >
2116
2365
  @if (child.icon) { <mat-icon [praxisIcon]="child.icon"></mat-icon> }
@@ -2124,6 +2373,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
2124
2373
  mat-button
2125
2374
  [color]="getActionColor(action)"
2126
2375
  [disabled]="isActionDisabled(action)"
2376
+ [matTooltip]="getActionTooltip(action)"
2127
2377
  (click)="emitToolbarAction($event, getActionId(action), action)"
2128
2378
  [attr.aria-label]="getActionAriaLabel(action)"
2129
2379
  >
@@ -2136,6 +2386,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
2136
2386
  mat-stroked-button
2137
2387
  [color]="getActionColor(action)"
2138
2388
  [disabled]="isActionDisabled(action)"
2389
+ [matTooltip]="getActionTooltip(action)"
2139
2390
  (click)="emitToolbarAction($event, getActionId(action), action)"
2140
2391
  [attr.aria-label]="getActionAriaLabel(action)"
2141
2392
  >
@@ -2148,6 +2399,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
2148
2399
  mat-raised-button
2149
2400
  [color]="getActionColor(action)"
2150
2401
  [disabled]="isActionDisabled(action)"
2402
+ [matTooltip]="getActionTooltip(action)"
2151
2403
  (click)="emitToolbarAction($event, getActionId(action), action)"
2152
2404
  [attr.aria-label]="getActionAriaLabel(action)"
2153
2405
  >
@@ -2160,6 +2412,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
2160
2412
  mat-button
2161
2413
  [color]="getActionColor(action)"
2162
2414
  [disabled]="isActionDisabled(action)"
2415
+ [matTooltip]="getActionTooltip(action)"
2163
2416
  (click)="emitToolbarAction($event, getActionId(action), action)"
2164
2417
  [attr.aria-label]="getActionAriaLabel(action)"
2165
2418
  >
@@ -2172,6 +2425,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
2172
2425
  mat-button
2173
2426
  [color]="getActionColor(action)"
2174
2427
  [disabled]="isActionDisabled(action)"
2428
+ [matTooltip]="getActionTooltip(action)"
2175
2429
  (click)="emitToolbarAction($event, getActionId(action), action)"
2176
2430
  [attr.aria-label]="getActionAriaLabel(action)"
2177
2431
  >
@@ -2184,6 +2438,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
2184
2438
  mat-flat-button
2185
2439
  [color]="getActionColor(action)"
2186
2440
  [disabled]="isActionDisabled(action)"
2441
+ [matTooltip]="getActionTooltip(action)"
2187
2442
  (click)="emitToolbarAction($event, getActionId(action), action)"
2188
2443
  [attr.aria-label]="getActionAriaLabel(action)"
2189
2444
  >
@@ -2200,6 +2455,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
2200
2455
  mat-button
2201
2456
  [color]="getActionColor(action)"
2202
2457
  [disabled]="isActionDisabled(action)"
2458
+ [matTooltip]="getActionTooltip(action)"
2203
2459
  (click)="emitToolbarAction($event, getActionId(action), action)"
2204
2460
  [attr.aria-label]="getActionAriaLabel(action)"
2205
2461
  >
@@ -2226,12 +2482,28 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
2226
2482
  @for (format of config?.export?.formats; track format) {
2227
2483
  <button
2228
2484
  mat-menu-item
2485
+ class="praxis-table-export-menu-item"
2229
2486
  [disabled]="exportBusy"
2487
+ [matTooltip]="getExportFormatTooltip(format)"
2488
+ [attr.aria-label]="getExportFormatAriaLabel(format)"
2230
2489
  (click)="emitExportAction($event, format)"
2231
2490
  >
2232
2491
  <mat-icon [praxisIcon]="getExportIcon(format)"></mat-icon>
2233
- {{ format.toUpperCase() }}
2492
+ {{ getExportFormatLabel(format) }}
2234
2493
  </button>
2494
+ @if (isVisibleExcelExportEnabled(format)) {
2495
+ <button
2496
+ mat-menu-item
2497
+ class="praxis-table-export-menu-item"
2498
+ [disabled]="exportBusy"
2499
+ [matTooltip]="getVisibleExcelExportDescription()"
2500
+ [attr.aria-label]="getVisibleExcelExportAriaLabel()"
2501
+ (click)="emitVisibleExcelExportAction($event)"
2502
+ >
2503
+ <mat-icon [praxisIcon]="'table_view'"></mat-icon>
2504
+ {{ getVisibleExcelExportLabel() }}
2505
+ </button>
2506
+ }
2235
2507
  }
2236
2508
  </mat-menu>
2237
2509
  }
@@ -2302,6 +2574,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
2302
2574
  <button
2303
2575
  mat-menu-item
2304
2576
  [disabled]="isActionDisabled(action)"
2577
+ [matTooltip]="getActionTooltip(action)"
2305
2578
  (click)="emitToolbarAction($event, getActionId(action), action)"
2306
2579
  >
2307
2580
  @if (action.icon) { <mat-icon [praxisIcon]="action.icon"></mat-icon> }
@@ -2324,12 +2597,28 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
2324
2597
  @for (format of config?.export?.formats; track format) {
2325
2598
  <button
2326
2599
  mat-menu-item
2600
+ class="praxis-table-export-menu-item"
2327
2601
  [disabled]="exportBusy"
2602
+ [matTooltip]="getExportFormatTooltip(format)"
2603
+ [attr.aria-label]="getExportFormatAriaLabel(format)"
2328
2604
  (click)="emitExportAction($event, format)"
2329
2605
  >
2330
2606
  <mat-icon>{{ getExportIcon(format) }}</mat-icon>
2331
- {{ format.toUpperCase() }}
2607
+ {{ getExportFormatLabel(format) }}
2332
2608
  </button>
2609
+ @if (isVisibleExcelExportEnabled(format)) {
2610
+ <button
2611
+ mat-menu-item
2612
+ class="praxis-table-export-menu-item"
2613
+ [disabled]="exportBusy"
2614
+ [matTooltip]="getVisibleExcelExportDescription()"
2615
+ [attr.aria-label]="getVisibleExcelExportAriaLabel()"
2616
+ (click)="emitVisibleExcelExportAction($event)"
2617
+ >
2618
+ <mat-icon [praxisIcon]="'table_view'"></mat-icon>
2619
+ {{ getVisibleExcelExportLabel() }}
2620
+ </button>
2621
+ }
2333
2622
  }
2334
2623
  </mat-menu>
2335
2624
  }
@@ -2380,7 +2669,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
2380
2669
  `, host: {
2381
2670
  '[class.praxis-toolbar-footer]': "placement === 'footer'",
2382
2671
  '(document:keydown)': 'onDocumentKeydown($event)',
2383
- }, styles: [":host{display:block}.praxis-toolbar{--p-table-toolbar-bg-default: linear-gradient( 180deg, color-mix(in srgb, var(--md-sys-color-surface, #fff) 96%, transparent), color-mix(in srgb, var(--md-sys-color-surface-container-low, #f6f8fc) 100%, transparent) );--p-table-toolbar-fg-default: var(--md-sys-color-on-surface, currentColor);--p-table-toolbar-border-color-default: color-mix(in srgb, var(--md-sys-color-outline-variant, #d7dbe5) 78%, transparent);--p-table-toolbar-divider-color-default: color-mix(in srgb, var(--md-sys-color-outline) 42%, transparent);--p-table-toolbar-action-hover-bg-default: color-mix(in srgb, var(--md-sys-color-primary) 10%, transparent);--p-table-toolbar-action-active-bg-default: color-mix(in srgb, var(--md-sys-color-primary) 16%, transparent);--p-table-toolbar-action-focus-ring-default: color-mix(in srgb, var(--md-sys-color-primary) 52%, transparent);--p-table-toolbar-ai-accent-color-default: var(--md-sys-color-primary, #0b72d9);--p-table-toolbar-status-fg-default: var(--md-sys-color-on-surface-variant, currentColor);background:var(--p-table-toolbar-bg, var(--p-table-toolbar-bg-default));color:var(--p-table-toolbar-fg, var(--p-table-toolbar-fg-default));box-shadow:var(--p-table-toolbar-shadow, none);padding:var(--p-table-toolbar-padding-block, var(--pfx-toolbar-pad-y, 6px)) var(--p-table-toolbar-padding-inline, var(--pfx-toolbar-pad-x, 12px));min-height:var(--p-table-toolbar-min-height, var(--pfx-filter-h, 44px));display:flex;flex-direction:row;align-items:center;gap:var(--p-table-toolbar-gap, 6px);flex-wrap:wrap;border:var(--p-table-toolbar-border-width, 1px) solid var(--p-table-toolbar-border-color, var(--p-table-toolbar-border-color-default));border-radius:var(--p-table-toolbar-radius, 10px)}.praxis-toolbar.p-table-toolbar--flat{--p-table-toolbar-border-width: 0;--p-table-toolbar-shadow: none}.praxis-toolbar.p-table-toolbar--elevated{--p-table-toolbar-shadow: 0 12px 28px color-mix(in srgb, var(--md-sys-color-shadow, #000) 12%, transparent)}.praxis-toolbar.p-table-toolbar--integrated{--p-table-toolbar-bg: transparent;--p-table-toolbar-border-width: 0;--p-table-toolbar-radius: 0}.praxis-toolbar.p-table-toolbar--compact{--p-table-toolbar-min-height: 36px;--p-table-toolbar-padding-block: 4px;--p-table-toolbar-padding-inline: 10px;--p-table-toolbar-gap: 4px;--p-table-toolbar-actions-gap: 4px;--p-table-toolbar-action-size: 32px;--p-table-toolbar-action-radius: 7px}.praxis-toolbar.p-table-toolbar--comfortable{--p-table-toolbar-min-height: 44px;--p-table-toolbar-action-size: 36px}.praxis-toolbar.p-table-toolbar--spacious{--p-table-toolbar-min-height: 52px;--p-table-toolbar-padding-block: 8px;--p-table-toolbar-padding-inline: 16px;--p-table-toolbar-gap: 8px;--p-table-toolbar-actions-gap: 8px;--p-table-toolbar-action-size: 40px}.praxis-toolbar.p-table-toolbar--square{--p-table-toolbar-radius: 0;--p-table-toolbar-action-radius: 4px}.praxis-toolbar.p-table-toolbar--pill{--p-table-toolbar-radius: 999px;--p-table-toolbar-action-radius: 999px}:host(.praxis-toolbar-stack-top) .praxis-toolbar{border-bottom-left-radius:0;border-bottom-right-radius:0}:host(.praxis-toolbar-footer) .praxis-toolbar{border-top-left-radius:0;border-top-right-radius:0}:host(.praxis-toolbar-footer.footer-flat) .praxis-toolbar{border-bottom-left-radius:0;border-bottom-right-radius:0}.praxis-toolbar.mat-toolbar-single-row,.praxis-toolbar .mat-toolbar-row{height:auto}.praxis-toolbar.mat-toolbar-multiple-rows{min-height:var(--p-table-toolbar-min-height, var(--pfx-filter-h, 44px))}.toolbar-main{display:flex;align-items:center;justify-content:flex-start;min-width:0;column-gap:var(--p-table-toolbar-gap, 6px);row-gap:var(--p-table-toolbar-identity-filter-gap, 8px);min-height:var(--p-table-toolbar-min-height, var(--pfx-filter-h, 44px));flex:1 1 360px;flex-wrap:wrap;container-type:inline-size}.toolbar-identity{display:flex;align-items:center;gap:var(--p-table-toolbar-identity-gap, 8px);min-width:0;max-width:100%;min-height:var(--p-table-toolbar-identity-min-height, 30px);flex:1 1 100%;margin-block-end:var(--p-table-toolbar-identity-margin-bottom, 2px);padding-inline:2px;color:var(--p-table-toolbar-title-fg, var(--p-table-toolbar-fg, var(--p-table-toolbar-fg-default)))}.toolbar-identity--center{text-align:center;justify-content:center}.toolbar-identity--end{text-align:end;justify-content:flex-end}.toolbar-identity--center .toolbar-identity__copy{align-items:center}.toolbar-identity--end .toolbar-identity__copy{align-items:flex-end}.toolbar-identity__icon{width:var(--p-table-toolbar-identity-icon-size, 28px);height:var(--p-table-toolbar-identity-icon-size, 28px);border-radius:var(--p-table-toolbar-identity-icon-radius, 8px);display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;color:var(--p-table-toolbar-icon-fg, var(--md-sys-color-primary, currentColor));background:color-mix(in srgb,var(--p-table-toolbar-icon-fg, var(--md-sys-color-primary, currentColor)) 8%,transparent);border:1px solid color-mix(in srgb,var(--p-table-toolbar-icon-fg, var(--md-sys-color-primary, currentColor)) 18%,transparent)}.toolbar-identity__icon .mat-icon{font-size:18px;width:18px;height:18px;line-height:18px}.toolbar-identity__copy{display:flex;flex-direction:column;min-width:0;max-width:100%;gap:1px}.toolbar-identity__title,.toolbar-identity__subtitle{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.toolbar-identity__title{font-size:var(--p-table-toolbar-title-font-size, 14px);font-weight:var(--p-table-toolbar-title-font-weight, 700);line-height:1.2;letter-spacing:0;color:var(--p-table-toolbar-title-fg, currentColor)}.toolbar-identity__subtitle{font-size:var(--p-table-toolbar-subtitle-font-size, 11.5px);line-height:1.25;color:var(--p-table-toolbar-subtitle-fg, var(--p-table-toolbar-status-fg, var(--p-table-toolbar-status-fg-default)))}.toolbar-main>*{min-width:0}@container (max-width: 720px){.toolbar-identity{flex-basis:100%;max-width:100%}}@container (max-width: 420px){.toolbar-identity{min-width:0;flex-basis:auto}.toolbar-identity__subtitle{display:none}}.toolbar-actions{display:flex;align-items:center;align-self:flex-end;justify-content:flex-end;gap:var(--p-table-toolbar-gap, 6px);min-height:var(--p-table-toolbar-min-height, var(--pfx-filter-h, 44px));flex:0 0 auto;margin-left:auto}.actions-group{display:flex;align-items:center;gap:var(--p-table-toolbar-actions-gap, 6px)}.action-btn{height:var(--p-table-toolbar-action-size, 36px);min-width:var(--p-table-toolbar-action-size, 36px);border-radius:var(--p-table-toolbar-action-radius, 8px);font-size:12px;line-height:1.2;color:var(--p-table-toolbar-action-fg, inherit);background:var(--p-table-toolbar-action-bg, transparent)}.action-btn:hover:not(:disabled),.overflow-trigger:hover:not(:disabled),.end-actions ::ng-deep .mat-mdc-icon-button:hover:not(:disabled){background:var(--p-table-toolbar-action-hover-bg, var(--p-table-toolbar-action-hover-bg-default))}.action-btn:focus-visible,.overflow-trigger:focus-visible,.end-actions ::ng-deep .mat-mdc-icon-button:focus-visible{outline:2px solid var(--p-table-toolbar-action-focus-ring, var(--p-table-toolbar-action-focus-ring-default));outline-offset:2px}.action-btn--utility{color:var(--p-table-toolbar-status-fg, var(--p-table-toolbar-status-fg-default))}.praxis-table-toolbar-action--columns.action-btn{width:var(--p-table-toolbar-action-size, 36px);padding:0}.praxis-table-toolbar-action--columns mat-icon{margin:0}.toolbar-icon-btn{width:var(--p-table-toolbar-action-size, 36px);height:var(--p-table-toolbar-action-size, 36px);border-radius:var(--p-table-toolbar-action-radius, 8px);color:var(--md-sys-color-primary);background:color-mix(in srgb,var(--md-sys-color-primary) 9%,transparent);border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 22%,transparent)}.toolbar-icon-btn:hover:not(:disabled){color:var(--md-sys-color-on-primary-container);background:color-mix(in srgb,var(--md-sys-color-primary) 16%,transparent);border-color:color-mix(in srgb,var(--md-sys-color-primary) 36%,transparent)}.action-btn--fab{width:42px;height:42px;box-shadow:none}.pfx-tonal{background:var(--md-sys-color-secondary-container);color:var(--md-sys-color-on-secondary-container)}.pfx-tonal:hover{background:var(--md-sys-color-secondary-container)}.mobile-actions{display:none;align-items:center;gap:var(--p-table-toolbar-actions-gap, 6px)}.overflow-trigger{height:var(--p-table-toolbar-action-size, 36px)}.action-btn .mat-icon,.action-btn--fab .mat-icon,.overflow-trigger .mat-icon{font-size:18px;width:18px;height:18px;line-height:18px}.praxis-table-toolbar-action--columns .mat-icon{font-size:24px;width:24px;height:24px;line-height:24px}.praxis-table-column-menu-item.mat-mdc-menu-item{min-height:40px}.praxis-table-column-menu-content{align-items:center;display:flex;gap:10px;min-height:40px;width:100%}.praxis-table-column-menu-check.mat-icon{color:var(--md-sys-color-primary, currentColor);flex:0 0 20px;font-size:20px;height:20px;line-height:20px;margin-inline-end:0;width:20px}.action-btn.mat-mdc-button-base,.action-btn--fab.mat-mdc-button-base,.overflow-trigger.mat-mdc-button-base,.toolbar-icon-btn.mat-mdc-button-base{--mdc-text-button-container-height: var(--p-table-toolbar-action-size, 36px);--mdc-filled-button-container-height: var(--p-table-toolbar-action-size, 36px);--mdc-protected-button-container-height: var(--p-table-toolbar-action-size, 36px);--mdc-outlined-button-container-height: var(--p-table-toolbar-action-size, 36px);--mdc-icon-button-state-layer-size: var(--p-table-toolbar-action-size, 36px)}.action-btn.mat-mdc-unelevated-button:not(:disabled),.action-btn.mat-mdc-outlined-button:not(:disabled),.action-btn.pfx-tonal:not(:disabled){border-color:color-mix(in srgb,var(--md-sys-color-outline-variant, #d7dbe5) 82%,transparent)}.action-btn.mat-mdc-unelevated-button:not(:disabled){box-shadow:none}.action-btn.mat-mdc-unelevated-button.mat-primary:not(:disabled){--mdc-filled-button-container-color: var(--md-sys-color-primary);--mdc-filled-button-label-text-color: var(--md-sys-color-on-primary);--mat-filled-button-state-layer-color: var(--md-sys-color-on-primary);background:var(--md-sys-color-primary)!important;border-color:transparent;color:var(--md-sys-color-on-primary)!important;box-shadow:0 8px 18px color-mix(in srgb,var(--md-sys-color-primary) 22%,transparent)}.action-btn.mat-mdc-unelevated-button.mat-primary:not(:disabled):hover{background:color-mix(in srgb,var(--md-sys-color-primary) 88%,var(--md-sys-color-on-primary) 12%)!important}.action-btn.mat-mdc-unelevated-button.mat-primary:not(:disabled) .mat-icon{color:var(--md-sys-color-on-primary)!important}.action-btn.mat-mdc-button-base:not(.mat-mdc-icon-button){padding-inline:10px}.end-actions{display:flex;align-items:center;gap:var(--p-table-toolbar-actions-gap, 6px);margin-left:4px;padding-left:10px;border-left:1px solid var(--p-table-toolbar-divider-color, var(--p-table-toolbar-divider-color-default))}.end-actions:empty{display:none;gap:0;margin-left:0;padding-left:0;border-left:0}.end-actions ::ng-deep .mat-mdc-icon-button{width:var(--p-table-toolbar-action-size, 36px);height:var(--p-table-toolbar-action-size, 36px);display:inline-grid;place-items:center;padding:0;line-height:0;--mdc-icon-button-state-layer-size: var(--p-table-toolbar-action-size, 36px);--mat-icon-button-state-layer-size: var(--p-table-toolbar-action-size, 36px)}.end-actions ::ng-deep .mat-mdc-icon-button .mat-icon{display:block;flex:0 0 auto;font-size:24px;width:24px;height:24px;line-height:24px;margin:0}.praxis-toolbar.p-table-toolbar--divider-between-groups .actions-group,.praxis-toolbar.p-table-toolbar--divider-start .toolbar-main{padding-right:10px;border-right:1px solid var(--p-table-toolbar-divider-color, var(--p-table-toolbar-divider-color-default))}.end-actions ::ng-deep .praxis-table-toolbar-action--ai,.end-actions ::ng-deep .praxis-table-ai-trigger{color:var(--p-table-toolbar-ai-accent-color, var(--p-table-toolbar-ai-accent-color-default));background:color-mix(in srgb,var(--p-table-toolbar-ai-accent-color, var(--p-table-toolbar-ai-accent-color-default)) 10%,transparent);border:1px solid color-mix(in srgb,var(--p-table-toolbar-ai-accent-color, var(--p-table-toolbar-ai-accent-color-default)) 24%,transparent)}.end-actions ::ng-deep [data-role=table-settings]{color:var(--p-table-toolbar-status-fg, var(--p-table-toolbar-status-fg-default))}@media(min-width:1024px){.toolbar-actions{justify-content:flex-end}}@media(max-width:1023px){.actions-group{display:none}.mobile-actions{display:flex}.toolbar-actions{justify-content:flex-end}.toolbar-identity{min-width:0;max-width:100%;flex:1 1 100%}}\n"] }]
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"] }]
2384
2673
  }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.LoggerService, decorators: [{
2385
2674
  type: Optional
2386
2675
  }] }, { type: i1.PraxisI18nService, decorators: [{
@@ -8349,6 +8638,7 @@ const PRAXIS_TABLE_EDITOR_I18N_CONFIG = {
8349
8638
  'toolbar.export.fileName': 'Nome padrão do arquivo',
8350
8639
  'toolbar.export.fileName.placeholder': 'dados-export',
8351
8640
  'toolbar.export.includeHeaders': 'Incluir cabeçalhos',
8641
+ 'toolbar.export.visibleCurrentPage': 'Exibir Excel da página atual',
8352
8642
  'toolbar.export.scope': 'Escopo da exportação',
8353
8643
  'toolbar.export.scope.auto': 'Seleção ou visão atual',
8354
8644
  'toolbar.export.scope.selected': 'Linhas selecionadas',
@@ -9453,6 +9743,7 @@ const PRAXIS_TABLE_EDITOR_I18N_CONFIG = {
9453
9743
  'toolbar.export.fileName': 'Default file name',
9454
9744
  'toolbar.export.fileName.placeholder': 'data-export',
9455
9745
  'toolbar.export.includeHeaders': 'Include headers',
9746
+ 'toolbar.export.visibleCurrentPage': 'Show current-page Excel',
9456
9747
  'toolbar.export.scope': 'Export scope',
9457
9748
  'toolbar.export.scope.auto': 'Selection or current view',
9458
9749
  'toolbar.export.scope.selected': 'Selected rows',
@@ -19595,6 +19886,7 @@ class ToolbarActionsEditorComponent {
19595
19886
  exportFormats: [['excel', 'csv']],
19596
19887
  exportFileName: [this.tx('toolbar.export.fileName.placeholder', 'data-export')],
19597
19888
  exportIncludeHeaders: [true],
19889
+ exportVisibleCurrentPage: [true],
19598
19890
  exportScope: ['auto'],
19599
19891
  exportMaxRows: [10000],
19600
19892
  });
@@ -19645,6 +19937,7 @@ class ToolbarActionsEditorComponent {
19645
19937
  exportFileName: v2Config.export.general?.defaultFileName ||
19646
19938
  this.tx('toolbar.export.fileName.placeholder', 'data-export'),
19647
19939
  exportIncludeHeaders: v2Config.export.general?.includeHeaders !== false,
19940
+ exportVisibleCurrentPage: v2Config.export.excel?.visibleCurrentPage !== false,
19648
19941
  exportScope: v2Config.export.general?.scope || 'auto',
19649
19942
  exportMaxRows: v2Config.export.general?.maxRows || 10000,
19650
19943
  });
@@ -19870,6 +20163,15 @@ class ToolbarActionsEditorComponent {
19870
20163
  v2Config.export = {
19871
20164
  enabled: values.exportEnabled,
19872
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
+ },
19873
20175
  general: {
19874
20176
  includeHeaders: values.exportIncludeHeaders,
19875
20177
  scope: values.exportScope || 'auto',
@@ -22381,6 +22683,12 @@ class ToolbarActionsEditorComponent {
22381
22683
  >
22382
22684
  {{ tx('toolbar.export.includeHeaders', 'Include headers') }}
22383
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>
22384
22692
  <mat-form-field appearance="outline">
22385
22693
  <mat-label>{{ tx('toolbar.export.scope', 'Export scope') }}</mat-label>
22386
22694
  <mat-select formControlName="exportScope">
@@ -24037,6 +24345,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
24037
24345
  >
24038
24346
  {{ tx('toolbar.export.includeHeaders', 'Include headers') }}
24039
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>
24040
24354
  <mat-form-field appearance="outline">
24041
24355
  <mat-label>{{ tx('toolbar.export.scope', 'Export scope') }}</mat-label>
24042
24356
  <mat-select formControlName="exportScope">
@@ -41538,7 +41852,7 @@ class PraxisTable {
41538
41852
  if (this.aiAdapter || this.aiAdapterLoadStarted)
41539
41853
  return;
41540
41854
  this.aiAdapterLoadStarted = true;
41541
- import('./praxisui-table-table-ai.adapter-DKr77wDN.mjs')
41855
+ import('./praxisui-table-table-ai.adapter-DE5WpZ-t.mjs')
41542
41856
  .then(({ TableAiAdapter }) => {
41543
41857
  if (!this.isAiAssistantEnabled()) {
41544
41858
  this.aiAssistantOpenAfterAdapterLoad = false;
@@ -47308,8 +47622,13 @@ class PraxisTable {
47308
47622
  this.exportStatusMessage = translateTableRuntimeText(this.i18n, 'table.export.processing', 'Exportando dados...');
47309
47623
  this.cdr.markForCheck();
47310
47624
  try {
47311
- const request = this.buildTableExportRequest(format, scopeOverride);
47312
- const result = await this.collectionExport.exportCollection(request);
47625
+ const localVisibleExcelExport = event?.localOnly === true && format === 'excel';
47626
+ const request = localVisibleExcelExport
47627
+ ? this.buildVisibleExcelExportRequest()
47628
+ : this.buildTableExportRequest(format, scopeOverride);
47629
+ const result = localVisibleExcelExport
47630
+ ? this.collectionExport.exportLocalCollection(request)
47631
+ : await this.collectionExport.exportCollection(request);
47313
47632
  assertPraxisCollectionExportArtifact(result);
47314
47633
  this.exportAction.emit({
47315
47634
  format,
@@ -47409,6 +47728,52 @@ class PraxisTable {
47409
47728
  },
47410
47729
  };
47411
47730
  }
47731
+ buildVisibleExcelExportRequest() {
47732
+ const request = this.buildTableExportRequest('excel', 'currentPage');
47733
+ return {
47734
+ ...request,
47735
+ scope: 'currentPage',
47736
+ resourcePath: undefined,
47737
+ loadedItems: this.resolveTableExportLoadedItems('currentPage'),
47738
+ fields: this.buildTableExportFields('visible', true),
47739
+ includeHeaders: true,
47740
+ applyFormatting: true,
47741
+ maxRows: undefined,
47742
+ fileName: this.resolveVisibleExcelExportFileName(),
47743
+ formatOptions: {
47744
+ ...request.formatOptions,
47745
+ excel: {
47746
+ ...request.formatOptions?.excel,
47747
+ sheetName: request.formatOptions?.excel?.sheetName || this.tableId || this.componentInstanceId || 'Export',
47748
+ freezeHeaders: request.formatOptions?.excel?.freezeHeaders ?? true,
47749
+ autoFitColumns: request.formatOptions?.excel?.autoFitColumns ?? true,
47750
+ },
47751
+ },
47752
+ metadata: {
47753
+ ...request.metadata,
47754
+ exportMode: 'visible-local',
47755
+ configuredScope: request.scope,
47756
+ effectiveScope: 'currentPage',
47757
+ },
47758
+ };
47759
+ }
47760
+ resolveVisibleExcelExportFileName() {
47761
+ const baseName = String(this.config?.export?.general?.defaultFileName
47762
+ || this.tableId
47763
+ || this.componentInstanceId
47764
+ || 'praxis-table')
47765
+ .trim()
47766
+ .replace(/[\\/:*?"<>|]+/g, '-')
47767
+ .replace(/\s+/g, '-')
47768
+ || 'praxis-table';
47769
+ return `${baseName}_visivel_${this.formatExportDate(new Date())}`;
47770
+ }
47771
+ formatExportDate(date) {
47772
+ const year = date.getFullYear();
47773
+ const month = String(date.getMonth() + 1).padStart(2, '0');
47774
+ const day = String(date.getDate()).padStart(2, '0');
47775
+ return `${year}-${month}-${day}`;
47776
+ }
47412
47777
  resolveEffectiveExportScope(scope) {
47413
47778
  if (scope !== 'auto') {
47414
47779
  return scope;
@@ -47616,11 +47981,11 @@ class PraxisTable {
47616
47981
  }
47617
47982
  showExportFeedback(result) {
47618
47983
  if (result.status === 'deferred') {
47619
- 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.');
47620
47985
  this.snackBar.open(this.exportStatusMessage, undefined, { duration: 3000 });
47621
47986
  return;
47622
47987
  }
47623
- this.exportStatusMessage = translateTableRuntimeText(this.i18n, 'table.export.completed', 'Exportacao concluida.');
47988
+ this.exportStatusMessage = translateTableRuntimeText(this.i18n, 'table.export.completed', 'Exportação concluída.');
47624
47989
  this.snackBar.open(this.exportStatusMessage, undefined, { duration: 2500 });
47625
47990
  }
47626
47991
  onAdvancedFilterSubmit(criteria) {
@@ -57156,7 +57521,10 @@ const tableExportSchema = {
57156
57521
  },
57157
57522
  excel: {
57158
57523
  type: 'object',
57159
- properties: { autoFitColumns: { type: 'boolean' } }
57524
+ properties: {
57525
+ autoFitColumns: { type: 'boolean' },
57526
+ visibleCurrentPage: { type: 'boolean' }
57527
+ }
57160
57528
  },
57161
57529
  pdf: {
57162
57530
  type: 'object',
@@ -62278,6 +62646,7 @@ const TABLE_AI_CAPABILITIES = {
62278
62646
  { path: 'export.general.includeHeaders', category: 'export', valueKind: 'boolean', description: 'Inclui cabeçalhos no arquivo exportado.', intentExamples: ['incluir cabeçalho no excel'] },
62279
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"' },
62280
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.' },
62281
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'] },
62282
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'] },
62283
62652
  { path: 'export.pdf.pageSize', category: 'export', valueKind: 'enum', allowedValues: ENUMS.pdfPageSize, description: 'Tamanho da página no PDF.', dependsOn: 'export.enabled' },