@praxisui/tabs 9.0.0-beta.9 → 9.0.0-beta.90

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.
@@ -10,7 +10,7 @@ import { MatIconModule } from '@angular/material/icon';
10
10
  import * as i10 from '@angular/material/tooltip';
11
11
  import { MatTooltipModule } from '@angular/material/tooltip';
12
12
  import * as i1 from '@praxisui/core';
13
- import { providePraxisI18n, PraxisI18nService, PraxisIconDirective, providePraxisI18nConfig, deepMerge, ASYNC_CONFIG_STORAGE, ComponentKeyService, LoggerService, EmptyStateCardComponent, DynamicWidgetLoaderDirective, ComponentMetadataRegistry } from '@praxisui/core';
13
+ import { providePraxisI18n, PraxisI18nService, PraxisIconDirective, PraxisIconButtonComponent, providePraxisI18nConfig, deepMerge, ASYNC_CONFIG_STORAGE, ComponentKeyService, LoggerService, EmptyStateCardComponent, DynamicWidgetLoaderDirective, ComponentMetadataRegistry } from '@praxisui/core';
14
14
  import * as i6 from '@angular/material/button';
15
15
  import { MatButtonModule } from '@angular/material/button';
16
16
  import * as i2_1 from '@angular/forms';
@@ -273,6 +273,12 @@ const PRAXIS_TABS_PT_BR = {
273
273
  'editor.actions.addTab': 'Adicionar aba',
274
274
  'editor.actions.addLink': 'Adicionar link',
275
275
  'editor.actions.add': 'Adicionar',
276
+ 'editor.actions.moveTabUp': 'Mover aba para cima',
277
+ 'editor.actions.moveTabDown': 'Mover aba para baixo',
278
+ 'editor.actions.removeTab': 'Remover aba',
279
+ 'editor.actions.moveLinkUp': 'Mover link para cima',
280
+ 'editor.actions.moveLinkDown': 'Mover link para baixo',
281
+ 'editor.actions.removeLink': 'Remover link',
276
282
  'editor.actions.removeLabel': 'Remover rótulo',
277
283
  'editor.actions.dragToReorder': 'Arrastar para reordenar',
278
284
  'editor.actions.removeComponent': 'Remover componente',
@@ -364,6 +370,7 @@ const PRAXIS_TABS_PT_BR = {
364
370
  'editor.toggles.disablePagination': 'Sem paginação',
365
371
  'editor.toggles.disableRipple': 'Sem ripple',
366
372
  'editor.toggles.preserveContent': 'Preservar conteúdo',
373
+ 'editor.toggles.renderBody': 'Renderizar conteúdo interno',
367
374
  'editor.toggles.stretchTabs': 'Esticar abas',
368
375
  'editor.toggles.highContrast': 'Alto contraste',
369
376
  'editor.toggles.reduceMotion': 'Reduzir movimento',
@@ -418,6 +425,12 @@ const PRAXIS_TABS_EN_US = {
418
425
  'editor.actions.addTab': 'Add tab',
419
426
  'editor.actions.addLink': 'Add link',
420
427
  'editor.actions.add': 'Add',
428
+ 'editor.actions.moveTabUp': 'Move tab up',
429
+ 'editor.actions.moveTabDown': 'Move tab down',
430
+ 'editor.actions.removeTab': 'Remove tab',
431
+ 'editor.actions.moveLinkUp': 'Move link up',
432
+ 'editor.actions.moveLinkDown': 'Move link down',
433
+ 'editor.actions.removeLink': 'Remove link',
421
434
  'editor.actions.removeLabel': 'Remove label',
422
435
  'editor.actions.dragToReorder': 'Drag to reorder',
423
436
  'editor.actions.removeComponent': 'Remove component',
@@ -509,6 +522,7 @@ const PRAXIS_TABS_EN_US = {
509
522
  'editor.toggles.disablePagination': 'Disable pagination',
510
523
  'editor.toggles.disableRipple': 'Disable ripple',
511
524
  'editor.toggles.preserveContent': 'Preserve content',
525
+ 'editor.toggles.renderBody': 'Render internal content',
512
526
  'editor.toggles.stretchTabs': 'Stretch tabs',
513
527
  'editor.toggles.highContrast': 'High contrast',
514
528
  'editor.toggles.reduceMotion': 'Reduce motion',
@@ -1044,28 +1058,26 @@ class PraxisTabsConfigEditor {
1044
1058
  <mat-form-field appearance="outline"><mat-label>{{ t('editor.fields.selectedIndex', 'Indice selecionado') }}</mat-label>
1045
1059
  <input matInput type="number" [(ngModel)]="group.selectedIndex" (ngModelChange)="onAppearanceChange()" />
1046
1060
  <button
1047
- mat-icon-button
1061
+ praxisIconButton="help_outline"
1062
+ size="dense"
1048
1063
  matSuffix
1049
- class="help-icon-button"
1050
1064
  type="button"
1051
1065
  [matTooltip]="t('editor.hints.selectedIndex', 'selectedIndex')"
1066
+ [attr.aria-label]="t('editor.hints.selectedIndex', 'selectedIndex')"
1052
1067
  matTooltipPosition="above"
1053
- >
1054
- <mat-icon [praxisIcon]="'help_outline'"></mat-icon>
1055
- </button>
1068
+ ></button>
1056
1069
  </mat-form-field>
1057
1070
  <mat-form-field appearance="outline"><mat-label>{{ t('editor.fields.animationDuration', 'Duracao da animacao') }}</mat-label>
1058
1071
  <input matInput [(ngModel)]="group.animationDuration" (ngModelChange)="onAppearanceChange()" [placeholder]="t('editor.fields.placeholder.animationDuration', '500ms')" />
1059
1072
  <button
1060
- mat-icon-button
1073
+ praxisIconButton="help_outline"
1074
+ size="dense"
1061
1075
  matSuffix
1062
- class="help-icon-button"
1063
1076
  type="button"
1064
1077
  [matTooltip]="t('editor.hints.animationDuration', 'animationDuration')"
1078
+ [attr.aria-label]="t('editor.hints.animationDuration', 'animationDuration')"
1065
1079
  matTooltipPosition="above"
1066
- >
1067
- <mat-icon [praxisIcon]="'help_outline'"></mat-icon>
1068
- </button>
1080
+ ></button>
1069
1081
  </mat-form-field>
1070
1082
  <mat-form-field appearance="outline"><mat-label>{{ t('editor.fields.color', 'Cor (M2)') }}</mat-label>
1071
1083
  <select matNativeControl [(ngModel)]="group.color" (ngModelChange)="onAppearanceChange()">
@@ -1075,15 +1087,14 @@ class PraxisTabsConfigEditor {
1075
1087
  <option value="warn">{{ t('editor.options.warn', 'Warn') }}</option>
1076
1088
  </select>
1077
1089
  <button
1078
- mat-icon-button
1090
+ praxisIconButton="help_outline"
1091
+ size="dense"
1079
1092
  matSuffix
1080
- class="help-icon-button"
1081
1093
  type="button"
1082
1094
  [matTooltip]="t('editor.hints.preferTokens', 'Preferir tokens em Estilo.')"
1095
+ [attr.aria-label]="t('editor.hints.preferTokens', 'Preferir tokens em Estilo.')"
1083
1096
  matTooltipPosition="above"
1084
- >
1085
- <mat-icon [praxisIcon]="'help_outline'"></mat-icon>
1086
- </button>
1097
+ ></button>
1087
1098
  </mat-form-field>
1088
1099
  <mat-form-field appearance="outline"><mat-label>{{ t('editor.fields.backgroundColor', 'Cor de fundo (M2)') }}</mat-label>
1089
1100
  <select matNativeControl [(ngModel)]="group.backgroundColor" (ngModelChange)="onAppearanceChange()">
@@ -1093,15 +1104,14 @@ class PraxisTabsConfigEditor {
1093
1104
  <option value="warn">{{ t('editor.options.warn', 'Warn') }}</option>
1094
1105
  </select>
1095
1106
  <button
1096
- mat-icon-button
1107
+ praxisIconButton="help_outline"
1108
+ size="dense"
1097
1109
  matSuffix
1098
- class="help-icon-button"
1099
1110
  type="button"
1100
1111
  [matTooltip]="t('editor.hints.preferTokens', 'Preferir tokens em Estilo.')"
1112
+ [attr.aria-label]="t('editor.hints.preferTokens', 'Preferir tokens em Estilo.')"
1101
1113
  matTooltipPosition="above"
1102
- >
1103
- <mat-icon [praxisIcon]="'help_outline'"></mat-icon>
1104
- </button>
1114
+ ></button>
1105
1115
  </mat-form-field>
1106
1116
  <mat-form-field appearance="outline"><mat-label>{{ t('editor.fields.ariaLabel', 'aria-label') }}</mat-label>
1107
1117
  <input matInput [(ngModel)]="group.ariaLabel" (ngModelChange)="onAppearanceChange()" />
@@ -1116,6 +1126,7 @@ class PraxisTabsConfigEditor {
1116
1126
  <mat-slide-toggle [(ngModel)]="group.disablePagination" (ngModelChange)="onAppearanceChange()">{{ t('editor.toggles.disablePagination', 'Sem paginacao') }}</mat-slide-toggle>
1117
1127
  <mat-slide-toggle [(ngModel)]="group.disableRipple" (ngModelChange)="onAppearanceChange()">{{ t('editor.toggles.disableRipple', 'Sem ripple') }}</mat-slide-toggle>
1118
1128
  <mat-slide-toggle [(ngModel)]="group.preserveContent" (ngModelChange)="onAppearanceChange()">{{ t('editor.toggles.preserveContent', 'Preservar conteudo') }}</mat-slide-toggle>
1129
+ <mat-slide-toggle [ngModel]="group.renderBody !== false" (ngModelChange)="group.renderBody = $event ? undefined : false; onAppearanceChange()">{{ t('editor.toggles.renderBody', 'Renderizar conteudo interno') }}</mat-slide-toggle>
1119
1130
  <mat-slide-toggle [(ngModel)]="group.stretchTabs" (ngModelChange)="onAppearanceChange()">{{ t('editor.toggles.stretchTabs', 'Esticar abas') }}</mat-slide-toggle>
1120
1131
  </div>
1121
1132
  </div>
@@ -1127,28 +1138,26 @@ class PraxisTabsConfigEditor {
1127
1138
  <mat-form-field appearance="outline"><mat-label>{{ t('editor.fields.selectedIndex', 'Indice selecionado') }}</mat-label>
1128
1139
  <input matInput type="number" [(ngModel)]="nav.selectedIndex" (ngModelChange)="onAppearanceChange()" />
1129
1140
  <button
1130
- mat-icon-button
1141
+ praxisIconButton="help_outline"
1142
+ size="dense"
1131
1143
  matSuffix
1132
- class="help-icon-button"
1133
1144
  type="button"
1134
1145
  [matTooltip]="t('editor.hints.selectedIndex', 'selectedIndex')"
1146
+ [attr.aria-label]="t('editor.hints.selectedIndex', 'selectedIndex')"
1135
1147
  matTooltipPosition="above"
1136
- >
1137
- <mat-icon [praxisIcon]="'help_outline'"></mat-icon>
1138
- </button>
1148
+ ></button>
1139
1149
  </mat-form-field>
1140
1150
  <mat-form-field appearance="outline"><mat-label>{{ t('editor.fields.animationDuration', 'Duracao da animacao') }}</mat-label>
1141
1151
  <input matInput [(ngModel)]="nav.animationDuration" (ngModelChange)="onAppearanceChange()" [placeholder]="t('editor.fields.placeholder.animationDuration', '500ms')" />
1142
1152
  <button
1143
- mat-icon-button
1153
+ praxisIconButton="help_outline"
1154
+ size="dense"
1144
1155
  matSuffix
1145
- class="help-icon-button"
1146
1156
  type="button"
1147
1157
  [matTooltip]="t('editor.hints.animationDuration', 'animationDuration')"
1158
+ [attr.aria-label]="t('editor.hints.animationDuration', 'animationDuration')"
1148
1159
  matTooltipPosition="above"
1149
- >
1150
- <mat-icon [praxisIcon]="'help_outline'"></mat-icon>
1151
- </button>
1160
+ ></button>
1152
1161
  </mat-form-field>
1153
1162
  <mat-form-field appearance="outline"><mat-label>{{ t('editor.fields.ariaLabel', 'aria-label') }}</mat-label>
1154
1163
  <input matInput [(ngModel)]="nav.ariaLabel" (ngModelChange)="onAppearanceChange()" />
@@ -1164,15 +1173,14 @@ class PraxisTabsConfigEditor {
1164
1173
  <option value="warn">{{ t('editor.options.warn', 'Warn') }}</option>
1165
1174
  </select>
1166
1175
  <button
1167
- mat-icon-button
1176
+ praxisIconButton="help_outline"
1177
+ size="dense"
1168
1178
  matSuffix
1169
- class="help-icon-button"
1170
1179
  type="button"
1171
1180
  [matTooltip]="t('editor.hints.preferTokens', 'Preferir tokens em Estilo.')"
1181
+ [attr.aria-label]="t('editor.hints.preferTokens', 'Preferir tokens em Estilo.')"
1172
1182
  matTooltipPosition="above"
1173
- >
1174
- <mat-icon [praxisIcon]="'help_outline'"></mat-icon>
1175
- </button>
1183
+ ></button>
1176
1184
  </mat-form-field>
1177
1185
  <mat-form-field appearance="outline"><mat-label>{{ t('editor.fields.backgroundColor', 'Cor de fundo (M2)') }}</mat-label>
1178
1186
  <select matNativeControl [(ngModel)]="nav.backgroundColor" (ngModelChange)="onAppearanceChange()">
@@ -1182,21 +1190,21 @@ class PraxisTabsConfigEditor {
1182
1190
  <option value="warn">{{ t('editor.options.warn', 'Warn') }}</option>
1183
1191
  </select>
1184
1192
  <button
1185
- mat-icon-button
1193
+ praxisIconButton="help_outline"
1194
+ size="dense"
1186
1195
  matSuffix
1187
- class="help-icon-button"
1188
1196
  type="button"
1189
1197
  [matTooltip]="t('editor.hints.preferTokens', 'Preferir tokens em Estilo.')"
1198
+ [attr.aria-label]="t('editor.hints.preferTokens', 'Preferir tokens em Estilo.')"
1190
1199
  matTooltipPosition="above"
1191
- >
1192
- <mat-icon [praxisIcon]="'help_outline'"></mat-icon>
1193
- </button>
1200
+ ></button>
1194
1201
  </mat-form-field>
1195
1202
  </div>
1196
1203
  <div class="editor-row">
1197
1204
  <mat-slide-toggle [(ngModel)]="nav.fitInkBarToContent" (ngModelChange)="onAppearanceChange()">{{ t('editor.toggles.fitInkBarToContent', 'Indicador ajustado ao conteudo') }}</mat-slide-toggle>
1198
1205
  <mat-slide-toggle [(ngModel)]="nav.disablePagination" (ngModelChange)="onAppearanceChange()">{{ t('editor.toggles.disablePagination', 'Sem paginacao') }}</mat-slide-toggle>
1199
1206
  <mat-slide-toggle [(ngModel)]="nav.disableRipple" (ngModelChange)="onAppearanceChange()">{{ t('editor.toggles.disableRipple', 'Sem ripple') }}</mat-slide-toggle>
1207
+ <mat-slide-toggle [ngModel]="nav.renderBody !== false" (ngModelChange)="nav.renderBody = $event ? undefined : false; onAppearanceChange()">{{ t('editor.toggles.renderBody', 'Renderizar conteudo interno') }}</mat-slide-toggle>
1200
1208
  <mat-slide-toggle [(ngModel)]="nav.stretchTabs" (ngModelChange)="onAppearanceChange()">{{ t('editor.toggles.stretchTabs', 'Esticar abas') }}</mat-slide-toggle>
1201
1209
  </div>
1202
1210
  </div>
@@ -1275,14 +1283,13 @@ class PraxisTabsConfigEditor {
1275
1283
  <div class="editor-title-row">
1276
1284
  <h3 class="editor-title">{{ t('editor.sections.tokens', 'Tokens (Material 3)') }}</h3>
1277
1285
  <button
1278
- mat-icon-button
1279
- class="help-icon-button"
1286
+ praxisIconButton="help_outline"
1287
+ size="dense"
1280
1288
  type="button"
1281
1289
  [matTooltip]="t('editor.hints.tokenValueHelp', 'Valores aceitam CSS vars ou cores hex/rgb.')"
1290
+ [attr.aria-label]="t('editor.hints.tokenValueHelp', 'Valores aceitam CSS vars ou cores hex/rgb.')"
1282
1291
  matTooltipPosition="above"
1283
- >
1284
- <mat-icon [praxisIcon]="'help_outline'"></mat-icon>
1285
- </button>
1292
+ ></button>
1286
1293
  </div>
1287
1294
  <div class="editor-grid two">
1288
1295
  @for (token of tokenList; track token) {
@@ -1321,9 +1328,9 @@ class PraxisTabsConfigEditor {
1321
1328
  <div class="editor-card">
1322
1329
  <div class="editor-card-header">
1323
1330
  <strong class="editor-card-title">{{ t('editor.cards.tab', 'Aba') }} #{{ i+1 }}</strong>
1324
- <button mat-icon-button (click)="moveTab(i, -1)" [disabled]="i===0"><mat-icon [praxisIcon]="'arrow_upward'"></mat-icon></button>
1325
- <button mat-icon-button (click)="moveTab(i, 1)" [disabled]="i===editedConfig.tabs!.length-1"><mat-icon [praxisIcon]="'arrow_downward'"></mat-icon></button>
1326
- <button mat-icon-button color="warn" (click)="removeTab(i)"><mat-icon [praxisIcon]="'delete'"></mat-icon></button>
1331
+ <button praxisIconButton="arrow_upward" size="compact" type="button" (click)="moveTab(i, -1)" [disabled]="i===0" [matTooltip]="t('editor.actions.moveTabUp', 'Mover aba para cima')" [attr.aria-label]="t('editor.actions.moveTabUp', 'Mover aba para cima')"></button>
1332
+ <button praxisIconButton="arrow_downward" size="compact" type="button" (click)="moveTab(i, 1)" [disabled]="i===editedConfig.tabs!.length-1" [matTooltip]="t('editor.actions.moveTabDown', 'Mover aba para baixo')" [attr.aria-label]="t('editor.actions.moveTabDown', 'Mover aba para baixo')"></button>
1333
+ <button praxisIconButton="delete" size="compact" type="button" class="editor-icon-action--danger" (click)="removeTab(i)" [matTooltip]="t('editor.actions.removeTab', 'Remover aba')" [attr.aria-label]="t('editor.actions.removeTab', 'Remover aba')"></button>
1327
1334
  </div>
1328
1335
  <div class="editor-grid two tight">
1329
1336
  <mat-form-field appearance="outline"><mat-label>{{ t('editor.fields.id', 'ID') }}</mat-label>
@@ -1379,11 +1386,9 @@ class PraxisTabsConfigEditor {
1379
1386
  @for (w of tab.widgets; track w; let wi = $index) {
1380
1387
  <div cdkDrag class="editor-card dashed">
1381
1388
  <div class="editor-card-header">
1382
- <button mat-icon-button cdkDragHandle [matTooltip]="t('editor.actions.dragToReorder', 'Arrastar para reordenar')" [attr.aria-label]="t('editor.actions.dragToReorder', 'Arrastar para reordenar')">
1383
- <mat-icon [praxisIcon]="'drag_indicator'"></mat-icon>
1384
- </button>
1389
+ <button praxisIconButton="drag_indicator" size="compact" type="button" cdkDragHandle [matTooltip]="t('editor.actions.dragToReorder', 'Arrastar para reordenar')" [attr.aria-label]="t('editor.actions.dragToReorder', 'Arrastar para reordenar')"></button>
1385
1390
  <strong class="editor-card-title">{{ getCompName(w.id) }}</strong>
1386
- <button mat-icon-button color="warn" (click)="removeWidgetFromTab(i, wi)" [matTooltip]="t('editor.actions.removeComponent', 'Remover componente')" [attr.aria-label]="t('editor.actions.removeComponent', 'Remover componente')"><mat-icon [praxisIcon]="'delete'"></mat-icon></button>
1391
+ <button praxisIconButton="delete" size="compact" type="button" class="editor-icon-action--danger" (click)="removeWidgetFromTab(i, wi)" [matTooltip]="t('editor.actions.removeComponent', 'Remover componente')" [attr.aria-label]="t('editor.actions.removeComponent', 'Remover componente')"></button>
1387
1392
  </div>
1388
1393
  <div class="editor-grid two tight">
1389
1394
  <mat-form-field appearance="outline">
@@ -1427,9 +1432,9 @@ class PraxisTabsConfigEditor {
1427
1432
  <div class="editor-card">
1428
1433
  <div class="editor-card-header">
1429
1434
  <strong class="editor-card-title">{{ t('editor.cards.link', 'Link') }} #{{ i+1 }}</strong>
1430
- <button mat-icon-button (click)="moveLink(i, -1)" [disabled]="i===0"><mat-icon [praxisIcon]="'arrow_upward'"></mat-icon></button>
1431
- <button mat-icon-button (click)="moveLink(i, 1)" [disabled]="i===nav.links!.length-1"><mat-icon [praxisIcon]="'arrow_downward'"></mat-icon></button>
1432
- <button mat-icon-button color="warn" (click)="removeLink(i)"><mat-icon [praxisIcon]="'delete'"></mat-icon></button>
1435
+ <button praxisIconButton="arrow_upward" size="compact" type="button" (click)="moveLink(i, -1)" [disabled]="i===0" [matTooltip]="t('editor.actions.moveLinkUp', 'Mover link para cima')" [attr.aria-label]="t('editor.actions.moveLinkUp', 'Mover link para cima')"></button>
1436
+ <button praxisIconButton="arrow_downward" size="compact" type="button" (click)="moveLink(i, 1)" [disabled]="i===nav.links!.length-1" [matTooltip]="t('editor.actions.moveLinkDown', 'Mover link para baixo')" [attr.aria-label]="t('editor.actions.moveLinkDown', 'Mover link para baixo')"></button>
1437
+ <button praxisIconButton="delete" size="compact" type="button" class="editor-icon-action--danger" (click)="removeLink(i)" [matTooltip]="t('editor.actions.removeLink', 'Remover link')" [attr.aria-label]="t('editor.actions.removeLink', 'Remover link')"></button>
1433
1438
  </div>
1434
1439
  <div class="editor-grid two tight">
1435
1440
  <mat-form-field appearance="outline"><mat-label>{{ t('editor.fields.id', 'ID') }}</mat-label>
@@ -1475,11 +1480,9 @@ class PraxisTabsConfigEditor {
1475
1480
  @for (w of l.widgets; track w; let wi = $index) {
1476
1481
  <div cdkDrag class="editor-card dashed">
1477
1482
  <div class="editor-card-header">
1478
- <button mat-icon-button cdkDragHandle [matTooltip]="t('editor.actions.dragToReorder', 'Arrastar para reordenar')" [attr.aria-label]="t('editor.actions.dragToReorder', 'Arrastar para reordenar')">
1479
- <mat-icon [praxisIcon]="'drag_indicator'"></mat-icon>
1480
- </button>
1483
+ <button praxisIconButton="drag_indicator" size="compact" type="button" cdkDragHandle [matTooltip]="t('editor.actions.dragToReorder', 'Arrastar para reordenar')" [attr.aria-label]="t('editor.actions.dragToReorder', 'Arrastar para reordenar')"></button>
1481
1484
  <strong class="editor-card-title">{{ getCompName(w.id) }}</strong>
1482
- <button mat-icon-button color="warn" (click)="removeWidgetFromLink(i, wi)" [matTooltip]="t('editor.actions.removeComponent', 'Remover componente')" [attr.aria-label]="t('editor.actions.removeComponent', 'Remover componente')"><mat-icon [praxisIcon]="'delete'"></mat-icon></button>
1485
+ <button praxisIconButton="delete" size="compact" type="button" class="editor-icon-action--danger" (click)="removeWidgetFromLink(i, wi)" [matTooltip]="t('editor.actions.removeComponent', 'Remover componente')" [attr.aria-label]="t('editor.actions.removeComponent', 'Remover componente')"></button>
1483
1486
  </div>
1484
1487
  <div class="editor-grid two tight">
1485
1488
  <mat-form-field appearance="outline">
@@ -1506,7 +1509,7 @@ class PraxisTabsConfigEditor {
1506
1509
  </mat-tab>
1507
1510
  </mat-tab-group>
1508
1511
  </div>
1509
- `, isInline: true, styles: [":host{display:block;color:var(--md-sys-color-on-surface)}.editor-shell{display:grid;gap:12px}.editor-topbar{display:flex;align-items:start;justify-content:flex-start}.editor-mode-field{width:min(320px,100%)}.editor-diagnostics{display:grid;gap:8px}.editor-diagnostics-title{font-size:.95rem;font-weight:600;color:var(--md-sys-color-on-surface)}.editor-diagnostic{display:grid;gap:4px;padding:10px 12px;border-radius:10px;border:1px solid var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface-container);color:var(--md-sys-color-on-surface)}.editor-diagnostic code{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;color:var(--md-sys-color-on-surface-variant)}.editor-diagnostic.level-error{background:var(--md-sys-color-error-container);color:var(--md-sys-color-on-error-container);border-color:var(--md-sys-color-error)}.editor-diagnostic.level-warning{background:var(--md-sys-color-tertiary-container, var(--md-sys-color-surface-container));color:var(--md-sys-color-on-tertiary-container, var(--md-sys-color-on-surface));border-color:var(--md-sys-color-outline-variant)}.editor-tabs{--editor-surface: var(--md-sys-color-surface-container-lowest, var(--md-sys-color-surface));--editor-border: 1px solid var(--md-sys-color-outline-variant);--editor-radius: 12px;--editor-muted: var(--md-sys-color-on-surface-variant)}.editor-section{padding:12px;display:grid;gap:12px;background:var(--editor-surface);border:var(--editor-border);border-radius:var(--editor-radius)}.editor-section-lg{gap:16px}.editor-row{display:flex;gap:10px;flex-wrap:wrap;align-items:center}.editor-grid{display:grid;gap:12px}.editor-grid.two{grid-template-columns:repeat(auto-fit,minmax(220px,1fr))}.editor-grid.tight{gap:8px}.editor-toolbar{display:flex;gap:8px;flex-wrap:wrap;align-items:center}.editor-muted{color:var(--editor-muted)}.editor-title{margin:6px 0 8px;font-size:1rem}.editor-title-row{display:flex;align-items:center;gap:8px}.editor-code{white-space:pre-wrap;background:var(--md-sys-color-surface-container);padding:8px;border-radius:6px;border:1px solid var(--md-sys-color-outline-variant)}.editor-card{border:1px solid var(--md-sys-color-outline-variant);padding:10px;border-radius:10px;display:grid;gap:8px;background:var(--md-sys-color-surface)}.editor-card.dashed{border-style:dashed}.editor-card-header{display:flex;align-items:center;gap:8px}.editor-card-title{flex:1;font-weight:600}.editor-divider{border-top:1px solid var(--md-sys-color-outline-variant);padding-top:8px}.editor-spacer{flex:1}.editor-field-min{min-width:260px}.editor-section .editor-field-min{width:260px;max-width:260px}.editor-field-240{width:240px}.editor-section .editor-field-240{width:240px;max-width:240px}.editor-json{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.editor-section .mat-mdc-form-field{width:100%;max-width:520px;--mdc-outlined-text-field-container-height: 48px;--mdc-outlined-text-field-outline-color: var(--md-sys-color-outline-variant);--mdc-outlined-text-field-hover-outline-color: var(--md-sys-color-outline);--mdc-outlined-text-field-focus-outline-color: var(--md-sys-color-primary);--mdc-outlined-text-field-error-outline-color: var(--md-sys-color-error);--mdc-outlined-text-field-error-focus-outline-color: var(--md-sys-color-error);--mdc-outlined-text-field-error-hover-outline-color: var(--md-sys-color-error);--mdc-outlined-text-field-label-text-color: var(--md-sys-color-on-surface-variant);--mdc-outlined-text-field-input-text-color: var(--md-sys-color-on-surface);--mdc-outlined-text-field-supporting-text-color: var(--md-sys-color-on-surface-variant)}.editor-section .mat-mdc-form-field.full{max-width:none}.help-icon-button{--mdc-icon-button-state-layer-size: 28px;--mdc-icon-button-icon-size: 18px;width:28px;height:28px;padding:0;display:inline-flex;align-items:center;justify-content:center;margin-right:-4px}.help-icon-button mat-icon{font-size:18px;width:18px;height:18px}.mat-mdc-form-field-icon-suffix{align-self:center}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2_1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2_1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2_1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2_1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i2_1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2_1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2_1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatTabsModule }, { kind: "component", type: i3.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass", "id"], exportAs: ["matTab"] }, { kind: "component", type: i3.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "fitInkBarToContent", "mat-stretch-tabs", "mat-align-tabs", "dynamicHeight", "selectedIndex", "headerPosition", "animationDuration", "contentTabIndex", "disablePagination", "disableRipple", "preserveContent", "backgroundColor", "aria-label", "aria-labelledby"], outputs: ["selectedIndexChange", "focusChange", "animationDone", "selectedTabChange"], exportAs: ["matTabGroup"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i4.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i4.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4$1.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: MatButtonModule }, { kind: "component", type: i6.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: i6.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatSlideToggleModule }, { kind: "component", type: i8.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i9.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer", "cdkDropListHasAnchor"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i9.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i9.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i10.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }] });
1512
+ `, isInline: true, styles: [":host{display:block;color:var(--md-sys-color-on-surface)}.editor-shell{display:grid;gap:12px}.editor-topbar{display:flex;align-items:start;justify-content:flex-start}.editor-mode-field{width:min(320px,100%)}.editor-diagnostics{display:grid;gap:8px}.editor-diagnostics-title{font-size:.95rem;font-weight:600;color:var(--md-sys-color-on-surface)}.editor-diagnostic{display:grid;gap:4px;padding:10px 12px;border-radius:10px;border:1px solid var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface-container);color:var(--md-sys-color-on-surface)}.editor-diagnostic code{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;color:var(--md-sys-color-on-surface-variant)}.editor-diagnostic.level-error{background:var(--md-sys-color-error-container);color:var(--md-sys-color-on-error-container);border-color:var(--md-sys-color-error)}.editor-diagnostic.level-warning{background:var(--md-sys-color-tertiary-container, var(--md-sys-color-surface-container));color:var(--md-sys-color-on-tertiary-container, var(--md-sys-color-on-surface));border-color:var(--md-sys-color-outline-variant)}.editor-tabs{--editor-surface: var(--md-sys-color-surface-container-lowest, var(--md-sys-color-surface));--editor-border: 1px solid var(--md-sys-color-outline-variant);--editor-radius: 12px;--editor-muted: var(--md-sys-color-on-surface-variant)}.editor-section{padding:12px;display:grid;gap:12px;background:var(--editor-surface);border:var(--editor-border);border-radius:var(--editor-radius)}.editor-section-lg{gap:16px}.editor-row{display:flex;gap:10px;flex-wrap:wrap;align-items:center}.editor-grid{display:grid;gap:12px}.editor-grid.two{grid-template-columns:repeat(auto-fit,minmax(220px,1fr))}.editor-grid.tight{gap:8px}.editor-toolbar{display:flex;gap:8px;flex-wrap:wrap;align-items:center}.editor-muted{color:var(--editor-muted)}.editor-title{margin:6px 0 8px;font-size:1rem}.editor-title-row{display:flex;align-items:center;gap:8px}.editor-code{white-space:pre-wrap;background:var(--md-sys-color-surface-container);padding:8px;border-radius:6px;border:1px solid var(--md-sys-color-outline-variant)}.editor-card{border:1px solid var(--md-sys-color-outline-variant);padding:10px;border-radius:10px;display:grid;gap:8px;background:var(--md-sys-color-surface)}.editor-card.dashed{border-style:dashed}.editor-card-header{display:flex;align-items:center;gap:8px}.editor-card-title{flex:1;font-weight:600}.editor-divider{border-top:1px solid var(--md-sys-color-outline-variant);padding-top:8px}.editor-spacer{flex:1}.editor-field-min{min-width:260px}.editor-section .editor-field-min{width:260px;max-width:260px}.editor-field-240{width:240px}.editor-section .editor-field-240{width:240px;max-width:240px}.editor-json{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.editor-section .mat-mdc-form-field{width:100%;max-width:520px;--mdc-outlined-text-field-container-height: 48px;--mdc-outlined-text-field-outline-color: var(--md-sys-color-outline-variant);--mdc-outlined-text-field-hover-outline-color: var(--md-sys-color-outline);--mdc-outlined-text-field-focus-outline-color: var(--md-sys-color-primary);--mdc-outlined-text-field-error-outline-color: var(--md-sys-color-error);--mdc-outlined-text-field-error-focus-outline-color: var(--md-sys-color-error);--mdc-outlined-text-field-error-hover-outline-color: var(--md-sys-color-error);--mdc-outlined-text-field-label-text-color: var(--md-sys-color-on-surface-variant);--mdc-outlined-text-field-input-text-color: var(--md-sys-color-on-surface);--mdc-outlined-text-field-supporting-text-color: var(--md-sys-color-on-surface-variant)}.editor-section .mat-mdc-form-field.full{max-width:none}.editor-icon-action--danger{color:var(--md-sys-color-error)}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2_1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2_1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2_1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2_1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i2_1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2_1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2_1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatTabsModule }, { kind: "component", type: i3.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass", "id"], exportAs: ["matTab"] }, { kind: "component", type: i3.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "fitInkBarToContent", "mat-stretch-tabs", "mat-align-tabs", "dynamicHeight", "selectedIndex", "headerPosition", "animationDuration", "contentTabIndex", "disablePagination", "disableRipple", "preserveContent", "backgroundColor", "aria-label", "aria-labelledby"], outputs: ["selectedIndexChange", "focusChange", "animationDone", "selectedTabChange"], exportAs: ["matTabGroup"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i4.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i4.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: PraxisIconDirective, selector: "mat-icon[praxisIcon]", inputs: ["praxisIcon"] }, { kind: "component", type: PraxisIconButtonComponent, selector: "button[praxisIconButton]", inputs: ["praxisIconButton", "size", "appearance", "presentation", "pressed", "busy"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i6.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: "ngmodule", type: MatSlideToggleModule }, { kind: "component", type: i8.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i9.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer", "cdkDropListHasAnchor"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i9.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i9.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i10.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }] });
1510
1513
  }
1511
1514
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisTabsConfigEditor, decorators: [{
1512
1515
  type: Component,
@@ -1517,6 +1520,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
1517
1520
  MatInputModule,
1518
1521
  MatIconModule,
1519
1522
  PraxisIconDirective,
1523
+ PraxisIconButtonComponent,
1520
1524
  MatButtonModule,
1521
1525
  MatSlideToggleModule,
1522
1526
  DragDropModule,
@@ -1584,28 +1588,26 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
1584
1588
  <mat-form-field appearance="outline"><mat-label>{{ t('editor.fields.selectedIndex', 'Indice selecionado') }}</mat-label>
1585
1589
  <input matInput type="number" [(ngModel)]="group.selectedIndex" (ngModelChange)="onAppearanceChange()" />
1586
1590
  <button
1587
- mat-icon-button
1591
+ praxisIconButton="help_outline"
1592
+ size="dense"
1588
1593
  matSuffix
1589
- class="help-icon-button"
1590
1594
  type="button"
1591
1595
  [matTooltip]="t('editor.hints.selectedIndex', 'selectedIndex')"
1596
+ [attr.aria-label]="t('editor.hints.selectedIndex', 'selectedIndex')"
1592
1597
  matTooltipPosition="above"
1593
- >
1594
- <mat-icon [praxisIcon]="'help_outline'"></mat-icon>
1595
- </button>
1598
+ ></button>
1596
1599
  </mat-form-field>
1597
1600
  <mat-form-field appearance="outline"><mat-label>{{ t('editor.fields.animationDuration', 'Duracao da animacao') }}</mat-label>
1598
1601
  <input matInput [(ngModel)]="group.animationDuration" (ngModelChange)="onAppearanceChange()" [placeholder]="t('editor.fields.placeholder.animationDuration', '500ms')" />
1599
1602
  <button
1600
- mat-icon-button
1603
+ praxisIconButton="help_outline"
1604
+ size="dense"
1601
1605
  matSuffix
1602
- class="help-icon-button"
1603
1606
  type="button"
1604
1607
  [matTooltip]="t('editor.hints.animationDuration', 'animationDuration')"
1608
+ [attr.aria-label]="t('editor.hints.animationDuration', 'animationDuration')"
1605
1609
  matTooltipPosition="above"
1606
- >
1607
- <mat-icon [praxisIcon]="'help_outline'"></mat-icon>
1608
- </button>
1610
+ ></button>
1609
1611
  </mat-form-field>
1610
1612
  <mat-form-field appearance="outline"><mat-label>{{ t('editor.fields.color', 'Cor (M2)') }}</mat-label>
1611
1613
  <select matNativeControl [(ngModel)]="group.color" (ngModelChange)="onAppearanceChange()">
@@ -1615,15 +1617,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
1615
1617
  <option value="warn">{{ t('editor.options.warn', 'Warn') }}</option>
1616
1618
  </select>
1617
1619
  <button
1618
- mat-icon-button
1620
+ praxisIconButton="help_outline"
1621
+ size="dense"
1619
1622
  matSuffix
1620
- class="help-icon-button"
1621
1623
  type="button"
1622
1624
  [matTooltip]="t('editor.hints.preferTokens', 'Preferir tokens em Estilo.')"
1625
+ [attr.aria-label]="t('editor.hints.preferTokens', 'Preferir tokens em Estilo.')"
1623
1626
  matTooltipPosition="above"
1624
- >
1625
- <mat-icon [praxisIcon]="'help_outline'"></mat-icon>
1626
- </button>
1627
+ ></button>
1627
1628
  </mat-form-field>
1628
1629
  <mat-form-field appearance="outline"><mat-label>{{ t('editor.fields.backgroundColor', 'Cor de fundo (M2)') }}</mat-label>
1629
1630
  <select matNativeControl [(ngModel)]="group.backgroundColor" (ngModelChange)="onAppearanceChange()">
@@ -1633,15 +1634,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
1633
1634
  <option value="warn">{{ t('editor.options.warn', 'Warn') }}</option>
1634
1635
  </select>
1635
1636
  <button
1636
- mat-icon-button
1637
+ praxisIconButton="help_outline"
1638
+ size="dense"
1637
1639
  matSuffix
1638
- class="help-icon-button"
1639
1640
  type="button"
1640
1641
  [matTooltip]="t('editor.hints.preferTokens', 'Preferir tokens em Estilo.')"
1642
+ [attr.aria-label]="t('editor.hints.preferTokens', 'Preferir tokens em Estilo.')"
1641
1643
  matTooltipPosition="above"
1642
- >
1643
- <mat-icon [praxisIcon]="'help_outline'"></mat-icon>
1644
- </button>
1644
+ ></button>
1645
1645
  </mat-form-field>
1646
1646
  <mat-form-field appearance="outline"><mat-label>{{ t('editor.fields.ariaLabel', 'aria-label') }}</mat-label>
1647
1647
  <input matInput [(ngModel)]="group.ariaLabel" (ngModelChange)="onAppearanceChange()" />
@@ -1656,6 +1656,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
1656
1656
  <mat-slide-toggle [(ngModel)]="group.disablePagination" (ngModelChange)="onAppearanceChange()">{{ t('editor.toggles.disablePagination', 'Sem paginacao') }}</mat-slide-toggle>
1657
1657
  <mat-slide-toggle [(ngModel)]="group.disableRipple" (ngModelChange)="onAppearanceChange()">{{ t('editor.toggles.disableRipple', 'Sem ripple') }}</mat-slide-toggle>
1658
1658
  <mat-slide-toggle [(ngModel)]="group.preserveContent" (ngModelChange)="onAppearanceChange()">{{ t('editor.toggles.preserveContent', 'Preservar conteudo') }}</mat-slide-toggle>
1659
+ <mat-slide-toggle [ngModel]="group.renderBody !== false" (ngModelChange)="group.renderBody = $event ? undefined : false; onAppearanceChange()">{{ t('editor.toggles.renderBody', 'Renderizar conteudo interno') }}</mat-slide-toggle>
1659
1660
  <mat-slide-toggle [(ngModel)]="group.stretchTabs" (ngModelChange)="onAppearanceChange()">{{ t('editor.toggles.stretchTabs', 'Esticar abas') }}</mat-slide-toggle>
1660
1661
  </div>
1661
1662
  </div>
@@ -1667,28 +1668,26 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
1667
1668
  <mat-form-field appearance="outline"><mat-label>{{ t('editor.fields.selectedIndex', 'Indice selecionado') }}</mat-label>
1668
1669
  <input matInput type="number" [(ngModel)]="nav.selectedIndex" (ngModelChange)="onAppearanceChange()" />
1669
1670
  <button
1670
- mat-icon-button
1671
+ praxisIconButton="help_outline"
1672
+ size="dense"
1671
1673
  matSuffix
1672
- class="help-icon-button"
1673
1674
  type="button"
1674
1675
  [matTooltip]="t('editor.hints.selectedIndex', 'selectedIndex')"
1676
+ [attr.aria-label]="t('editor.hints.selectedIndex', 'selectedIndex')"
1675
1677
  matTooltipPosition="above"
1676
- >
1677
- <mat-icon [praxisIcon]="'help_outline'"></mat-icon>
1678
- </button>
1678
+ ></button>
1679
1679
  </mat-form-field>
1680
1680
  <mat-form-field appearance="outline"><mat-label>{{ t('editor.fields.animationDuration', 'Duracao da animacao') }}</mat-label>
1681
1681
  <input matInput [(ngModel)]="nav.animationDuration" (ngModelChange)="onAppearanceChange()" [placeholder]="t('editor.fields.placeholder.animationDuration', '500ms')" />
1682
1682
  <button
1683
- mat-icon-button
1683
+ praxisIconButton="help_outline"
1684
+ size="dense"
1684
1685
  matSuffix
1685
- class="help-icon-button"
1686
1686
  type="button"
1687
1687
  [matTooltip]="t('editor.hints.animationDuration', 'animationDuration')"
1688
+ [attr.aria-label]="t('editor.hints.animationDuration', 'animationDuration')"
1688
1689
  matTooltipPosition="above"
1689
- >
1690
- <mat-icon [praxisIcon]="'help_outline'"></mat-icon>
1691
- </button>
1690
+ ></button>
1692
1691
  </mat-form-field>
1693
1692
  <mat-form-field appearance="outline"><mat-label>{{ t('editor.fields.ariaLabel', 'aria-label') }}</mat-label>
1694
1693
  <input matInput [(ngModel)]="nav.ariaLabel" (ngModelChange)="onAppearanceChange()" />
@@ -1704,15 +1703,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
1704
1703
  <option value="warn">{{ t('editor.options.warn', 'Warn') }}</option>
1705
1704
  </select>
1706
1705
  <button
1707
- mat-icon-button
1706
+ praxisIconButton="help_outline"
1707
+ size="dense"
1708
1708
  matSuffix
1709
- class="help-icon-button"
1710
1709
  type="button"
1711
1710
  [matTooltip]="t('editor.hints.preferTokens', 'Preferir tokens em Estilo.')"
1711
+ [attr.aria-label]="t('editor.hints.preferTokens', 'Preferir tokens em Estilo.')"
1712
1712
  matTooltipPosition="above"
1713
- >
1714
- <mat-icon [praxisIcon]="'help_outline'"></mat-icon>
1715
- </button>
1713
+ ></button>
1716
1714
  </mat-form-field>
1717
1715
  <mat-form-field appearance="outline"><mat-label>{{ t('editor.fields.backgroundColor', 'Cor de fundo (M2)') }}</mat-label>
1718
1716
  <select matNativeControl [(ngModel)]="nav.backgroundColor" (ngModelChange)="onAppearanceChange()">
@@ -1722,21 +1720,21 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
1722
1720
  <option value="warn">{{ t('editor.options.warn', 'Warn') }}</option>
1723
1721
  </select>
1724
1722
  <button
1725
- mat-icon-button
1723
+ praxisIconButton="help_outline"
1724
+ size="dense"
1726
1725
  matSuffix
1727
- class="help-icon-button"
1728
1726
  type="button"
1729
1727
  [matTooltip]="t('editor.hints.preferTokens', 'Preferir tokens em Estilo.')"
1728
+ [attr.aria-label]="t('editor.hints.preferTokens', 'Preferir tokens em Estilo.')"
1730
1729
  matTooltipPosition="above"
1731
- >
1732
- <mat-icon [praxisIcon]="'help_outline'"></mat-icon>
1733
- </button>
1730
+ ></button>
1734
1731
  </mat-form-field>
1735
1732
  </div>
1736
1733
  <div class="editor-row">
1737
1734
  <mat-slide-toggle [(ngModel)]="nav.fitInkBarToContent" (ngModelChange)="onAppearanceChange()">{{ t('editor.toggles.fitInkBarToContent', 'Indicador ajustado ao conteudo') }}</mat-slide-toggle>
1738
1735
  <mat-slide-toggle [(ngModel)]="nav.disablePagination" (ngModelChange)="onAppearanceChange()">{{ t('editor.toggles.disablePagination', 'Sem paginacao') }}</mat-slide-toggle>
1739
1736
  <mat-slide-toggle [(ngModel)]="nav.disableRipple" (ngModelChange)="onAppearanceChange()">{{ t('editor.toggles.disableRipple', 'Sem ripple') }}</mat-slide-toggle>
1737
+ <mat-slide-toggle [ngModel]="nav.renderBody !== false" (ngModelChange)="nav.renderBody = $event ? undefined : false; onAppearanceChange()">{{ t('editor.toggles.renderBody', 'Renderizar conteudo interno') }}</mat-slide-toggle>
1740
1738
  <mat-slide-toggle [(ngModel)]="nav.stretchTabs" (ngModelChange)="onAppearanceChange()">{{ t('editor.toggles.stretchTabs', 'Esticar abas') }}</mat-slide-toggle>
1741
1739
  </div>
1742
1740
  </div>
@@ -1815,14 +1813,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
1815
1813
  <div class="editor-title-row">
1816
1814
  <h3 class="editor-title">{{ t('editor.sections.tokens', 'Tokens (Material 3)') }}</h3>
1817
1815
  <button
1818
- mat-icon-button
1819
- class="help-icon-button"
1816
+ praxisIconButton="help_outline"
1817
+ size="dense"
1820
1818
  type="button"
1821
1819
  [matTooltip]="t('editor.hints.tokenValueHelp', 'Valores aceitam CSS vars ou cores hex/rgb.')"
1820
+ [attr.aria-label]="t('editor.hints.tokenValueHelp', 'Valores aceitam CSS vars ou cores hex/rgb.')"
1822
1821
  matTooltipPosition="above"
1823
- >
1824
- <mat-icon [praxisIcon]="'help_outline'"></mat-icon>
1825
- </button>
1822
+ ></button>
1826
1823
  </div>
1827
1824
  <div class="editor-grid two">
1828
1825
  @for (token of tokenList; track token) {
@@ -1861,9 +1858,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
1861
1858
  <div class="editor-card">
1862
1859
  <div class="editor-card-header">
1863
1860
  <strong class="editor-card-title">{{ t('editor.cards.tab', 'Aba') }} #{{ i+1 }}</strong>
1864
- <button mat-icon-button (click)="moveTab(i, -1)" [disabled]="i===0"><mat-icon [praxisIcon]="'arrow_upward'"></mat-icon></button>
1865
- <button mat-icon-button (click)="moveTab(i, 1)" [disabled]="i===editedConfig.tabs!.length-1"><mat-icon [praxisIcon]="'arrow_downward'"></mat-icon></button>
1866
- <button mat-icon-button color="warn" (click)="removeTab(i)"><mat-icon [praxisIcon]="'delete'"></mat-icon></button>
1861
+ <button praxisIconButton="arrow_upward" size="compact" type="button" (click)="moveTab(i, -1)" [disabled]="i===0" [matTooltip]="t('editor.actions.moveTabUp', 'Mover aba para cima')" [attr.aria-label]="t('editor.actions.moveTabUp', 'Mover aba para cima')"></button>
1862
+ <button praxisIconButton="arrow_downward" size="compact" type="button" (click)="moveTab(i, 1)" [disabled]="i===editedConfig.tabs!.length-1" [matTooltip]="t('editor.actions.moveTabDown', 'Mover aba para baixo')" [attr.aria-label]="t('editor.actions.moveTabDown', 'Mover aba para baixo')"></button>
1863
+ <button praxisIconButton="delete" size="compact" type="button" class="editor-icon-action--danger" (click)="removeTab(i)" [matTooltip]="t('editor.actions.removeTab', 'Remover aba')" [attr.aria-label]="t('editor.actions.removeTab', 'Remover aba')"></button>
1867
1864
  </div>
1868
1865
  <div class="editor-grid two tight">
1869
1866
  <mat-form-field appearance="outline"><mat-label>{{ t('editor.fields.id', 'ID') }}</mat-label>
@@ -1919,11 +1916,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
1919
1916
  @for (w of tab.widgets; track w; let wi = $index) {
1920
1917
  <div cdkDrag class="editor-card dashed">
1921
1918
  <div class="editor-card-header">
1922
- <button mat-icon-button cdkDragHandle [matTooltip]="t('editor.actions.dragToReorder', 'Arrastar para reordenar')" [attr.aria-label]="t('editor.actions.dragToReorder', 'Arrastar para reordenar')">
1923
- <mat-icon [praxisIcon]="'drag_indicator'"></mat-icon>
1924
- </button>
1919
+ <button praxisIconButton="drag_indicator" size="compact" type="button" cdkDragHandle [matTooltip]="t('editor.actions.dragToReorder', 'Arrastar para reordenar')" [attr.aria-label]="t('editor.actions.dragToReorder', 'Arrastar para reordenar')"></button>
1925
1920
  <strong class="editor-card-title">{{ getCompName(w.id) }}</strong>
1926
- <button mat-icon-button color="warn" (click)="removeWidgetFromTab(i, wi)" [matTooltip]="t('editor.actions.removeComponent', 'Remover componente')" [attr.aria-label]="t('editor.actions.removeComponent', 'Remover componente')"><mat-icon [praxisIcon]="'delete'"></mat-icon></button>
1921
+ <button praxisIconButton="delete" size="compact" type="button" class="editor-icon-action--danger" (click)="removeWidgetFromTab(i, wi)" [matTooltip]="t('editor.actions.removeComponent', 'Remover componente')" [attr.aria-label]="t('editor.actions.removeComponent', 'Remover componente')"></button>
1927
1922
  </div>
1928
1923
  <div class="editor-grid two tight">
1929
1924
  <mat-form-field appearance="outline">
@@ -1967,9 +1962,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
1967
1962
  <div class="editor-card">
1968
1963
  <div class="editor-card-header">
1969
1964
  <strong class="editor-card-title">{{ t('editor.cards.link', 'Link') }} #{{ i+1 }}</strong>
1970
- <button mat-icon-button (click)="moveLink(i, -1)" [disabled]="i===0"><mat-icon [praxisIcon]="'arrow_upward'"></mat-icon></button>
1971
- <button mat-icon-button (click)="moveLink(i, 1)" [disabled]="i===nav.links!.length-1"><mat-icon [praxisIcon]="'arrow_downward'"></mat-icon></button>
1972
- <button mat-icon-button color="warn" (click)="removeLink(i)"><mat-icon [praxisIcon]="'delete'"></mat-icon></button>
1965
+ <button praxisIconButton="arrow_upward" size="compact" type="button" (click)="moveLink(i, -1)" [disabled]="i===0" [matTooltip]="t('editor.actions.moveLinkUp', 'Mover link para cima')" [attr.aria-label]="t('editor.actions.moveLinkUp', 'Mover link para cima')"></button>
1966
+ <button praxisIconButton="arrow_downward" size="compact" type="button" (click)="moveLink(i, 1)" [disabled]="i===nav.links!.length-1" [matTooltip]="t('editor.actions.moveLinkDown', 'Mover link para baixo')" [attr.aria-label]="t('editor.actions.moveLinkDown', 'Mover link para baixo')"></button>
1967
+ <button praxisIconButton="delete" size="compact" type="button" class="editor-icon-action--danger" (click)="removeLink(i)" [matTooltip]="t('editor.actions.removeLink', 'Remover link')" [attr.aria-label]="t('editor.actions.removeLink', 'Remover link')"></button>
1973
1968
  </div>
1974
1969
  <div class="editor-grid two tight">
1975
1970
  <mat-form-field appearance="outline"><mat-label>{{ t('editor.fields.id', 'ID') }}</mat-label>
@@ -2015,11 +2010,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
2015
2010
  @for (w of l.widgets; track w; let wi = $index) {
2016
2011
  <div cdkDrag class="editor-card dashed">
2017
2012
  <div class="editor-card-header">
2018
- <button mat-icon-button cdkDragHandle [matTooltip]="t('editor.actions.dragToReorder', 'Arrastar para reordenar')" [attr.aria-label]="t('editor.actions.dragToReorder', 'Arrastar para reordenar')">
2019
- <mat-icon [praxisIcon]="'drag_indicator'"></mat-icon>
2020
- </button>
2013
+ <button praxisIconButton="drag_indicator" size="compact" type="button" cdkDragHandle [matTooltip]="t('editor.actions.dragToReorder', 'Arrastar para reordenar')" [attr.aria-label]="t('editor.actions.dragToReorder', 'Arrastar para reordenar')"></button>
2021
2014
  <strong class="editor-card-title">{{ getCompName(w.id) }}</strong>
2022
- <button mat-icon-button color="warn" (click)="removeWidgetFromLink(i, wi)" [matTooltip]="t('editor.actions.removeComponent', 'Remover componente')" [attr.aria-label]="t('editor.actions.removeComponent', 'Remover componente')"><mat-icon [praxisIcon]="'delete'"></mat-icon></button>
2015
+ <button praxisIconButton="delete" size="compact" type="button" class="editor-icon-action--danger" (click)="removeWidgetFromLink(i, wi)" [matTooltip]="t('editor.actions.removeComponent', 'Remover componente')" [attr.aria-label]="t('editor.actions.removeComponent', 'Remover componente')"></button>
2023
2016
  </div>
2024
2017
  <div class="editor-grid two tight">
2025
2018
  <mat-form-field appearance="outline">
@@ -2046,7 +2039,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
2046
2039
  </mat-tab>
2047
2040
  </mat-tab-group>
2048
2041
  </div>
2049
- `, styles: [":host{display:block;color:var(--md-sys-color-on-surface)}.editor-shell{display:grid;gap:12px}.editor-topbar{display:flex;align-items:start;justify-content:flex-start}.editor-mode-field{width:min(320px,100%)}.editor-diagnostics{display:grid;gap:8px}.editor-diagnostics-title{font-size:.95rem;font-weight:600;color:var(--md-sys-color-on-surface)}.editor-diagnostic{display:grid;gap:4px;padding:10px 12px;border-radius:10px;border:1px solid var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface-container);color:var(--md-sys-color-on-surface)}.editor-diagnostic code{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;color:var(--md-sys-color-on-surface-variant)}.editor-diagnostic.level-error{background:var(--md-sys-color-error-container);color:var(--md-sys-color-on-error-container);border-color:var(--md-sys-color-error)}.editor-diagnostic.level-warning{background:var(--md-sys-color-tertiary-container, var(--md-sys-color-surface-container));color:var(--md-sys-color-on-tertiary-container, var(--md-sys-color-on-surface));border-color:var(--md-sys-color-outline-variant)}.editor-tabs{--editor-surface: var(--md-sys-color-surface-container-lowest, var(--md-sys-color-surface));--editor-border: 1px solid var(--md-sys-color-outline-variant);--editor-radius: 12px;--editor-muted: var(--md-sys-color-on-surface-variant)}.editor-section{padding:12px;display:grid;gap:12px;background:var(--editor-surface);border:var(--editor-border);border-radius:var(--editor-radius)}.editor-section-lg{gap:16px}.editor-row{display:flex;gap:10px;flex-wrap:wrap;align-items:center}.editor-grid{display:grid;gap:12px}.editor-grid.two{grid-template-columns:repeat(auto-fit,minmax(220px,1fr))}.editor-grid.tight{gap:8px}.editor-toolbar{display:flex;gap:8px;flex-wrap:wrap;align-items:center}.editor-muted{color:var(--editor-muted)}.editor-title{margin:6px 0 8px;font-size:1rem}.editor-title-row{display:flex;align-items:center;gap:8px}.editor-code{white-space:pre-wrap;background:var(--md-sys-color-surface-container);padding:8px;border-radius:6px;border:1px solid var(--md-sys-color-outline-variant)}.editor-card{border:1px solid var(--md-sys-color-outline-variant);padding:10px;border-radius:10px;display:grid;gap:8px;background:var(--md-sys-color-surface)}.editor-card.dashed{border-style:dashed}.editor-card-header{display:flex;align-items:center;gap:8px}.editor-card-title{flex:1;font-weight:600}.editor-divider{border-top:1px solid var(--md-sys-color-outline-variant);padding-top:8px}.editor-spacer{flex:1}.editor-field-min{min-width:260px}.editor-section .editor-field-min{width:260px;max-width:260px}.editor-field-240{width:240px}.editor-section .editor-field-240{width:240px;max-width:240px}.editor-json{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.editor-section .mat-mdc-form-field{width:100%;max-width:520px;--mdc-outlined-text-field-container-height: 48px;--mdc-outlined-text-field-outline-color: var(--md-sys-color-outline-variant);--mdc-outlined-text-field-hover-outline-color: var(--md-sys-color-outline);--mdc-outlined-text-field-focus-outline-color: var(--md-sys-color-primary);--mdc-outlined-text-field-error-outline-color: var(--md-sys-color-error);--mdc-outlined-text-field-error-focus-outline-color: var(--md-sys-color-error);--mdc-outlined-text-field-error-hover-outline-color: var(--md-sys-color-error);--mdc-outlined-text-field-label-text-color: var(--md-sys-color-on-surface-variant);--mdc-outlined-text-field-input-text-color: var(--md-sys-color-on-surface);--mdc-outlined-text-field-supporting-text-color: var(--md-sys-color-on-surface-variant)}.editor-section .mat-mdc-form-field.full{max-width:none}.help-icon-button{--mdc-icon-button-state-layer-size: 28px;--mdc-icon-button-icon-size: 18px;width:28px;height:28px;padding:0;display:inline-flex;align-items:center;justify-content:center;margin-right:-4px}.help-icon-button mat-icon{font-size:18px;width:18px;height:18px}.mat-mdc-form-field-icon-suffix{align-self:center}\n"] }]
2042
+ `, styles: [":host{display:block;color:var(--md-sys-color-on-surface)}.editor-shell{display:grid;gap:12px}.editor-topbar{display:flex;align-items:start;justify-content:flex-start}.editor-mode-field{width:min(320px,100%)}.editor-diagnostics{display:grid;gap:8px}.editor-diagnostics-title{font-size:.95rem;font-weight:600;color:var(--md-sys-color-on-surface)}.editor-diagnostic{display:grid;gap:4px;padding:10px 12px;border-radius:10px;border:1px solid var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface-container);color:var(--md-sys-color-on-surface)}.editor-diagnostic code{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;color:var(--md-sys-color-on-surface-variant)}.editor-diagnostic.level-error{background:var(--md-sys-color-error-container);color:var(--md-sys-color-on-error-container);border-color:var(--md-sys-color-error)}.editor-diagnostic.level-warning{background:var(--md-sys-color-tertiary-container, var(--md-sys-color-surface-container));color:var(--md-sys-color-on-tertiary-container, var(--md-sys-color-on-surface));border-color:var(--md-sys-color-outline-variant)}.editor-tabs{--editor-surface: var(--md-sys-color-surface-container-lowest, var(--md-sys-color-surface));--editor-border: 1px solid var(--md-sys-color-outline-variant);--editor-radius: 12px;--editor-muted: var(--md-sys-color-on-surface-variant)}.editor-section{padding:12px;display:grid;gap:12px;background:var(--editor-surface);border:var(--editor-border);border-radius:var(--editor-radius)}.editor-section-lg{gap:16px}.editor-row{display:flex;gap:10px;flex-wrap:wrap;align-items:center}.editor-grid{display:grid;gap:12px}.editor-grid.two{grid-template-columns:repeat(auto-fit,minmax(220px,1fr))}.editor-grid.tight{gap:8px}.editor-toolbar{display:flex;gap:8px;flex-wrap:wrap;align-items:center}.editor-muted{color:var(--editor-muted)}.editor-title{margin:6px 0 8px;font-size:1rem}.editor-title-row{display:flex;align-items:center;gap:8px}.editor-code{white-space:pre-wrap;background:var(--md-sys-color-surface-container);padding:8px;border-radius:6px;border:1px solid var(--md-sys-color-outline-variant)}.editor-card{border:1px solid var(--md-sys-color-outline-variant);padding:10px;border-radius:10px;display:grid;gap:8px;background:var(--md-sys-color-surface)}.editor-card.dashed{border-style:dashed}.editor-card-header{display:flex;align-items:center;gap:8px}.editor-card-title{flex:1;font-weight:600}.editor-divider{border-top:1px solid var(--md-sys-color-outline-variant);padding-top:8px}.editor-spacer{flex:1}.editor-field-min{min-width:260px}.editor-section .editor-field-min{width:260px;max-width:260px}.editor-field-240{width:240px}.editor-section .editor-field-240{width:240px;max-width:240px}.editor-json{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.editor-section .mat-mdc-form-field{width:100%;max-width:520px;--mdc-outlined-text-field-container-height: 48px;--mdc-outlined-text-field-outline-color: var(--md-sys-color-outline-variant);--mdc-outlined-text-field-hover-outline-color: var(--md-sys-color-outline);--mdc-outlined-text-field-focus-outline-color: var(--md-sys-color-primary);--mdc-outlined-text-field-error-outline-color: var(--md-sys-color-error);--mdc-outlined-text-field-error-focus-outline-color: var(--md-sys-color-error);--mdc-outlined-text-field-error-hover-outline-color: var(--md-sys-color-error);--mdc-outlined-text-field-label-text-color: var(--md-sys-color-on-surface-variant);--mdc-outlined-text-field-input-text-color: var(--md-sys-color-on-surface);--mdc-outlined-text-field-supporting-text-color: var(--md-sys-color-on-surface-variant)}.editor-section .mat-mdc-form-field.full{max-width:none}.editor-icon-action--danger{color:var(--md-sys-color-error)}\n"] }]
2050
2043
  }], ctorParameters: () => [{ type: undefined, decorators: [{
2051
2044
  type: Inject,
2052
2045
  args: [SETTINGS_PANEL_DATA]
@@ -2178,7 +2171,7 @@ class TabsQuickSetupComponent {
2178
2171
  @for (l of model.labels; track l; let i = $index) {
2179
2172
  <div class="chip">
2180
2173
  <span>{{ l }}</span>
2181
- <button mat-icon-button (click)="removeLabel(i)" [attr.aria-label]="t('editor.actions.removeLabel', 'Remover rotulo')"><mat-icon [praxisIcon]="'close'"></mat-icon></button>
2174
+ <button praxisIconButton="close" size="dense" type="button" (click)="removeLabel(i)" [attr.aria-label]="t('editor.actions.removeLabel', 'Remover rotulo')"></button>
2182
2175
  </div>
2183
2176
  }
2184
2177
  </div>
@@ -2191,7 +2184,7 @@ class TabsQuickSetupComponent {
2191
2184
  <mat-slide-toggle [(ngModel)]="model.stretchTabs" (ngModelChange)="updateState()">{{ t('editor.toggles.stretchTabs', 'Esticar abas') }}</mat-slide-toggle>
2192
2185
  </div>
2193
2186
  </div>
2194
- `, isInline: true, styles: [":host{display:block;color:var(--md-sys-color-on-surface)}.setup-root{display:grid;gap:12px;padding:8px;background:var(--md-sys-color-surface-container-lowest, var(--md-sys-color-surface));border:1px solid var(--md-sys-color-outline-variant);border-radius:12px}.setup-row{display:flex;gap:12px;align-items:center;flex-wrap:wrap}.setup-row.wrap{flex-wrap:wrap}.setup-grid{display:grid;grid-template-columns:1fr auto;gap:8px;align-items:start}.setup-root .mat-mdc-form-field{width:100%;max-width:520px;--mdc-outlined-text-field-container-height: 48px;--mdc-outlined-text-field-outline-color: var(--md-sys-color-outline-variant);--mdc-outlined-text-field-hover-outline-color: var(--md-sys-color-outline);--mdc-outlined-text-field-focus-outline-color: var(--md-sys-color-primary);--mdc-outlined-text-field-error-outline-color: var(--md-sys-color-error);--mdc-outlined-text-field-error-focus-outline-color: var(--md-sys-color-error);--mdc-outlined-text-field-error-hover-outline-color: var(--md-sys-color-error);--mdc-outlined-text-field-label-text-color: var(--md-sys-color-on-surface-variant);--mdc-outlined-text-field-input-text-color: var(--md-sys-color-on-surface);--mdc-outlined-text-field-supporting-text-color: var(--md-sys-color-on-surface-variant)}.chip{display:inline-flex;align-items:center;gap:6px;padding:4px 8px;border:1px solid var(--md-sys-color-outline-variant);border-radius:16px;background:var(--md-sys-color-surface)}.hint{color:var(--md-sys-color-on-surface-variant)}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2_1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2_1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2_1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4$1.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: MatButtonModule }, { kind: "component", type: i6.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: i6.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatSlideToggleModule }, { kind: "component", type: i8.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }] });
2187
+ `, isInline: true, styles: [":host{display:block;color:var(--md-sys-color-on-surface)}.setup-root{display:grid;gap:12px;padding:8px;background:var(--md-sys-color-surface-container-lowest, var(--md-sys-color-surface));border:1px solid var(--md-sys-color-outline-variant);border-radius:12px}.setup-row{display:flex;gap:12px;align-items:center;flex-wrap:wrap}.setup-row.wrap{flex-wrap:wrap}.setup-grid{display:grid;grid-template-columns:1fr auto;gap:8px;align-items:start}.setup-root .mat-mdc-form-field{width:100%;max-width:520px;--mdc-outlined-text-field-container-height: 48px;--mdc-outlined-text-field-outline-color: var(--md-sys-color-outline-variant);--mdc-outlined-text-field-hover-outline-color: var(--md-sys-color-outline);--mdc-outlined-text-field-focus-outline-color: var(--md-sys-color-primary);--mdc-outlined-text-field-error-outline-color: var(--md-sys-color-error);--mdc-outlined-text-field-error-focus-outline-color: var(--md-sys-color-error);--mdc-outlined-text-field-error-hover-outline-color: var(--md-sys-color-error);--mdc-outlined-text-field-label-text-color: var(--md-sys-color-on-surface-variant);--mdc-outlined-text-field-input-text-color: var(--md-sys-color-on-surface);--mdc-outlined-text-field-supporting-text-color: var(--md-sys-color-on-surface-variant)}.chip{display:inline-flex;align-items:center;gap:6px;padding:4px 8px;border:1px solid var(--md-sys-color-outline-variant);border-radius:16px;background:var(--md-sys-color-surface)}.hint{color:var(--md-sys-color-on-surface-variant)}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2_1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2_1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2_1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: PraxisIconDirective, selector: "mat-icon[praxisIcon]", inputs: ["praxisIcon"] }, { kind: "component", type: PraxisIconButtonComponent, selector: "button[praxisIconButton]", inputs: ["praxisIconButton", "size", "appearance", "presentation", "pressed", "busy"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i6.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: "ngmodule", type: MatSlideToggleModule }, { kind: "component", type: i8.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }] });
2195
2188
  }
2196
2189
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: TabsQuickSetupComponent, decorators: [{
2197
2190
  type: Component,
@@ -2201,6 +2194,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
2201
2194
  MatInputModule,
2202
2195
  MatIconModule,
2203
2196
  PraxisIconDirective,
2197
+ PraxisIconButtonComponent,
2204
2198
  MatButtonModule,
2205
2199
  MatSlideToggleModule
2206
2200
  ], providers: [providePraxisI18nConfig(PRAXIS_TABS_I18N_CONFIG)], template: `
@@ -2232,7 +2226,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
2232
2226
  @for (l of model.labels; track l; let i = $index) {
2233
2227
  <div class="chip">
2234
2228
  <span>{{ l }}</span>
2235
- <button mat-icon-button (click)="removeLabel(i)" [attr.aria-label]="t('editor.actions.removeLabel', 'Remover rotulo')"><mat-icon [praxisIcon]="'close'"></mat-icon></button>
2229
+ <button praxisIconButton="close" size="dense" type="button" (click)="removeLabel(i)" [attr.aria-label]="t('editor.actions.removeLabel', 'Remover rotulo')"></button>
2236
2230
  </div>
2237
2231
  }
2238
2232
  </div>
@@ -3964,6 +3958,12 @@ class PraxisTabs {
3964
3958
  groupContentReady(index) {
3965
3959
  return !this.isLazy() || this.groupLoaded.has(index) || this.selectedIndexSignal() === index;
3966
3960
  }
3961
+ shouldRenderGroupBody() {
3962
+ return this.config?.group?.renderBody !== false;
3963
+ }
3964
+ shouldRenderNavBody() {
3965
+ return this.config?.nav?.renderBody !== false;
3966
+ }
3967
3967
  navContentReady(index) {
3968
3968
  return !this.isLazy() || this.navLoaded.has(index) || this.currentNavIndex() === index;
3969
3969
  }
@@ -4350,18 +4350,21 @@ class PraxisTabs {
4350
4350
  >
4351
4351
  @if (config?.behavior?.reorderable) {
4352
4352
  <span class="drag-handle" cdkDragHandle>
4353
- <mat-icon fontIcon="drag_indicator"></mat-icon>
4353
+ <mat-icon aria-hidden="true" fontIcon="drag_indicator"></mat-icon>
4354
4354
  </span>
4355
4355
  }
4356
4356
  @if (entry.link.icon) {
4357
- <mat-icon class="tab-label-icon" [praxisIcon]="entry.link.icon"></mat-icon>
4357
+ <mat-icon aria-hidden="true" class="tab-label-icon" [praxisIcon]="entry.link.icon"></mat-icon>
4358
4358
  }
4359
4359
  {{ entry.link.label }}
4360
4360
  </a>
4361
4361
  }
4362
4362
  </nav>
4363
- <mat-tab-nav-panel #tabPanel>
4364
- @if (currentNavIndex() >= 0) {
4363
+ <mat-tab-nav-panel
4364
+ #tabPanel
4365
+ [class.praxis-tabs-nav-panel--header-only]="!shouldRenderNavBody()"
4366
+ >
4367
+ @if (shouldRenderNavBody() && currentNavIndex() >= 0) {
4365
4368
  <div class="praxis-tabnav-content">
4366
4369
  @if (config?.nav?.links?.[currentNavIndex()]; as l) {
4367
4370
  @if ((l.content?.length || safeWidgetDefinitions(l.widgets).length) && navContentReady(currentNavIndex())) {
@@ -4396,6 +4399,7 @@ class PraxisTabs {
4396
4399
  </mat-tab-nav-panel>
4397
4400
  } @else {
4398
4401
  <mat-tab-group
4402
+ [class.praxis-tabs-group--header-only]="!shouldRenderGroupBody()"
4399
4403
  [dynamicHeight]="config?.group?.dynamicHeight"
4400
4404
  [disableRipple]="config?.group?.disableRipple"
4401
4405
  [disablePagination]="config?.group?.disablePagination"
@@ -4427,46 +4431,44 @@ class PraxisTabs {
4427
4431
  >
4428
4432
  <ng-template mat-tab-label>
4429
4433
  @if (entry.tab.icon) {
4430
- <mat-icon class="tab-label-icon" [praxisIcon]="entry.tab.icon"></mat-icon>
4434
+ <mat-icon aria-hidden="true" class="tab-label-icon" [praxisIcon]="entry.tab.icon"></mat-icon>
4431
4435
  }
4432
4436
  <span>{{ entry.tab.textLabel }}</span>
4433
4437
  @if (config?.behavior?.closeable) {
4434
4438
  <button
4435
- mat-icon-button
4439
+ praxisIconButton="close"
4440
+ size="dense"
4436
4441
  type="button"
4437
4442
  (click)="closeTab(entry.index); $event.stopPropagation()"
4438
4443
  (keydown.enter)="$event.stopPropagation()"
4439
4444
  (keydown.space)="$event.stopPropagation()"
4440
4445
  [attr.aria-label]="t('chrome.closeTab', 'Fechar aba')"
4441
- >
4442
- <mat-icon fontIcon="close"></mat-icon>
4443
- </button>
4446
+ ></button>
4444
4447
  }
4445
4448
  @if (config?.behavior?.reorderable) {
4446
4449
  <button
4447
- mat-icon-button
4450
+ praxisIconButton="arrow_back"
4451
+ size="dense"
4448
4452
  type="button"
4449
4453
  (click)="moveTab(entry.index, -1); $event.stopPropagation()"
4450
4454
  (keydown.enter)="$event.stopPropagation()"
4451
4455
  (keydown.space)="$event.stopPropagation()"
4452
4456
  [disabled]="entry.index===0"
4453
4457
  [attr.aria-label]="t('chrome.moveTabLeft', 'Mover aba para esquerda')"
4454
- >
4455
- <mat-icon fontIcon="arrow_back"></mat-icon>
4456
- </button>
4458
+ ></button>
4457
4459
  <button
4458
- mat-icon-button
4460
+ praxisIconButton="arrow_forward"
4461
+ size="dense"
4459
4462
  type="button"
4460
4463
  (click)="moveTab(entry.index, 1); $event.stopPropagation()"
4461
4464
  (keydown.enter)="$event.stopPropagation()"
4462
4465
  (keydown.space)="$event.stopPropagation()"
4463
4466
  [disabled]="entry.index===(config?.tabs?.length||1)-1"
4464
4467
  [attr.aria-label]="t('chrome.moveTabRight', 'Mover aba para direita')"
4465
- >
4466
- <mat-icon fontIcon="arrow_forward"></mat-icon>
4467
- </button>
4468
+ ></button>
4468
4469
  }
4469
4470
  </ng-template>
4471
+ @if (shouldRenderGroupBody()) {
4470
4472
  @if ((entry.tab.content?.length || safeWidgetDefinitions(entry.tab.widgets).length) && groupContentReady(entry.index)) {
4471
4473
  @if (entry.tab.content) {
4472
4474
  <ng-container
@@ -4493,6 +4495,7 @@ class PraxisTabs {
4493
4495
  [primaryAction]="{ label: t('emptyState.openEditor', 'Abrir editor'), icon: 'tune', action: openEditor.bind(this) }"
4494
4496
  ></praxis-empty-state-card>
4495
4497
  }
4498
+ }
4496
4499
  </mat-tab>
4497
4500
  }
4498
4501
  </mat-tab-group>
@@ -4509,7 +4512,7 @@ class PraxisTabs {
4509
4512
  [attr.aria-label]="t('chrome.editTabs', 'Editar abas')"
4510
4513
  (click)="openEditor()"
4511
4514
  >
4512
- <mat-icon fontIcon="edit"></mat-icon>
4515
+ <mat-icon aria-hidden="true" fontIcon="edit"></mat-icon>
4513
4516
  </button>
4514
4517
  }
4515
4518
  @if (enableCustomization && tabsId) {
@@ -4520,11 +4523,11 @@ class PraxisTabs {
4520
4523
  (click)="resetPreferences()"
4521
4524
  [matTooltip]="t('settings.resetPreferences', 'Redefinir preferencias de abas')"
4522
4525
  >
4523
- <mat-icon [praxisIcon]="'restart_alt'"></mat-icon>
4526
+ <mat-icon aria-hidden="true" [praxisIcon]="'restart_alt'"></mat-icon>
4524
4527
  </button>
4525
4528
  }
4526
4529
  </div>
4527
- `, isInline: true, styles: [".praxis-tabs-root{position:relative;display:block}.praxis-tabs-group.align-start .mat-mdc-tab-header{justify-content:flex-start}.praxis-tabs-group.align-center .mat-mdc-tab-header{justify-content:center}.praxis-tabs-group.align-end .mat-mdc-tab-header{justify-content:flex-end}.density-compact .mat-mdc-tab-body-content{padding:8px}.density-comfortable .mat-mdc-tab-body-content{padding:16px}.density-spacious .mat-mdc-tab-body-content{padding:24px}.tabs-ai-assistant{position:absolute;right:12px;bottom:72px;z-index:3}.tabs-ai-assistant-trigger{box-shadow:var(--md-sys-elevation-level2)}.edit-fab{position:absolute;right:12px;bottom:12px;z-index:2}.edit-fab-secondary{right:56px}.tab-empty{padding:16px;color:var(--md-sys-color-on-surface-variant);font-style:italic}.high-contrast{filter:contrast(1.2)}.reduce-motion{--mat-animation-duration: 0ms}.drag-handle{display:inline-flex;align-items:center;vertical-align:middle;margin-right:4px;cursor:grab}.tab-label-icon{font-size:18px;width:18px;height:18px;margin-right:6px;vertical-align:middle}:host-context(.pdx-gridster-item) .praxis-tabs-root{display:flex;flex-direction:column;height:100%;min-height:0}:host-context(.pdx-gridster-item) .praxis-tabs-group,:host-context(.pdx-gridster-item) .mat-mdc-tab-group{flex:1 1 auto;min-height:0}:host-context(.pdx-gridster-item) .mat-mdc-tab-body-wrapper,:host-context(.pdx-gridster-item) .mat-mdc-tab-body-content{height:100%;min-height:0}:host-context(.pdx-gridster-item) .mat-mdc-tab-body-content{overflow:auto}:host-context(.pdx-gridster-item) .praxis-tabnav-content{flex:1 1 auto;min-height:0;overflow:auto}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2_1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2_1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatTabsModule }, { kind: "directive", type: i3.MatTabLabel, selector: "[mat-tab-label], [matTabLabel]" }, { kind: "component", type: i3.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass", "id"], exportAs: ["matTab"] }, { kind: "component", type: i3.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "fitInkBarToContent", "mat-stretch-tabs", "mat-align-tabs", "dynamicHeight", "selectedIndex", "headerPosition", "animationDuration", "contentTabIndex", "disablePagination", "disableRipple", "preserveContent", "backgroundColor", "aria-label", "aria-labelledby"], outputs: ["selectedIndexChange", "focusChange", "animationDone", "selectedTabChange"], exportAs: ["matTabGroup"] }, { kind: "component", type: i3.MatTabNav, selector: "[mat-tab-nav-bar]", inputs: ["fitInkBarToContent", "mat-stretch-tabs", "animationDuration", "backgroundColor", "disableRipple", "color", "tabPanel"], exportAs: ["matTabNavBar", "matTabNav"] }, { kind: "component", type: i3.MatTabNavPanel, selector: "mat-tab-nav-panel", inputs: ["id"], exportAs: ["matTabNavPanel"] }, { kind: "component", type: i3.MatTabLink, selector: "[mat-tab-link], [matTabLink]", inputs: ["active", "disabled", "disableRipple", "tabIndex", "id"], exportAs: ["matTabLink"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i10.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: PraxisIconDirective, selector: "mat-icon[praxisIcon]", inputs: ["praxisIcon"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i6.MatMiniFabButton, selector: "button[mat-mini-fab], a[mat-mini-fab], button[matMiniFab], a[matMiniFab]", exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i6.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i6.MatFabButton, selector: "button[mat-fab], a[mat-fab], button[matFab], a[matFab]", inputs: ["extended"], exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i9.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer", "cdkDropListHasAnchor"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i9.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i9.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "component", type: EmptyStateCardComponent, selector: "praxis-empty-state-card", inputs: ["icon", "title", "description", "primaryAction", "secondaryActions", "inline", "tone"] }, { kind: "directive", type: DynamicFieldLoaderDirective, selector: "[dynamicFieldLoader]", inputs: ["fields", "formGroup", "enableExternalControlBinding", "itemTemplate", "debugTrace", "debugTraceLabel", "readonlyMode", "disabledMode", "presentationMode", "visible", "canvasMode"], outputs: ["componentsCreated", "fieldCreated", "fieldDestroyed", "renderError", "canvasMouseEnter", "canvasMouseLeave", "canvasClick", "canvasFocus"] }, { kind: "directive", type: DynamicWidgetLoaderDirective, selector: "[dynamicWidgetLoader]", inputs: ["dynamicWidgetLoader", "ownerWidgetKey", "context", "strictValidation", "autoWireOutputs"], outputs: ["widgetEvent", "widgetDiagnostic"], exportAs: ["dynamicWidgetLoader"] }, { kind: "component", type: PraxisAiAssistantShellComponent, selector: "praxis-ai-assistant-shell", inputs: ["labels", "mode", "state", "contextItems", "attachments", "messages", "quickReplies", "recommendedIntents", "prompt", "statusText", "errorText", "testIdPrefix", "panelTestId", "submitTestId", "applyTestId", "primaryAction", "secondaryActions", "governanceActions", "busy", "canSubmit", "canApply", "submitOnEnter", "showAttachAction", "enablePastedAttachments", "enableFileAttachments", "attachmentAccept", "attachmentMultiple", "voiceInputMode", "voiceLanguage", "draggable", "resizable", "minWidth", "minHeight", "margin", "layout"], outputs: ["promptChange", "submitPrompt", "apply", "retryTurn", "cancelTurn", "shellAction", "close", "attach", "attachmentsPasted", "attachmentsSelected", "removeAttachment", "messageAction", "editMessage", "resendMessage", "quickReply", "recommendedIntent", "layoutChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4530
+ `, isInline: true, styles: [".praxis-tabs-root{position:relative;display:block}.praxis-tabs-group.align-start .mat-mdc-tab-header{justify-content:flex-start}.praxis-tabs-group.align-center .mat-mdc-tab-header{justify-content:center}.praxis-tabs-group.align-end .mat-mdc-tab-header{justify-content:flex-end}.praxis-tabs-group--header-only .mat-mdc-tab-body-wrapper,.praxis-tabs-nav-panel--header-only{display:none}.density-compact .mat-mdc-tab-body-content{padding:8px}.density-comfortable .mat-mdc-tab-body-content{padding:16px}.density-spacious .mat-mdc-tab-body-content{padding:24px}.tabs-ai-assistant{position:absolute;right:12px;bottom:72px;z-index:3}.tabs-ai-assistant-trigger{box-shadow:var(--md-sys-elevation-level2)}.edit-fab{position:absolute;right:12px;bottom:12px;z-index:2}.edit-fab-secondary{right:56px}.tab-empty{padding:16px;color:var(--md-sys-color-on-surface-variant);font-style:italic}.high-contrast{filter:contrast(1.2)}.reduce-motion{--mat-animation-duration: 0ms}.drag-handle{display:inline-flex;align-items:center;vertical-align:middle;margin-right:4px;cursor:grab}.tab-label-icon{font-size:18px;width:18px;height:18px;margin-right:6px;vertical-align:middle}:host-context(.pdx-gridster-item) .praxis-tabs-root{display:flex;flex-direction:column;height:100%;min-height:0}:host-context(.pdx-gridster-item) .praxis-tabs-group,:host-context(.pdx-gridster-item) .mat-mdc-tab-group{flex:1 1 auto;min-height:0}:host-context(.pdx-gridster-item) .mat-mdc-tab-body-wrapper,:host-context(.pdx-gridster-item) .mat-mdc-tab-body-content{height:100%;min-height:0}:host-context(.pdx-gridster-item) .mat-mdc-tab-body-content{overflow:auto}:host-context(.pdx-gridster-item) .praxis-tabnav-content{flex:1 1 auto;min-height:0;overflow:auto}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2_1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2_1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatTabsModule }, { kind: "directive", type: i3.MatTabLabel, selector: "[mat-tab-label], [matTabLabel]" }, { kind: "component", type: i3.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass", "id"], exportAs: ["matTab"] }, { kind: "component", type: i3.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "fitInkBarToContent", "mat-stretch-tabs", "mat-align-tabs", "dynamicHeight", "selectedIndex", "headerPosition", "animationDuration", "contentTabIndex", "disablePagination", "disableRipple", "preserveContent", "backgroundColor", "aria-label", "aria-labelledby"], outputs: ["selectedIndexChange", "focusChange", "animationDone", "selectedTabChange"], exportAs: ["matTabGroup"] }, { kind: "component", type: i3.MatTabNav, selector: "[mat-tab-nav-bar]", inputs: ["fitInkBarToContent", "mat-stretch-tabs", "animationDuration", "backgroundColor", "disableRipple", "color", "tabPanel"], exportAs: ["matTabNavBar", "matTabNav"] }, { kind: "component", type: i3.MatTabNavPanel, selector: "mat-tab-nav-panel", inputs: ["id"], exportAs: ["matTabNavPanel"] }, { kind: "component", type: i3.MatTabLink, selector: "[mat-tab-link], [matTabLink]", inputs: ["active", "disabled", "disableRipple", "tabIndex", "id"], exportAs: ["matTabLink"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i10.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: PraxisIconDirective, selector: "mat-icon[praxisIcon]", inputs: ["praxisIcon"] }, { kind: "component", type: PraxisIconButtonComponent, selector: "button[praxisIconButton]", inputs: ["praxisIconButton", "size", "appearance", "presentation", "pressed", "busy"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i6.MatMiniFabButton, selector: "button[mat-mini-fab], a[mat-mini-fab], button[matMiniFab], a[matMiniFab]", exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i6.MatFabButton, selector: "button[mat-fab], a[mat-fab], button[matFab], a[matFab]", inputs: ["extended"], exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i9.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer", "cdkDropListHasAnchor"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i9.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i9.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "component", type: EmptyStateCardComponent, selector: "praxis-empty-state-card", inputs: ["icon", "title", "description", "primaryAction", "secondaryActions", "inline", "tone", "variant", "alignment", "density", "iconContainer"] }, { kind: "directive", type: DynamicFieldLoaderDirective, selector: "[dynamicFieldLoader]", inputs: ["fields", "formGroup", "enableExternalControlBinding", "itemTemplate", "debugTrace", "debugTraceLabel", "readonlyMode", "disabledMode", "presentationMode", "visible", "canvasMode"], outputs: ["componentsCreated", "fieldCreated", "fieldDestroyed", "renderError", "canvasMouseEnter", "canvasMouseLeave", "canvasClick", "canvasFocus"] }, { kind: "directive", type: DynamicWidgetLoaderDirective, selector: "[dynamicWidgetLoader]", inputs: ["dynamicWidgetLoader", "ownerWidgetKey", "context", "strictValidation", "autoWireOutputs"], outputs: ["widgetEvent", "widgetDiagnostic"], exportAs: ["dynamicWidgetLoader"] }, { kind: "component", type: PraxisAiAssistantShellComponent, selector: "praxis-ai-assistant-shell", inputs: ["labels", "mode", "state", "contextItems", "attachments", "messages", "quickReplies", "recommendedIntents", "prompt", "statusText", "errorText", "testIdPrefix", "panelTestId", "submitTestId", "applyTestId", "primaryAction", "secondaryActions", "governanceActions", "busy", "canSubmit", "canApply", "submitOnEnter", "showAttachAction", "enablePastedAttachments", "enableFileAttachments", "attachmentAccept", "attachmentMultiple", "voiceInputMode", "voiceLanguage", "draggable", "resizable", "minWidth", "minHeight", "margin", "layout"], outputs: ["promptChange", "submitPrompt", "apply", "retryTurn", "cancelTurn", "shellAction", "close", "attach", "attachmentsPasted", "attachmentsSelected", "removeAttachment", "messageAction", "editMessage", "resendMessage", "quickReply", "recommendedIntent", "layoutChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4528
4531
  }
4529
4532
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisTabs, decorators: [{
4530
4533
  type: Component,
@@ -4535,6 +4538,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
4535
4538
  MatIconModule,
4536
4539
  MatTooltipModule,
4537
4540
  PraxisIconDirective,
4541
+ PraxisIconButtonComponent,
4538
4542
  MatButtonModule,
4539
4543
  DragDropModule,
4540
4544
  EmptyStateCardComponent,
@@ -4659,18 +4663,21 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
4659
4663
  >
4660
4664
  @if (config?.behavior?.reorderable) {
4661
4665
  <span class="drag-handle" cdkDragHandle>
4662
- <mat-icon fontIcon="drag_indicator"></mat-icon>
4666
+ <mat-icon aria-hidden="true" fontIcon="drag_indicator"></mat-icon>
4663
4667
  </span>
4664
4668
  }
4665
4669
  @if (entry.link.icon) {
4666
- <mat-icon class="tab-label-icon" [praxisIcon]="entry.link.icon"></mat-icon>
4670
+ <mat-icon aria-hidden="true" class="tab-label-icon" [praxisIcon]="entry.link.icon"></mat-icon>
4667
4671
  }
4668
4672
  {{ entry.link.label }}
4669
4673
  </a>
4670
4674
  }
4671
4675
  </nav>
4672
- <mat-tab-nav-panel #tabPanel>
4673
- @if (currentNavIndex() >= 0) {
4676
+ <mat-tab-nav-panel
4677
+ #tabPanel
4678
+ [class.praxis-tabs-nav-panel--header-only]="!shouldRenderNavBody()"
4679
+ >
4680
+ @if (shouldRenderNavBody() && currentNavIndex() >= 0) {
4674
4681
  <div class="praxis-tabnav-content">
4675
4682
  @if (config?.nav?.links?.[currentNavIndex()]; as l) {
4676
4683
  @if ((l.content?.length || safeWidgetDefinitions(l.widgets).length) && navContentReady(currentNavIndex())) {
@@ -4705,6 +4712,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
4705
4712
  </mat-tab-nav-panel>
4706
4713
  } @else {
4707
4714
  <mat-tab-group
4715
+ [class.praxis-tabs-group--header-only]="!shouldRenderGroupBody()"
4708
4716
  [dynamicHeight]="config?.group?.dynamicHeight"
4709
4717
  [disableRipple]="config?.group?.disableRipple"
4710
4718
  [disablePagination]="config?.group?.disablePagination"
@@ -4736,46 +4744,44 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
4736
4744
  >
4737
4745
  <ng-template mat-tab-label>
4738
4746
  @if (entry.tab.icon) {
4739
- <mat-icon class="tab-label-icon" [praxisIcon]="entry.tab.icon"></mat-icon>
4747
+ <mat-icon aria-hidden="true" class="tab-label-icon" [praxisIcon]="entry.tab.icon"></mat-icon>
4740
4748
  }
4741
4749
  <span>{{ entry.tab.textLabel }}</span>
4742
4750
  @if (config?.behavior?.closeable) {
4743
4751
  <button
4744
- mat-icon-button
4752
+ praxisIconButton="close"
4753
+ size="dense"
4745
4754
  type="button"
4746
4755
  (click)="closeTab(entry.index); $event.stopPropagation()"
4747
4756
  (keydown.enter)="$event.stopPropagation()"
4748
4757
  (keydown.space)="$event.stopPropagation()"
4749
4758
  [attr.aria-label]="t('chrome.closeTab', 'Fechar aba')"
4750
- >
4751
- <mat-icon fontIcon="close"></mat-icon>
4752
- </button>
4759
+ ></button>
4753
4760
  }
4754
4761
  @if (config?.behavior?.reorderable) {
4755
4762
  <button
4756
- mat-icon-button
4763
+ praxisIconButton="arrow_back"
4764
+ size="dense"
4757
4765
  type="button"
4758
4766
  (click)="moveTab(entry.index, -1); $event.stopPropagation()"
4759
4767
  (keydown.enter)="$event.stopPropagation()"
4760
4768
  (keydown.space)="$event.stopPropagation()"
4761
4769
  [disabled]="entry.index===0"
4762
4770
  [attr.aria-label]="t('chrome.moveTabLeft', 'Mover aba para esquerda')"
4763
- >
4764
- <mat-icon fontIcon="arrow_back"></mat-icon>
4765
- </button>
4771
+ ></button>
4766
4772
  <button
4767
- mat-icon-button
4773
+ praxisIconButton="arrow_forward"
4774
+ size="dense"
4768
4775
  type="button"
4769
4776
  (click)="moveTab(entry.index, 1); $event.stopPropagation()"
4770
4777
  (keydown.enter)="$event.stopPropagation()"
4771
4778
  (keydown.space)="$event.stopPropagation()"
4772
4779
  [disabled]="entry.index===(config?.tabs?.length||1)-1"
4773
4780
  [attr.aria-label]="t('chrome.moveTabRight', 'Mover aba para direita')"
4774
- >
4775
- <mat-icon fontIcon="arrow_forward"></mat-icon>
4776
- </button>
4781
+ ></button>
4777
4782
  }
4778
4783
  </ng-template>
4784
+ @if (shouldRenderGroupBody()) {
4779
4785
  @if ((entry.tab.content?.length || safeWidgetDefinitions(entry.tab.widgets).length) && groupContentReady(entry.index)) {
4780
4786
  @if (entry.tab.content) {
4781
4787
  <ng-container
@@ -4802,6 +4808,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
4802
4808
  [primaryAction]="{ label: t('emptyState.openEditor', 'Abrir editor'), icon: 'tune', action: openEditor.bind(this) }"
4803
4809
  ></praxis-empty-state-card>
4804
4810
  }
4811
+ }
4805
4812
  </mat-tab>
4806
4813
  }
4807
4814
  </mat-tab-group>
@@ -4818,7 +4825,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
4818
4825
  [attr.aria-label]="t('chrome.editTabs', 'Editar abas')"
4819
4826
  (click)="openEditor()"
4820
4827
  >
4821
- <mat-icon fontIcon="edit"></mat-icon>
4828
+ <mat-icon aria-hidden="true" fontIcon="edit"></mat-icon>
4822
4829
  </button>
4823
4830
  }
4824
4831
  @if (enableCustomization && tabsId) {
@@ -4829,11 +4836,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
4829
4836
  (click)="resetPreferences()"
4830
4837
  [matTooltip]="t('settings.resetPreferences', 'Redefinir preferencias de abas')"
4831
4838
  >
4832
- <mat-icon [praxisIcon]="'restart_alt'"></mat-icon>
4839
+ <mat-icon aria-hidden="true" [praxisIcon]="'restart_alt'"></mat-icon>
4833
4840
  </button>
4834
4841
  }
4835
4842
  </div>
4836
- `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".praxis-tabs-root{position:relative;display:block}.praxis-tabs-group.align-start .mat-mdc-tab-header{justify-content:flex-start}.praxis-tabs-group.align-center .mat-mdc-tab-header{justify-content:center}.praxis-tabs-group.align-end .mat-mdc-tab-header{justify-content:flex-end}.density-compact .mat-mdc-tab-body-content{padding:8px}.density-comfortable .mat-mdc-tab-body-content{padding:16px}.density-spacious .mat-mdc-tab-body-content{padding:24px}.tabs-ai-assistant{position:absolute;right:12px;bottom:72px;z-index:3}.tabs-ai-assistant-trigger{box-shadow:var(--md-sys-elevation-level2)}.edit-fab{position:absolute;right:12px;bottom:12px;z-index:2}.edit-fab-secondary{right:56px}.tab-empty{padding:16px;color:var(--md-sys-color-on-surface-variant);font-style:italic}.high-contrast{filter:contrast(1.2)}.reduce-motion{--mat-animation-duration: 0ms}.drag-handle{display:inline-flex;align-items:center;vertical-align:middle;margin-right:4px;cursor:grab}.tab-label-icon{font-size:18px;width:18px;height:18px;margin-right:6px;vertical-align:middle}:host-context(.pdx-gridster-item) .praxis-tabs-root{display:flex;flex-direction:column;height:100%;min-height:0}:host-context(.pdx-gridster-item) .praxis-tabs-group,:host-context(.pdx-gridster-item) .mat-mdc-tab-group{flex:1 1 auto;min-height:0}:host-context(.pdx-gridster-item) .mat-mdc-tab-body-wrapper,:host-context(.pdx-gridster-item) .mat-mdc-tab-body-content{height:100%;min-height:0}:host-context(.pdx-gridster-item) .mat-mdc-tab-body-content{overflow:auto}:host-context(.pdx-gridster-item) .praxis-tabnav-content{flex:1 1 auto;min-height:0;overflow:auto}\n"] }]
4843
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".praxis-tabs-root{position:relative;display:block}.praxis-tabs-group.align-start .mat-mdc-tab-header{justify-content:flex-start}.praxis-tabs-group.align-center .mat-mdc-tab-header{justify-content:center}.praxis-tabs-group.align-end .mat-mdc-tab-header{justify-content:flex-end}.praxis-tabs-group--header-only .mat-mdc-tab-body-wrapper,.praxis-tabs-nav-panel--header-only{display:none}.density-compact .mat-mdc-tab-body-content{padding:8px}.density-comfortable .mat-mdc-tab-body-content{padding:16px}.density-spacious .mat-mdc-tab-body-content{padding:24px}.tabs-ai-assistant{position:absolute;right:12px;bottom:72px;z-index:3}.tabs-ai-assistant-trigger{box-shadow:var(--md-sys-elevation-level2)}.edit-fab{position:absolute;right:12px;bottom:12px;z-index:2}.edit-fab-secondary{right:56px}.tab-empty{padding:16px;color:var(--md-sys-color-on-surface-variant);font-style:italic}.high-contrast{filter:contrast(1.2)}.reduce-motion{--mat-animation-duration: 0ms}.drag-handle{display:inline-flex;align-items:center;vertical-align:middle;margin-right:4px;cursor:grab}.tab-label-icon{font-size:18px;width:18px;height:18px;margin-right:6px;vertical-align:middle}:host-context(.pdx-gridster-item) .praxis-tabs-root{display:flex;flex-direction:column;height:100%;min-height:0}:host-context(.pdx-gridster-item) .praxis-tabs-group,:host-context(.pdx-gridster-item) .mat-mdc-tab-group{flex:1 1 auto;min-height:0}:host-context(.pdx-gridster-item) .mat-mdc-tab-body-wrapper,:host-context(.pdx-gridster-item) .mat-mdc-tab-body-content{height:100%;min-height:0}:host-context(.pdx-gridster-item) .mat-mdc-tab-body-content{overflow:auto}:host-context(.pdx-gridster-item) .praxis-tabnav-content{flex:1 1 auto;min-height:0;overflow:auto}\n"] }]
4837
4844
  }], propDecorators: { config: [{
4838
4845
  type: Input
4839
4846
  }], tabsId: [{
@@ -5094,7 +5101,7 @@ const PRAXIS_TABS_COMPONENT_METADATA = {
5094
5101
  name: 'selectedIndex',
5095
5102
  type: 'number',
5096
5103
  label: 'Indice selecionado',
5097
- description: 'Indice ativo de abas/nav controlavel externamente pela composicao',
5104
+ description: 'Indice ativo de abas/nav controlavel externamente pela composicao. Para usar tabs como header de navegacao com conteudo externo, configure group.renderBody=false ou nav.renderBody=false.',
5098
5105
  },
5099
5106
  {
5100
5107
  name: 'enableCustomization',
@@ -5277,6 +5284,7 @@ const PRAXIS_TABS_AUTHORING_MANIFEST = {
5277
5284
  { kind: 'visibility', resolver: 'tab-or-link-by-id', description: 'Runtime visibility flag for a group tab or nav link.' },
5278
5285
  { kind: 'disabledState', resolver: 'tab-or-link-by-id', description: 'Disabled state of a tab or nav link.' },
5279
5286
  { kind: 'layout', resolver: 'tabs-layout-config', description: 'Group/nav mode, header position, density, stretch and behavior settings.' },
5287
+ { kind: 'renderBody', resolver: 'tabs-render-body-config', description: 'Config paths group.renderBody and nav.renderBody that let the host own external body content.' },
5280
5288
  ],
5281
5289
  operations: [
5282
5290
  {