@praxisui/tabs 1.0.0-beta.48 → 1.0.0-beta.52
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +49 -5
- package/fesm2022/praxisui-tabs.mjs +22 -37
- package/fesm2022/praxisui-tabs.mjs.map +1 -1
- package/index.d.ts +5 -0
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -1,3 +1,43 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Tabs"
|
|
3
|
+
slug: "tabs-overview"
|
|
4
|
+
description: "Visao geral do @praxisui/tabs com modos group/nav, conteudo metadata-driven, persistencia por tabsId e editor integrado."
|
|
5
|
+
doc_type: "reference"
|
|
6
|
+
document_kind: "component-overview"
|
|
7
|
+
component: "tabs"
|
|
8
|
+
category: "components"
|
|
9
|
+
audience:
|
|
10
|
+
- "frontend"
|
|
11
|
+
- "host"
|
|
12
|
+
- "architect"
|
|
13
|
+
level: "intermediate"
|
|
14
|
+
status: "active"
|
|
15
|
+
owner: "praxis-ui"
|
|
16
|
+
tags:
|
|
17
|
+
- "tabs"
|
|
18
|
+
- "navigation"
|
|
19
|
+
- "metadata"
|
|
20
|
+
- "settings-panel"
|
|
21
|
+
- "runtime"
|
|
22
|
+
order: 34
|
|
23
|
+
icon: "tabs"
|
|
24
|
+
toc: true
|
|
25
|
+
sidebar: true
|
|
26
|
+
search_boost: 1.0
|
|
27
|
+
reading_time: 12
|
|
28
|
+
estimated_setup_time: 20
|
|
29
|
+
version: "1.0"
|
|
30
|
+
related_docs:
|
|
31
|
+
- "consumer-integration-quickstart"
|
|
32
|
+
- "host-integration-guide"
|
|
33
|
+
keywords:
|
|
34
|
+
- "tabs metadata"
|
|
35
|
+
- "mat-tab-group"
|
|
36
|
+
- "tab nav"
|
|
37
|
+
- "tabsId persistence"
|
|
38
|
+
last_updated: "2026-03-07"
|
|
39
|
+
---
|
|
40
|
+
|
|
1
41
|
# @praxisui/tabs — Praxis Tabs
|
|
2
42
|
|
|
3
43
|
## 🔰 Exemplos / Quickstart
|
|
@@ -17,6 +57,7 @@ Componente de abas (grupo e nav) configurável por metadados, com suporte a widg
|
|
|
17
57
|
- Persistência de configuração por `tabsId` usando `AsyncConfigStorage` (chave derivada via component_id).
|
|
18
58
|
- Lazy load opcional do conteúdo para melhor desempenho.
|
|
19
59
|
- Eventos reemitidos com contexto (para conexões entre widgets/páginas).
|
|
60
|
+
- Acessibilidade explícita por modo: `group.*` e `tabs[]` no modo group, `nav.*` no modo nav.
|
|
20
61
|
|
|
21
62
|
## API do Componente
|
|
22
63
|
|
|
@@ -62,10 +103,10 @@ export interface TabsMetadata {
|
|
|
62
103
|
tokens?: Partial<TabsStyleTokens>; // tokens -> CSS gerado em runtime
|
|
63
104
|
};
|
|
64
105
|
behavior?: { lazyLoad?: boolean; closeable?: boolean; reorderable?: boolean };
|
|
65
|
-
accessibility?: {
|
|
66
|
-
group?: { alignTabs?: 'start' | 'center' | 'end'; headerPosition?: 'above'|'below'; selectedIndex?: number; dynamicHeight?: boolean; disableRipple?: boolean; disablePagination?: boolean; fitInkBarToContent?: boolean; stretchTabs?: boolean; color?: 'primary'|'accent'|'warn'; backgroundColor?: 'primary'|'accent'|'warn'|undefined; animationDuration?: string; };
|
|
106
|
+
accessibility?: { highContrast?: boolean; reduceMotion?: boolean };
|
|
107
|
+
group?: { alignTabs?: 'start' | 'center' | 'end'; headerPosition?: 'above'|'below'; selectedIndex?: number; dynamicHeight?: boolean; disableRipple?: boolean; disablePagination?: boolean; fitInkBarToContent?: boolean; stretchTabs?: boolean; color?: 'primary'|'accent'|'warn'; backgroundColor?: 'primary'|'accent'|'warn'|undefined; animationDuration?: string; ariaLabel?: string; ariaLabelledby?: string; };
|
|
67
108
|
tabs?: Array<{ id?: string; textLabel?: string; disabled?: boolean; labelClass?: string|string[]; bodyClass?: string|string[]; content?: any[]; widgets?: WidgetDefinition[] }>;
|
|
68
|
-
nav?: { links: Array<{ id?: string; label: string; disabled?: boolean; content?: any[]; widgets?: WidgetDefinition[] }>; selectedIndex?: number; disableRipple?: boolean; disablePagination?: boolean; fitInkBarToContent?: boolean; stretchTabs?: boolean; color?: 'primary'|'accent'|'warn'; backgroundColor?: 'primary'|'accent'|'warn'|undefined; animationDuration?: string };
|
|
109
|
+
nav?: { links: Array<{ id?: string; label: string; disabled?: boolean; content?: any[]; widgets?: WidgetDefinition[] }>; selectedIndex?: number; disableRipple?: boolean; disablePagination?: boolean; fitInkBarToContent?: boolean; stretchTabs?: boolean; color?: 'primary'|'accent'|'warn'; backgroundColor?: 'primary'|'accent'|'warn'|undefined; animationDuration?: string; ariaLabel?: string; ariaLabelledby?: string };
|
|
69
110
|
}
|
|
70
111
|
```
|
|
71
112
|
|
|
@@ -94,6 +135,7 @@ Contrato do Editor (`PraxisTabsConfigEditor` implementa `SettingsValueProvider`)
|
|
|
94
135
|
- JSON: editor de texto com validação e botão “Formatar”.
|
|
95
136
|
- Estilo: presets de tokens, classe de tema, CSS customizado e snippet SCSS sugerido.
|
|
96
137
|
- Abas/Links: adicionar/remover/reordenar, inserir widgets, presets rápidos (form/table/crud) usando `resourcePath`.
|
|
138
|
+
- O editor cobre apenas caminhos com binding real no runtime; campos sem efeito não são expostos na UI.
|
|
97
139
|
|
|
98
140
|
Quick Setup
|
|
99
141
|
- `openQuickSetup()` abre `TabsQuickSetupComponent` para criação rápida de abas/links.
|
|
@@ -136,8 +178,9 @@ const tabsCfg: TabsMetadata = {
|
|
|
136
178
|
|
|
137
179
|
## Acessibilidade
|
|
138
180
|
|
|
139
|
-
-
|
|
140
|
-
-
|
|
181
|
+
- Modo `group`: use `group.ariaLabel`, `group.ariaLabelledby`, `tabs[].ariaLabel` e `tabs[].ariaLabelledby`.
|
|
182
|
+
- Modo `nav`: use `nav.ariaLabel` e `nav.ariaLabelledby`.
|
|
183
|
+
- Opções top-level de acessibilidade com binding real: `accessibility.reduceMotion` e `accessibility.highContrast`.
|
|
141
184
|
|
|
142
185
|
## Notas
|
|
143
186
|
|
|
@@ -145,6 +188,7 @@ const tabsCfg: TabsMetadata = {
|
|
|
145
188
|
- Tokens de estilo aceitam CSS vars ou cores (`#RRGGBB`/`rgb(...)`).
|
|
146
189
|
- Em M2, `color` e `backgroundColor` seguem as opções do Angular Material; em M3, prefira tokens.
|
|
147
190
|
- A classe de tema é decisão do host (`.dark-theme` ou `.theme-dark`/`.theme-light`); mantenha tokens e componentes no mesmo escopo.
|
|
191
|
+
- `group.contentTabIndex`, `accessibility.ariaLabels` e `accessibility.keyboardNavigation` permanecem fora da superfície pública suportada enquanto não houver binding explícito no DOM.
|
|
148
192
|
|
|
149
193
|
### Tokens M3 obrigatórios (host)
|
|
150
194
|
|
|
@@ -384,8 +384,8 @@ class PraxisTabsConfigEditor {
|
|
|
384
384
|
<div class="editor-section">
|
|
385
385
|
<div class="editor-row">
|
|
386
386
|
<mat-slide-toggle [(ngModel)]="behavior.closeable" (ngModelChange)="onAppearanceChange()">Fechavel</mat-slide-toggle>
|
|
387
|
-
<mat-slide-toggle [(ngModel)]="behavior.lazyLoad" (ngModelChange)="onAppearanceChange()">Carregar sob demanda
|
|
388
|
-
<mat-slide-toggle [(ngModel)]="behavior.reorderable" (ngModelChange)="onAppearanceChange()">Reordenavel
|
|
387
|
+
<mat-slide-toggle [(ngModel)]="behavior.lazyLoad" (ngModelChange)="onAppearanceChange()">Carregar sob demanda</mat-slide-toggle>
|
|
388
|
+
<mat-slide-toggle [(ngModel)]="behavior.reorderable" (ngModelChange)="onAppearanceChange()">Reordenavel</mat-slide-toggle>
|
|
389
389
|
</div>
|
|
390
390
|
</div>
|
|
391
391
|
</mat-tab>
|
|
@@ -433,19 +433,6 @@ class PraxisTabsConfigEditor {
|
|
|
433
433
|
<mat-icon [praxisIcon]="'help_outline'"></mat-icon>
|
|
434
434
|
</button>
|
|
435
435
|
</mat-form-field>
|
|
436
|
-
<mat-form-field appearance="outline"><mat-label>TabIndex do conteudo</mat-label>
|
|
437
|
-
<input matInput type="number" [(ngModel)]="group.contentTabIndex" (ngModelChange)="onAppearanceChange()" />
|
|
438
|
-
<button
|
|
439
|
-
mat-icon-button
|
|
440
|
-
matSuffix
|
|
441
|
-
class="help-icon-button"
|
|
442
|
-
type="button"
|
|
443
|
-
[matTooltip]="'contentTabIndex'"
|
|
444
|
-
matTooltipPosition="above"
|
|
445
|
-
>
|
|
446
|
-
<mat-icon [praxisIcon]="'help_outline'"></mat-icon>
|
|
447
|
-
</button>
|
|
448
|
-
</mat-form-field>
|
|
449
436
|
<mat-form-field appearance="outline"><mat-label>Cor (M2)</mat-label>
|
|
450
437
|
<select matNativeControl [(ngModel)]="group.color" (ngModelChange)="onAppearanceChange()">
|
|
451
438
|
<option [ngValue]="undefined">(nenhuma)</option>
|
|
@@ -529,6 +516,12 @@ class PraxisTabsConfigEditor {
|
|
|
529
516
|
<mat-icon [praxisIcon]="'help_outline'"></mat-icon>
|
|
530
517
|
</button>
|
|
531
518
|
</mat-form-field>
|
|
519
|
+
<mat-form-field appearance="outline"><mat-label>aria-label</mat-label>
|
|
520
|
+
<input matInput [(ngModel)]="nav.ariaLabel" (ngModelChange)="onAppearanceChange()" />
|
|
521
|
+
</mat-form-field>
|
|
522
|
+
<mat-form-field appearance="outline"><mat-label>aria-labelledby</mat-label>
|
|
523
|
+
<input matInput [(ngModel)]="nav.ariaLabelledby" (ngModelChange)="onAppearanceChange()" />
|
|
524
|
+
</mat-form-field>
|
|
532
525
|
<mat-form-field appearance="outline"><mat-label>Cor (M2)</mat-label>
|
|
533
526
|
<select matNativeControl [(ngModel)]="nav.color" (ngModelChange)="onAppearanceChange()">
|
|
534
527
|
<option [ngValue]="undefined">(nenhuma)</option>
|
|
@@ -869,8 +862,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
|
|
|
869
862
|
<div class="editor-section">
|
|
870
863
|
<div class="editor-row">
|
|
871
864
|
<mat-slide-toggle [(ngModel)]="behavior.closeable" (ngModelChange)="onAppearanceChange()">Fechavel</mat-slide-toggle>
|
|
872
|
-
<mat-slide-toggle [(ngModel)]="behavior.lazyLoad" (ngModelChange)="onAppearanceChange()">Carregar sob demanda
|
|
873
|
-
<mat-slide-toggle [(ngModel)]="behavior.reorderable" (ngModelChange)="onAppearanceChange()">Reordenavel
|
|
865
|
+
<mat-slide-toggle [(ngModel)]="behavior.lazyLoad" (ngModelChange)="onAppearanceChange()">Carregar sob demanda</mat-slide-toggle>
|
|
866
|
+
<mat-slide-toggle [(ngModel)]="behavior.reorderable" (ngModelChange)="onAppearanceChange()">Reordenavel</mat-slide-toggle>
|
|
874
867
|
</div>
|
|
875
868
|
</div>
|
|
876
869
|
</mat-tab>
|
|
@@ -918,19 +911,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
|
|
|
918
911
|
<mat-icon [praxisIcon]="'help_outline'"></mat-icon>
|
|
919
912
|
</button>
|
|
920
913
|
</mat-form-field>
|
|
921
|
-
<mat-form-field appearance="outline"><mat-label>TabIndex do conteudo</mat-label>
|
|
922
|
-
<input matInput type="number" [(ngModel)]="group.contentTabIndex" (ngModelChange)="onAppearanceChange()" />
|
|
923
|
-
<button
|
|
924
|
-
mat-icon-button
|
|
925
|
-
matSuffix
|
|
926
|
-
class="help-icon-button"
|
|
927
|
-
type="button"
|
|
928
|
-
[matTooltip]="'contentTabIndex'"
|
|
929
|
-
matTooltipPosition="above"
|
|
930
|
-
>
|
|
931
|
-
<mat-icon [praxisIcon]="'help_outline'"></mat-icon>
|
|
932
|
-
</button>
|
|
933
|
-
</mat-form-field>
|
|
934
914
|
<mat-form-field appearance="outline"><mat-label>Cor (M2)</mat-label>
|
|
935
915
|
<select matNativeControl [(ngModel)]="group.color" (ngModelChange)="onAppearanceChange()">
|
|
936
916
|
<option [ngValue]="undefined">(nenhuma)</option>
|
|
@@ -1014,6 +994,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
|
|
|
1014
994
|
<mat-icon [praxisIcon]="'help_outline'"></mat-icon>
|
|
1015
995
|
</button>
|
|
1016
996
|
</mat-form-field>
|
|
997
|
+
<mat-form-field appearance="outline"><mat-label>aria-label</mat-label>
|
|
998
|
+
<input matInput [(ngModel)]="nav.ariaLabel" (ngModelChange)="onAppearanceChange()" />
|
|
999
|
+
</mat-form-field>
|
|
1000
|
+
<mat-form-field appearance="outline"><mat-label>aria-labelledby</mat-label>
|
|
1001
|
+
<input matInput [(ngModel)]="nav.ariaLabelledby" (ngModelChange)="onAppearanceChange()" />
|
|
1002
|
+
</mat-form-field>
|
|
1017
1003
|
<mat-form-field appearance="outline"><mat-label>Cor (M2)</mat-label>
|
|
1018
1004
|
<select matNativeControl [(ngModel)]="nav.color" (ngModelChange)="onAppearanceChange()">
|
|
1019
1005
|
<option [ngValue]="undefined">(nenhuma)</option>
|
|
@@ -1562,8 +1548,6 @@ const CAPS = [
|
|
|
1562
1548
|
{ path: 'behavior.closeable', category: 'behavior', valueKind: 'boolean', description: 'Show close button on tabs.' },
|
|
1563
1549
|
{ path: 'behavior.reorderable', category: 'behavior', valueKind: 'boolean', description: 'Allow reorder tabs/links.' },
|
|
1564
1550
|
{ path: 'accessibility', category: 'accessibility', valueKind: 'object', description: 'Accessibility settings.' },
|
|
1565
|
-
{ path: 'accessibility.ariaLabels', category: 'accessibility', valueKind: 'object', description: 'aria-labels map.' },
|
|
1566
|
-
{ path: 'accessibility.keyboardNavigation', category: 'accessibility', valueKind: 'boolean', description: 'Enable keyboard navigation.' },
|
|
1567
1551
|
{ path: 'accessibility.highContrast', category: 'accessibility', valueKind: 'boolean', description: 'High contrast mode.' },
|
|
1568
1552
|
{ path: 'accessibility.reduceMotion', category: 'accessibility', valueKind: 'boolean', description: 'Reduce motion.' },
|
|
1569
1553
|
{ path: 'group', category: 'group', valueKind: 'object', description: 'MatTabGroup settings.' },
|
|
@@ -1573,7 +1557,6 @@ const CAPS = [
|
|
|
1573
1557
|
{ path: 'group.ariaLabelledby', category: 'group', valueKind: 'string', description: 'aria-labelledby for tab group.' },
|
|
1574
1558
|
{ path: 'group.color', category: 'group', valueKind: 'enum', allowedValues: ENUMS.matColor, description: 'M2 color.' },
|
|
1575
1559
|
{ path: 'group.backgroundColor', category: 'group', valueKind: 'enum', allowedValues: ENUMS.matColor, description: 'M2 background color.' },
|
|
1576
|
-
{ path: 'group.contentTabIndex', category: 'group', valueKind: 'number', description: 'TabIndex for content.' },
|
|
1577
1560
|
{ path: 'group.disablePagination', category: 'group', valueKind: 'boolean', description: 'Disable pagination of header.' },
|
|
1578
1561
|
{ path: 'group.disableRipple', category: 'group', valueKind: 'boolean', description: 'Disable ripple.' },
|
|
1579
1562
|
{ path: 'group.dynamicHeight', category: 'group', valueKind: 'boolean', description: 'Enable dynamic height.' },
|
|
@@ -1584,6 +1567,8 @@ const CAPS = [
|
|
|
1584
1567
|
{ path: 'group.stretchTabs', category: 'group', valueKind: 'boolean', description: 'Stretch tabs.' },
|
|
1585
1568
|
{ path: 'nav', category: 'nav', valueKind: 'object', description: 'Tab nav settings.' },
|
|
1586
1569
|
{ path: 'nav.animationDuration', category: 'nav', valueKind: 'string', description: 'Animation duration (e.g., 500ms).' },
|
|
1570
|
+
{ path: 'nav.ariaLabel', category: 'nav', valueKind: 'string', description: 'aria-label for nav mode.' },
|
|
1571
|
+
{ path: 'nav.ariaLabelledby', category: 'nav', valueKind: 'string', description: 'aria-labelledby for nav mode.' },
|
|
1587
1572
|
{ path: 'nav.color', category: 'nav', valueKind: 'enum', allowedValues: ENUMS.matColor, description: 'M2 color.' },
|
|
1588
1573
|
{ path: 'nav.backgroundColor', category: 'nav', valueKind: 'enum', allowedValues: ENUMS.matColor, description: 'M2 background color.' },
|
|
1589
1574
|
{ path: 'nav.disablePagination', category: 'nav', valueKind: 'boolean', description: 'Disable pagination of nav.' },
|
|
@@ -2292,8 +2277,8 @@ class PraxisTabs {
|
|
|
2292
2277
|
[color]="config?.nav?.color"
|
|
2293
2278
|
[backgroundColor]="config?.nav?.backgroundColor"
|
|
2294
2279
|
[selectedIndex]="currentNavIndex()"
|
|
2295
|
-
[attr.aria-label]="config?.group?.ariaLabel || null"
|
|
2296
|
-
[attr.aria-labelledby]="config?.group?.ariaLabelledby || null"
|
|
2280
|
+
[attr.aria-label]="config?.nav?.ariaLabel || config?.group?.ariaLabel || null"
|
|
2281
|
+
[attr.aria-labelledby]="config?.nav?.ariaLabelledby || config?.group?.ariaLabelledby || null"
|
|
2297
2282
|
[animationDuration]="effectiveAnimationDuration()"
|
|
2298
2283
|
(indexFocused)="indexFocused.emit($event)"
|
|
2299
2284
|
(selectFocusedIndex)="selectFocusedIndex.emit($event)"
|
|
@@ -2548,8 +2533,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
|
|
|
2548
2533
|
[color]="config?.nav?.color"
|
|
2549
2534
|
[backgroundColor]="config?.nav?.backgroundColor"
|
|
2550
2535
|
[selectedIndex]="currentNavIndex()"
|
|
2551
|
-
[attr.aria-label]="config?.group?.ariaLabel || null"
|
|
2552
|
-
[attr.aria-labelledby]="config?.group?.ariaLabelledby || null"
|
|
2536
|
+
[attr.aria-label]="config?.nav?.ariaLabel || config?.group?.ariaLabel || null"
|
|
2537
|
+
[attr.aria-labelledby]="config?.nav?.ariaLabelledby || config?.group?.ariaLabelledby || null"
|
|
2553
2538
|
[animationDuration]="effectiveAnimationDuration()"
|
|
2554
2539
|
(indexFocused)="indexFocused.emit($event)"
|
|
2555
2540
|
(selectFocusedIndex)="selectFocusedIndex.emit($event)"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"praxisui-tabs.mjs","sources":["../../../projects/praxis-tabs/src/lib/praxis-tabs-config-editor.ts","../../../projects/praxis-tabs/src/lib/quick-setup/tabs-quick-setup.component.ts","../../../projects/praxis-tabs/src/lib/ai/tabs-ai-capabilities.ts","../../../projects/praxis-tabs/src/lib/ai/tabs-ai.adapter.ts","../../../projects/praxis-tabs/src/lib/praxis-tabs.ts","../../../projects/praxis-tabs/src/lib/praxis-tabs.metadata.ts","../../../projects/praxis-tabs/src/public-api.ts","../../../projects/praxis-tabs/src/praxisui-tabs.ts"],"sourcesContent":["import {\n Component,\n Inject,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatIconModule } from '@angular/material/icon';\nimport { PraxisIconDirective } from '@praxisui/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { DragDropModule, CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { BehaviorSubject } from 'rxjs';\nimport { SETTINGS_PANEL_DATA, SettingsValueProvider } from '@praxisui/settings-panel';\nimport { TabsMetadata } from './praxis-tabs';\nimport { ComponentMetadataRegistry, WidgetDefinition } from '@praxisui/core';\n\n@Component({\n selector: 'praxis-tabs-config-editor',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n MatTabsModule,\n MatFormFieldModule,\n MatInputModule,\n MatIconModule,\n PraxisIconDirective,\n MatButtonModule,\n MatSlideToggleModule,\n DragDropModule,\n MatTooltipModule,\n ],\n template: `\n <mat-tab-group class=\"editor-tabs\">\n <mat-tab label=\"Comportamento\">\n <div class=\"editor-section\">\n <div class=\"editor-row\">\n <mat-slide-toggle [(ngModel)]=\"behavior.closeable\" (ngModelChange)=\"onAppearanceChange()\">Fechavel</mat-slide-toggle>\n <mat-slide-toggle [(ngModel)]=\"behavior.lazyLoad\" (ngModelChange)=\"onAppearanceChange()\">Carregar sob demanda (planejado)</mat-slide-toggle>\n <mat-slide-toggle [(ngModel)]=\"behavior.reorderable\" (ngModelChange)=\"onAppearanceChange()\">Reordenavel (planejado)</mat-slide-toggle>\n </div>\n </div>\n </mat-tab>\n <mat-tab label=\"Grupo\">\n <div class=\"editor-section\">\n <div class=\"editor-grid two\">\n <mat-form-field appearance=\"outline\"><mat-label>Alinhamento das abas</mat-label>\n <select matNativeControl [(ngModel)]=\"group.alignTabs\" (ngModelChange)=\"onAppearanceChange()\">\n <option [ngValue]=\"undefined\">Padrao</option>\n <option value=\"start\">Inicio</option>\n <option value=\"center\">Centro</option>\n <option value=\"end\">Fim</option>\n </select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>Posicao do header</mat-label>\n <select matNativeControl [(ngModel)]=\"group.headerPosition\" (ngModelChange)=\"onAppearanceChange()\">\n <option [ngValue]=\"undefined\">Acima (padrao)</option>\n <option value=\"above\">Acima</option>\n <option value=\"below\">Abaixo</option>\n </select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>Indice selecionado</mat-label>\n <input matInput type=\"number\" [(ngModel)]=\"group.selectedIndex\" (ngModelChange)=\"onAppearanceChange()\" />\n <button\n mat-icon-button\n matSuffix\n class=\"help-icon-button\"\n type=\"button\"\n [matTooltip]=\"'selectedIndex'\"\n matTooltipPosition=\"above\"\n >\n <mat-icon [praxisIcon]=\"'help_outline'\"></mat-icon>\n </button>\n </mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>Duracao da animacao</mat-label>\n <input matInput [(ngModel)]=\"group.animationDuration\" (ngModelChange)=\"onAppearanceChange()\" placeholder=\"500ms\" />\n <button\n mat-icon-button\n matSuffix\n class=\"help-icon-button\"\n type=\"button\"\n [matTooltip]=\"'animationDuration'\"\n matTooltipPosition=\"above\"\n >\n <mat-icon [praxisIcon]=\"'help_outline'\"></mat-icon>\n </button>\n </mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>TabIndex do conteudo</mat-label>\n <input matInput type=\"number\" [(ngModel)]=\"group.contentTabIndex\" (ngModelChange)=\"onAppearanceChange()\" />\n <button\n mat-icon-button\n matSuffix\n class=\"help-icon-button\"\n type=\"button\"\n [matTooltip]=\"'contentTabIndex'\"\n matTooltipPosition=\"above\"\n >\n <mat-icon [praxisIcon]=\"'help_outline'\"></mat-icon>\n </button>\n </mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>Cor (M2)</mat-label>\n <select matNativeControl [(ngModel)]=\"group.color\" (ngModelChange)=\"onAppearanceChange()\">\n <option [ngValue]=\"undefined\">(nenhuma)</option>\n <option value=\"primary\">Primary</option>\n <option value=\"accent\">Accent</option>\n <option value=\"warn\">Warn</option>\n </select>\n <button\n mat-icon-button\n matSuffix\n class=\"help-icon-button\"\n type=\"button\"\n [matTooltip]=\"'Preferir tokens em Estilo.'\"\n matTooltipPosition=\"above\"\n >\n <mat-icon [praxisIcon]=\"'help_outline'\"></mat-icon>\n </button>\n </mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>Cor de fundo (M2)</mat-label>\n <select matNativeControl [(ngModel)]=\"group.backgroundColor\" (ngModelChange)=\"onAppearanceChange()\">\n <option [ngValue]=\"undefined\">(nenhuma)</option>\n <option value=\"primary\">Primary</option>\n <option value=\"accent\">Accent</option>\n <option value=\"warn\">Warn</option>\n </select>\n <button\n mat-icon-button\n matSuffix\n class=\"help-icon-button\"\n type=\"button\"\n [matTooltip]=\"'Preferir tokens em Estilo.'\"\n matTooltipPosition=\"above\"\n >\n <mat-icon [praxisIcon]=\"'help_outline'\"></mat-icon>\n </button>\n </mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>aria-label</mat-label>\n <input matInput [(ngModel)]=\"group.ariaLabel\" (ngModelChange)=\"onAppearanceChange()\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>aria-labelledby</mat-label>\n <input matInput [(ngModel)]=\"group.ariaLabelledby\" (ngModelChange)=\"onAppearanceChange()\" />\n </mat-form-field>\n </div>\n <div class=\"editor-row\">\n <mat-slide-toggle [(ngModel)]=\"group.dynamicHeight\" (ngModelChange)=\"onAppearanceChange()\">Altura dinamica</mat-slide-toggle>\n <mat-slide-toggle [(ngModel)]=\"group.fitInkBarToContent\" (ngModelChange)=\"onAppearanceChange()\">Indicador ajustado ao conteudo</mat-slide-toggle>\n <mat-slide-toggle [(ngModel)]=\"group.disablePagination\" (ngModelChange)=\"onAppearanceChange()\">Sem paginacao</mat-slide-toggle>\n <mat-slide-toggle [(ngModel)]=\"group.disableRipple\" (ngModelChange)=\"onAppearanceChange()\">Sem ripple</mat-slide-toggle>\n <mat-slide-toggle [(ngModel)]=\"group.preserveContent\" (ngModelChange)=\"onAppearanceChange()\">Preservar conteudo</mat-slide-toggle>\n <mat-slide-toggle [(ngModel)]=\"group.stretchTabs\" (ngModelChange)=\"onAppearanceChange()\">Esticar abas</mat-slide-toggle>\n </div>\n </div>\n </mat-tab>\n\n <mat-tab label=\"Navegação\">\n <div class=\"editor-section\">\n <div class=\"editor-grid two\">\n <mat-form-field appearance=\"outline\"><mat-label>Indice selecionado</mat-label>\n <input matInput type=\"number\" [(ngModel)]=\"nav.selectedIndex\" (ngModelChange)=\"onAppearanceChange()\" />\n <button\n mat-icon-button\n matSuffix\n class=\"help-icon-button\"\n type=\"button\"\n [matTooltip]=\"'selectedIndex'\"\n matTooltipPosition=\"above\"\n >\n <mat-icon [praxisIcon]=\"'help_outline'\"></mat-icon>\n </button>\n </mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>Duracao da animacao</mat-label>\n <input matInput [(ngModel)]=\"nav.animationDuration\" (ngModelChange)=\"onAppearanceChange()\" placeholder=\"500ms\" />\n <button\n mat-icon-button\n matSuffix\n class=\"help-icon-button\"\n type=\"button\"\n [matTooltip]=\"'animationDuration'\"\n matTooltipPosition=\"above\"\n >\n <mat-icon [praxisIcon]=\"'help_outline'\"></mat-icon>\n </button>\n </mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>Cor (M2)</mat-label>\n <select matNativeControl [(ngModel)]=\"nav.color\" (ngModelChange)=\"onAppearanceChange()\">\n <option [ngValue]=\"undefined\">(nenhuma)</option>\n <option value=\"primary\">Primary</option>\n <option value=\"accent\">Accent</option>\n <option value=\"warn\">Warn</option>\n </select>\n <button\n mat-icon-button\n matSuffix\n class=\"help-icon-button\"\n type=\"button\"\n [matTooltip]=\"'Preferir tokens em Estilo.'\"\n matTooltipPosition=\"above\"\n >\n <mat-icon [praxisIcon]=\"'help_outline'\"></mat-icon>\n </button>\n </mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>Cor de fundo (M2)</mat-label>\n <select matNativeControl [(ngModel)]=\"nav.backgroundColor\" (ngModelChange)=\"onAppearanceChange()\">\n <option [ngValue]=\"undefined\">(nenhuma)</option>\n <option value=\"primary\">Primary</option>\n <option value=\"accent\">Accent</option>\n <option value=\"warn\">Warn</option>\n </select>\n <button\n mat-icon-button\n matSuffix\n class=\"help-icon-button\"\n type=\"button\"\n [matTooltip]=\"'Preferir tokens em Estilo.'\"\n matTooltipPosition=\"above\"\n >\n <mat-icon [praxisIcon]=\"'help_outline'\"></mat-icon>\n </button>\n </mat-form-field>\n </div>\n <div class=\"editor-row\">\n <mat-slide-toggle [(ngModel)]=\"nav.fitInkBarToContent\" (ngModelChange)=\"onAppearanceChange()\">Indicador ajustado ao conteudo</mat-slide-toggle>\n <mat-slide-toggle [(ngModel)]=\"nav.disablePagination\" (ngModelChange)=\"onAppearanceChange()\">Sem paginacao</mat-slide-toggle>\n <mat-slide-toggle [(ngModel)]=\"nav.disableRipple\" (ngModelChange)=\"onAppearanceChange()\">Sem ripple</mat-slide-toggle>\n <mat-slide-toggle [(ngModel)]=\"nav.stretchTabs\" (ngModelChange)=\"onAppearanceChange()\">Esticar abas</mat-slide-toggle>\n </div>\n </div>\n </mat-tab>\n <mat-tab label=\"JSON\">\n <div class=\"editor-section\">\n <div class=\"editor-toolbar\">\n <button mat-button (click)=\"formatJson()\" [disabled]=\"!isValid\"> \n <mat-icon [praxisIcon]=\"'format_align_left'\"></mat-icon>Formatar\n </button>\n <button mat-button (click)=\"reset()\"> \n <mat-icon [praxisIcon]=\"'restart_alt'\"></mat-icon>Resetar\n </button>\n </div>\n\n <mat-form-field appearance=\"outline\" class=\"json-textarea-field full\">\n <mat-label>Configuracao JSON</mat-label>\n <textarea\n matInput\n [(ngModel)]=\"jsonText\"\n (ngModelChange)=\"onJsonTextChange($event)\"\n rows=\"22\"\n spellcheck=\"false\"\n class=\"editor-json\"\n ></textarea>\n <mat-hint *ngIf=\"isValid\">JSON valido</mat-hint>\n <mat-error *ngIf=\"!isValid && jsonText\">JSON invalido: {{ errorMsg }}</mat-error>\n </mat-form-field>\n </div>\n </mat-tab>\n\n <mat-tab label=\"Estilo\">\n <div class=\"editor-section editor-section-lg\">\n <div class=\"editor-row\">\n <span class=\"editor-muted\">Presets:</span>\n <button mat-button color=\"primary\" (click)=\"applyPreset('primary')\">\n <mat-icon [praxisIcon]=\"'palette'\"></mat-icon>\n Primário\n </button>\n <button mat-button (click)=\"applyPreset('neutral')\">\n <mat-icon [praxisIcon]=\"'contrast'\"></mat-icon>\n Neutro\n </button>\n <button mat-button (click)=\"applyPreset('high-contrast')\">\n <mat-icon [praxisIcon]=\"'visibility'\"></mat-icon>\n Alto contraste\n </button>\n <button mat-button (click)=\"clearTokens()\">\n <mat-icon [praxisIcon]=\"'backspace'\"></mat-icon>\n Limpar tokens\n </button>\n </div>\n\n <div class=\"editor-grid two tight\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Classe de tema (opcional)</mat-label>\n <input matInput [(ngModel)]=\"appearance.themeClass\" (ngModelChange)=\"onAppearanceChange()\" placeholder=\"ex.: tabs-accented\" />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Densidade</mat-label>\n <select matNativeControl [(ngModel)]=\"appearance.density\" (ngModelChange)=\"onAppearanceChange()\">\n <option [ngValue]=\"undefined\">Padrao</option>\n <option value=\"compact\">Compacta</option>\n <option value=\"comfortable\">Confortavel</option>\n <option value=\"spacious\">Espacosa</option>\n </select>\n </mat-form-field>\n </div>\n\n <div>\n <div class=\"editor-title-row\">\n <h3 class=\"editor-title\">Tokens (Material 3)</h3>\n <button\n mat-icon-button\n class=\"help-icon-button\"\n type=\"button\"\n [matTooltip]=\"'Valores aceitam CSS vars (ex.: var(--md-sys-color-primary)) ou cores hex/rgb.'\"\n matTooltipPosition=\"above\"\n >\n <mat-icon [praxisIcon]=\"'help_outline'\"></mat-icon>\n </button>\n </div>\n <div class=\"editor-grid two\">\n <ng-container *ngFor=\"let t of tokenList\">\n <mat-form-field appearance=\"outline\">\n <mat-label>{{ t.label }}</mat-label>\n <input matInput placeholder=\"var(--md-sys-color-primary) / #RRGGBB\" [ngModel]=\"appearance.tokens?.[t.key]\" (ngModelChange)=\"onTokenChange(t.key, $event)\" />\n </mat-form-field>\n </ng-container>\n </div>\n </div>\n\n <div>\n <h3 class=\"editor-title\">CSS personalizado</h3>\n <mat-form-field appearance=\"outline\" class=\"json-textarea-field full\">\n <mat-label>CSS a ser injetado no componente</mat-label>\n <textarea matInput rows=\"10\" [(ngModel)]=\"appearance.customCss\" (ngModelChange)=\"onAppearanceChange()\" placeholder=\".praxis-tabs-root .mdc-tab__text-label { font-weight: 600; }\"></textarea>\n </mat-form-field>\n </div>\n\n <div>\n <h3 class=\"editor-title\">Snippet SCSS (para uso em styles.scss)</h3>\n <pre class=\"editor-code\">\n@use '@angular/material' as mat;\n{{ scssSnippet() }}\n </pre>\n </div>\n </div>\n </mat-tab>\n\n <mat-tab label=\"Abas\">\n <div class=\"editor-section\">\n <button mat-stroked-button color=\"primary\" (click)=\"addTab()\"><mat-icon [praxisIcon]=\"'add'\"></mat-icon>Adicionar aba</button>\n <div *ngIf=\"editedConfig.tabs?.length; else noTabs\" class=\"editor-grid\">\n <div *ngFor=\"let t of editedConfig.tabs; let i = index\" class=\"editor-card\">\n <div class=\"editor-card-header\">\n <strong class=\"editor-card-title\">Aba #{{ i+1 }}</strong>\n <button mat-icon-button (click)=\"moveTab(i, -1)\" [disabled]=\"i===0\"><mat-icon [praxisIcon]=\"'arrow_upward'\"></mat-icon></button>\n <button mat-icon-button (click)=\"moveTab(i, 1)\" [disabled]=\"i===editedConfig.tabs!.length-1\"><mat-icon [praxisIcon]=\"'arrow_downward'\"></mat-icon></button>\n <button mat-icon-button color=\"warn\" (click)=\"removeTab(i)\"><mat-icon [praxisIcon]=\"'delete'\"></mat-icon></button>\n </div>\n <div class=\"editor-grid two tight\">\n <mat-form-field appearance=\"outline\"><mat-label>ID</mat-label>\n <input matInput [(ngModel)]=\"t.id\" (ngModelChange)=\"onAppearanceChange()\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>Rotulo</mat-label>\n <input matInput [(ngModel)]=\"t.textLabel\" (ngModelChange)=\"onAppearanceChange()\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>Classe do rotulo</mat-label>\n <input matInput [(ngModel)]=\"t.labelClass\" (ngModelChange)=\"onAppearanceChange()\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>Classe do conteudo</mat-label>\n <input matInput [(ngModel)]=\"t.bodyClass\" (ngModelChange)=\"onAppearanceChange()\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>aria-label</mat-label>\n <input matInput [(ngModel)]=\"t.ariaLabel\" (ngModelChange)=\"onAppearanceChange()\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>aria-labelledby</mat-label>\n <input matInput [(ngModel)]=\"t.ariaLabelledby\" (ngModelChange)=\"onAppearanceChange()\" />\n </mat-form-field>\n </div>\n <mat-slide-toggle [(ngModel)]=\"t.disabled\" (ngModelChange)=\"onAppearanceChange()\">Desativada</mat-slide-toggle>\n\n <!-- Widgets (componentes dinâmicos) -->\n <div class=\"editor-divider editor-grid\">\n <div class=\"editor-row\">\n <mat-form-field appearance=\"outline\" class=\"editor-field-min\">\n <mat-label>Adicionar componente</mat-label>\n <select matNativeControl [(ngModel)]=\"selectedTabWidgetId[i]\">\n <option [ngValue]=\"''\">(selecione)</option>\n <option *ngFor=\"let c of componentOptions\" [ngValue]=\"c.id\">{{ c.friendlyName || c.id }}</option>\n </select>\n </mat-form-field>\n <button mat-stroked-button (click)=\"addWidgetToTab(i)\"><mat-icon [praxisIcon]=\"'add'\"></mat-icon>Adicionar</button>\n <span class=\"editor-spacer\"></span>\n <mat-form-field appearance=\"outline\" class=\"editor-field-240\">\n <mat-label>Recurso (resourcePath)</mat-label>\n <input matInput [(ngModel)]=\"quickResourcePathTab[i]\" placeholder=\"ex.: usuarios\" />\n </mat-form-field>\n <button mat-button (click)=\"addPresetToTab(i, 'form')\"><mat-icon [praxisIcon]=\"'description'\"></mat-icon>Form</button>\n <button mat-button (click)=\"addPresetToTab(i, 'table')\"><mat-icon [praxisIcon]=\"'grid_on'\"></mat-icon>Tabela</button>\n <button mat-button (click)=\"addPresetToTab(i, 'crud')\"><mat-icon [praxisIcon]=\"'dynamic_form'\"></mat-icon>CRUD</button>\n </div>\n\n <div *ngIf=\"t.widgets?.length\" class=\"editor-grid\" cdkDropList [cdkDropListData]=\"t.widgets || []\" (cdkDropListDropped)=\"onTabWidgetDrop(i, $event)\">\n <div *ngFor=\"let w of t.widgets; let wi = index\" cdkDrag class=\"editor-card dashed\">\n <div class=\"editor-card-header\">\n <button mat-icon-button cdkDragHandle matTooltip=\"Arrastar para reordenar\" aria-label=\"Arrastar para reordenar\">\n <mat-icon [praxisIcon]=\"'drag_indicator'\"></mat-icon>\n </button>\n <strong class=\"editor-card-title\">{{ getCompName(w.id) }}</strong>\n <button mat-icon-button color=\"warn\" (click)=\"removeWidgetFromTab(i, wi)\" matTooltip=\"Remover componente\" aria-label=\"Remover componente\"><mat-icon [praxisIcon]=\"'delete'\"></mat-icon></button>\n </div>\n <div class=\"editor-grid two tight\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Inputs (JSON)</mat-label>\n <textarea matInput rows=\"4\" [ngModel]=\"stringify(w.inputs)\" (ngModelChange)=\"updateWidgetInputsTab(i, wi, $event)\"></textarea>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Outputs (JSON)</mat-label>\n <textarea matInput rows=\"4\" [ngModel]=\"stringify(w.outputs)\" (ngModelChange)=\"updateWidgetOutputsTab(i, wi, $event)\"></textarea>\n </mat-form-field>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <ng-template #noTabs><em class=\"editor-muted\">Nenhuma aba definida.</em></ng-template>\n </div>\n </mat-tab>\n\n <mat-tab label=\"Acessibilidade\">\n <div class=\"editor-section\">\n <div class=\"editor-row\">\n <mat-slide-toggle [(ngModel)]=\"accessibility.highContrast\" (ngModelChange)=\"onAppearanceChange()\">Alto contraste</mat-slide-toggle>\n <mat-slide-toggle [(ngModel)]=\"accessibility.reduceMotion\" (ngModelChange)=\"onAppearanceChange()\">Reduzir movimento</mat-slide-toggle>\n </div>\n </div>\n </mat-tab>\n\n <mat-tab label=\"Links\">\n <div class=\"editor-section\">\n <button mat-stroked-button color=\"primary\" (click)=\"addLink()\"><mat-icon [praxisIcon]=\"'add_link'\"></mat-icon>Adicionar link</button>\n <div *ngIf=\"nav.links?.length; else noLinks\" class=\"editor-grid\">\n <div *ngFor=\"let l of nav.links; let i = index\" class=\"editor-card\">\n <div class=\"editor-card-header\">\n <strong class=\"editor-card-title\">Link #{{ i+1 }}</strong>\n <button mat-icon-button (click)=\"moveLink(i, -1)\" [disabled]=\"i===0\"><mat-icon [praxisIcon]=\"'arrow_upward'\"></mat-icon></button>\n <button mat-icon-button (click)=\"moveLink(i, 1)\" [disabled]=\"i===nav.links!.length-1\"><mat-icon [praxisIcon]=\"'arrow_downward'\"></mat-icon></button>\n <button mat-icon-button color=\"warn\" (click)=\"removeLink(i)\"><mat-icon [praxisIcon]=\"'delete'\"></mat-icon></button>\n </div>\n <div class=\"editor-grid two tight\">\n <mat-form-field appearance=\"outline\"><mat-label>ID</mat-label>\n <input matInput [(ngModel)]=\"l.id\" (ngModelChange)=\"onAppearanceChange()\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>Rotulo</mat-label>\n <input matInput [(ngModel)]=\"l.label\" (ngModelChange)=\"onAppearanceChange()\" />\n </mat-form-field>\n </div>\n <div class=\"editor-row\">\n <mat-slide-toggle [(ngModel)]=\"l.active\" (ngModelChange)=\"onAppearanceChange()\">Ativo</mat-slide-toggle>\n <mat-slide-toggle [(ngModel)]=\"l.disabled\" (ngModelChange)=\"onAppearanceChange()\">Desativado</mat-slide-toggle>\n <mat-slide-toggle [(ngModel)]=\"l.disableRipple\" (ngModelChange)=\"onAppearanceChange()\">Sem ripple</mat-slide-toggle>\n <mat-slide-toggle [(ngModel)]=\"l.fitInkBarToContent\" (ngModelChange)=\"onAppearanceChange()\">Indicador ajustado ao conteudo</mat-slide-toggle>\n </div>\n\n <!-- Widgets para Links -->\n <div class=\"editor-divider editor-grid\">\n <div class=\"editor-row\">\n <mat-form-field appearance=\"outline\" class=\"editor-field-min\">\n <mat-label>Adicionar componente</mat-label>\n <select matNativeControl [(ngModel)]=\"selectedLinkWidgetId[i]\">\n <option [ngValue]=\"''\">(selecione)</option>\n <option *ngFor=\"let c of componentOptions\" [ngValue]=\"c.id\">{{ c.friendlyName || c.id }}</option>\n </select>\n </mat-form-field>\n <button mat-stroked-button (click)=\"addWidgetToLink(i)\"><mat-icon [praxisIcon]=\"'add'\"></mat-icon>Adicionar</button>\n <span class=\"editor-spacer\"></span>\n <mat-form-field appearance=\"outline\" class=\"editor-field-240\">\n <mat-label>Recurso (resourcePath)</mat-label>\n <input matInput [(ngModel)]=\"quickResourcePathLink[i]\" placeholder=\"ex.: usuarios\" />\n </mat-form-field>\n <button mat-button (click)=\"addPresetToLink(i, 'form')\"><mat-icon [praxisIcon]=\"'description'\"></mat-icon>Form</button>\n <button mat-button (click)=\"addPresetToLink(i, 'table')\"><mat-icon [praxisIcon]=\"'grid_on'\"></mat-icon>Tabela</button>\n <button mat-button (click)=\"addPresetToLink(i, 'crud')\"><mat-icon [praxisIcon]=\"'dynamic_form'\"></mat-icon>CRUD</button>\n </div>\n\n <div *ngIf=\"l.widgets?.length\" class=\"editor-grid\" cdkDropList [cdkDropListData]=\"l.widgets || []\" (cdkDropListDropped)=\"onLinkWidgetDrop(i, $event)\">\n <div *ngFor=\"let w of l.widgets; let wi = index\" cdkDrag class=\"editor-card dashed\">\n <div class=\"editor-card-header\">\n <button mat-icon-button cdkDragHandle matTooltip=\"Arrastar para reordenar\" aria-label=\"Arrastar para reordenar\">\n <mat-icon [praxisIcon]=\"'drag_indicator'\"></mat-icon>\n </button>\n <strong class=\"editor-card-title\">{{ getCompName(w.id) }}</strong>\n <button mat-icon-button color=\"warn\" (click)=\"removeWidgetFromLink(i, wi)\" matTooltip=\"Remover componente\" aria-label=\"Remover componente\"><mat-icon [praxisIcon]=\"'delete'\"></mat-icon></button>\n </div>\n <div class=\"editor-grid two tight\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Inputs (JSON)</mat-label>\n <textarea matInput rows=\"4\" [ngModel]=\"stringify(w.inputs)\" (ngModelChange)=\"updateWidgetInputsLink(i, wi, $event)\"></textarea>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Outputs (JSON)</mat-label>\n <textarea matInput rows=\"4\" [ngModel]=\"stringify(w.outputs)\" (ngModelChange)=\"updateWidgetOutputsLink(i, wi, $event)\"></textarea>\n </mat-form-field>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <ng-template #noLinks><em class=\"editor-muted\">Nenhum link definido.</em></ng-template>\n </div>\n </mat-tab>\n </mat-tab-group>\n `,\n styles: [`\n :host {\n display: block;\n color: var(--md-sys-color-on-surface);\n }\n .editor-tabs {\n --editor-surface: var(--md-sys-color-surface-container-lowest, var(--md-sys-color-surface));\n --editor-border: 1px solid var(--md-sys-color-outline-variant);\n --editor-radius: 12px;\n --editor-muted: var(--md-sys-color-on-surface-variant);\n }\n .editor-section {\n padding: 12px;\n display: grid;\n gap: 12px;\n background: var(--editor-surface);\n border: var(--editor-border);\n border-radius: var(--editor-radius);\n }\n .editor-section-lg { gap: 16px; }\n .editor-row {\n display: flex;\n gap: 10px;\n flex-wrap: wrap;\n align-items: center;\n }\n .editor-grid {\n display: grid;\n gap: 12px;\n }\n .editor-grid.two {\n grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));\n }\n .editor-grid.tight { gap: 8px; }\n .editor-toolbar {\n display: flex;\n gap: 8px;\n flex-wrap: wrap;\n align-items: center;\n }\n .editor-muted { color: var(--editor-muted); }\n .editor-title { margin: 6px 0 8px; font-size: 1rem; }\n .editor-title-row { display: flex; align-items: center; gap: 8px; }\n .editor-code {\n white-space: pre-wrap;\n background: var(--md-sys-color-surface-container);\n padding: 8px;\n border-radius: 6px;\n border: 1px solid var(--md-sys-color-outline-variant);\n }\n .editor-card {\n border: 1px solid var(--md-sys-color-outline-variant);\n padding: 10px;\n border-radius: 10px;\n display: grid;\n gap: 8px;\n background: var(--md-sys-color-surface);\n }\n .editor-card.dashed { border-style: dashed; }\n .editor-card-header {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n .editor-card-title { flex: 1; font-weight: 600; }\n .editor-divider {\n border-top: 1px solid var(--md-sys-color-outline-variant);\n padding-top: 8px;\n }\n .editor-spacer { flex: 1; }\n .editor-field-min { min-width: 260px; }\n .editor-section .editor-field-min { width: 260px; max-width: 260px; }\n .editor-field-240 { width: 240px; }\n .editor-section .editor-field-240 { width: 240px; max-width: 240px; }\n .editor-json { font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace; }\n .editor-section .mat-mdc-form-field {\n width: 100%;\n max-width: 520px;\n --mdc-outlined-text-field-container-height: 48px;\n --mdc-outlined-text-field-outline-color: var(--md-sys-color-outline-variant);\n --mdc-outlined-text-field-hover-outline-color: var(--md-sys-color-outline);\n --mdc-outlined-text-field-focus-outline-color: var(--md-sys-color-primary);\n --mdc-outlined-text-field-error-outline-color: var(--md-sys-color-error);\n --mdc-outlined-text-field-error-focus-outline-color: var(--md-sys-color-error);\n --mdc-outlined-text-field-error-hover-outline-color: var(--md-sys-color-error);\n --mdc-outlined-text-field-label-text-color: var(--md-sys-color-on-surface-variant);\n --mdc-outlined-text-field-input-text-color: var(--md-sys-color-on-surface);\n --mdc-outlined-text-field-supporting-text-color: var(--md-sys-color-on-surface-variant);\n }\n .editor-section .mat-mdc-form-field.full { max-width: none; }\n .help-icon-button {\n --mdc-icon-button-state-layer-size: 28px;\n --mdc-icon-button-icon-size: 18px;\n width: 28px;\n height: 28px;\n padding: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n margin-right: -4px;\n }\n .help-icon-button mat-icon { font-size: 18px; width: 18px; height: 18px; }\n .mat-mdc-form-field-icon-suffix { align-self: center; }\n `],\n})\nexport class PraxisTabsConfigEditor implements SettingsValueProvider {\n editedConfig: TabsMetadata;\n private initialConfig: TabsMetadata;\n jsonText = '';\n isValid = true;\n errorMsg = '';\n componentOptions: Array<{ id: string; friendlyName?: string }> = [];\n selectedTabWidgetId: Record<number, string> = {};\n selectedLinkWidgetId: Record<number, string> = {};\n quickResourcePathTab: Record<number, string> = {};\n quickResourcePathLink: Record<number, string> = {};\n\n // Simplified token list we support at runtime\n tokenList = [\n { key: 'active-indicator-color', label: 'Indicador ativo' },\n { key: 'active-label-text-color', label: 'Texto ativo' },\n { key: 'active-hover-indicator-color', label: 'Indicador ativo (hover)' },\n { key: 'active-hover-label-text-color', label: 'Texto ativo (hover)' },\n { key: 'active-focus-indicator-color', label: 'Indicador ativo (focus)' },\n { key: 'active-focus-label-text-color', label: 'Texto ativo (focus)' },\n { key: 'inactive-label-text-color', label: 'Texto inativo' },\n { key: 'inactive-hover-label-text-color', label: 'Texto inativo (hover)' },\n { key: 'inactive-focus-label-text-color', label: 'Texto inativo (focus)' },\n { key: 'pagination-icon-color', label: 'Ícones de paginação' },\n { key: 'divider-color', label: 'Divisor/linha' },\n { key: 'background-color', label: 'Fundo do header' },\n ] as const;\n\n private presets: Record<string, Record<string, string>> = {\n primary: {\n 'active-indicator-color': 'var(--md-sys-color-primary)',\n 'active-label-text-color': 'var(--md-sys-color-primary)',\n 'inactive-label-text-color': 'var(--md-sys-color-on-surface-variant)',\n 'inactive-hover-label-text-color': 'var(--md-sys-color-on-surface)',\n 'divider-color': 'var(--md-sys-color-outline-variant)',\n 'background-color': 'var(--md-sys-color-surface-container)',\n 'pagination-icon-color': 'var(--md-sys-color-on-surface)'\n },\n neutral: {\n 'active-indicator-color': 'var(--md-sys-color-on-surface)',\n 'active-label-text-color': 'var(--md-sys-color-on-surface)',\n 'inactive-label-text-color': 'var(--md-sys-color-on-surface-variant)',\n 'inactive-hover-label-text-color': 'var(--md-sys-color-on-surface)',\n 'divider-color': 'var(--md-sys-color-outline-variant)',\n 'background-color': 'var(--md-sys-color-surface-container)',\n 'pagination-icon-color': 'var(--md-sys-color-on-surface)'\n },\n 'high-contrast': {\n 'active-indicator-color': 'var(--md-sys-color-primary)',\n 'active-label-text-color': 'var(--md-sys-color-on-primary)',\n 'inactive-label-text-color': 'var(--md-sys-color-on-surface-variant)',\n 'inactive-hover-label-text-color': 'var(--md-sys-color-on-surface)',\n 'divider-color': 'var(--md-sys-color-outline)',\n 'background-color': 'var(--md-sys-color-surface)',\n 'pagination-icon-color': 'var(--md-sys-color-on-surface)'\n }\n };\n\n isDirty$ = new BehaviorSubject<boolean>(false);\n isValid$ = new BehaviorSubject<boolean>(true);\n isBusy$ = new BehaviorSubject<boolean>(false);\n\n constructor(@Inject(SETTINGS_PANEL_DATA) data: any, private registry: ComponentMetadataRegistry) {\n const cfg: TabsMetadata = data?.config || data || ({} as TabsMetadata);\n this.initialConfig = structuredClone(cfg);\n this.editedConfig = structuredClone(cfg);\n this.isValid$.next(true);\n this.jsonText = this.stringify(this.editedConfig);\n this.updateDirty();\n this.componentOptions = this.registry.getAll().map((m) => ({ id: m.id, friendlyName: m.friendlyName }));\n }\n\n private updateDirty(): void {\n this.isDirty$.next(\n JSON.stringify(this.initialConfig) !== JSON.stringify(this.editedConfig),\n );\n }\n\n onJsonTextChange(text: string): void {\n try {\n const parsed = JSON.parse(text) as TabsMetadata;\n this.errorMsg = '';\n this.isValid = true;\n this.isValid$.next(true);\n this.editedConfig = parsed;\n this.updateDirty();\n } catch (e: any) {\n this.isValid = false;\n this.isValid$.next(false);\n this.errorMsg = e?.message || 'Erro de sintaxe JSON';\n }\n }\n\n // stringify helper is public to be used in the template\n\n formatJson(): void {\n if (!this.isValid) return;\n this.jsonText = this.stringify(this.editedConfig);\n }\n\n getSettingsValue(): any {\n return { config: this.editedConfig };\n }\n\n onSave(): any {\n return { config: this.editedConfig };\n }\n\n reset(): void {\n this.editedConfig = structuredClone(this.initialConfig);\n this.jsonText = this.stringify(this.editedConfig);\n this.isValid = true;\n this.isValid$.next(true);\n this.updateDirty();\n }\n\n // Appearance helpers\n get appearance(): NonNullable<TabsMetadata['appearance']> {\n const ap = (this.editedConfig.appearance ??= {} as any);\n (ap.tokens ??= {} as any);\n return ap as any;\n }\n\n onAppearanceChange(): void {\n this.updateDirty();\n this.jsonText = this.stringify(this.editedConfig);\n }\n\n onTokenChange(key: string, value: string): void {\n const ap = this.appearance;\n const tokens = (ap.tokens = ap.tokens || {});\n if (!value) {\n delete tokens[key as keyof typeof tokens];\n } else {\n (tokens as any)[key] = value;\n }\n this.onAppearanceChange();\n }\n\n clearTokens(): void {\n const ap = this.appearance;\n ap.tokens = {} as any;\n this.onAppearanceChange();\n }\n\n applyPreset(id: 'primary' | 'neutral' | 'high-contrast'): void {\n const preset = this.presets[id];\n if (!preset) return;\n const ap = this.appearance;\n const tokens = (ap.tokens = ap.tokens || {});\n for (const [k, v] of Object.entries(preset)) {\n (tokens as any)[k] = v;\n }\n this.onAppearanceChange();\n }\n\n scssSnippet(): string {\n const tokens = this.editedConfig.appearance?.tokens || {};\n const entries = Object.entries(tokens).filter(([, v]) => !!v);\n const selector = this.editedConfig.appearance?.themeClass\n ? `.${this.editedConfig.appearance.themeClass}`\n : ':root';\n const map = entries.map(([k, v]) => ` ${k}: ${v},`).join('\\n');\n return `${selector} {\\n @include mat.tabs-overrides((\\n${map}\\n ));\\n}`;\n }\n\n // Group/Nav helpers and list editors\n get group(): any {\n if (!this.editedConfig.group) this.editedConfig.group = {} as any;\n return this.editedConfig.group as any;\n }\n\n get nav(): any {\n const nav = (this.editedConfig.nav ??= { links: [] } as any);\n if (!nav.links) nav.links = [] as any;\n return nav as any;\n }\n\n get behavior(): any {\n if (!this.editedConfig.behavior) this.editedConfig.behavior = {} as any;\n // Default to lazy load to improve UX/perf with heavy widgets (table/form)\n if (typeof (this.editedConfig.behavior as any).lazyLoad === 'undefined') {\n (this.editedConfig.behavior as any).lazyLoad = true;\n }\n return this.editedConfig.behavior as any;\n }\n\n get accessibility(): any {\n if (!this.editedConfig.accessibility) this.editedConfig.accessibility = {} as any;\n return this.editedConfig.accessibility as any;\n }\n\n addTab(): void {\n if (!this.editedConfig.tabs) this.editedConfig.tabs = [];\n this.editedConfig.tabs.push({ id: `tab${(this.editedConfig.tabs.length + 1)}`, textLabel: 'Nova aba' } as any);\n this.onAppearanceChange();\n }\n\n removeTab(index: number): void {\n this.editedConfig.tabs?.splice(index, 1);\n this.onAppearanceChange();\n }\n\n moveTab(index: number, delta: number): void {\n if (!this.editedConfig.tabs) return;\n const i2 = index + delta;\n if (i2 < 0 || i2 >= this.editedConfig.tabs.length) return;\n const [item] = this.editedConfig.tabs.splice(index, 1);\n this.editedConfig.tabs.splice(i2, 0, item);\n this.onAppearanceChange();\n }\n // ===== Widgets (Tabs) =====\n addWidgetToTab(tabIndex: number): void {\n const id = (this.selectedTabWidgetId[tabIndex] || '').trim();\n if (!id) return;\n const t = this.editedConfig.tabs![tabIndex] as any;\n t.widgets = t.widgets || [];\n t.widgets.push({ id } as WidgetDefinition);\n this.onAppearanceChange();\n }\n removeWidgetFromTab(tabIndex: number, widgetIndex: number): void {\n const t = this.editedConfig.tabs![tabIndex] as any;\n if (!t.widgets) return;\n t.widgets.splice(widgetIndex, 1);\n this.onAppearanceChange();\n }\n updateWidgetInputsTab(tabIndex: number, widgetIndex: number, text: string): void {\n const t = this.editedConfig.tabs![tabIndex] as any;\n try { const obj = text ? JSON.parse(text) : undefined; t.widgets[widgetIndex].inputs = obj; this.onAppearanceChange(); } catch {}\n }\n updateWidgetOutputsTab(tabIndex: number, widgetIndex: number, text: string): void {\n const t = this.editedConfig.tabs![tabIndex] as any;\n try { const obj = text ? JSON.parse(text) : undefined; t.widgets[widgetIndex].outputs = obj; this.onAppearanceChange(); } catch {}\n }\n addPresetToTab(tabIndex: number, type: 'form' | 'table' | 'crud'): void {\n const rp = (this.quickResourcePathTab[tabIndex] || '').trim();\n if (!rp) return;\n const t = this.editedConfig.tabs![tabIndex] as any;\n t.widgets = t.widgets || [];\n if (type === 'form') {\n t.widgets.push({ id: 'praxis-dynamic-form', inputs: { resourcePath: rp } });\n } else if (type === 'table') {\n t.widgets.push({ id: 'praxis-table', inputs: { resourcePath: rp, tableId: rp } });\n } else {\n t.widgets.push({ id: 'praxis-crud', inputs: { crudId: rp, metadata: { resource: { path: rp } } } });\n }\n this.onAppearanceChange();\n }\n\n addLink(): void {\n if (!this.nav.links) this.nav.links = [];\n this.nav.links.push({ id: `link${this.nav.links.length + 1}`, label: 'Novo link' });\n this.onAppearanceChange();\n }\n\n removeLink(index: number): void {\n if (!this.nav.links) return;\n this.nav.links.splice(index, 1);\n this.onAppearanceChange();\n }\n\n moveLink(index: number, delta: number): void {\n if (!this.nav.links) return;\n const i2 = index + delta;\n if (i2 < 0 || i2 >= this.nav.links.length) return;\n const [item] = this.nav.links.splice(index, 1);\n this.nav.links.splice(i2, 0, item);\n this.onAppearanceChange();\n }\n // ===== Widgets (Links) =====\n addWidgetToLink(linkIndex: number): void {\n const id = (this.selectedLinkWidgetId[linkIndex] || '').trim();\n if (!id) return;\n const l = this.nav.links[linkIndex] as any;\n l.widgets = l.widgets || [];\n l.widgets.push({ id } as WidgetDefinition);\n this.onAppearanceChange();\n }\n removeWidgetFromLink(linkIndex: number, widgetIndex: number): void {\n const l = this.nav.links[linkIndex] as any;\n if (!l.widgets) return;\n l.widgets.splice(widgetIndex, 1);\n this.onAppearanceChange();\n }\n updateWidgetInputsLink(linkIndex: number, widgetIndex: number, text: string): void {\n const l = this.nav.links[linkIndex] as any;\n try { const obj = text ? JSON.parse(text) : undefined; l.widgets[widgetIndex].inputs = obj; this.onAppearanceChange(); } catch {}\n }\n updateWidgetOutputsLink(linkIndex: number, widgetIndex: number, text: string): void {\n const l = this.nav.links[linkIndex] as any;\n try { const obj = text ? JSON.parse(text) : undefined; l.widgets[widgetIndex].outputs = obj; this.onAppearanceChange(); } catch {}\n }\n addPresetToLink(linkIndex: number, type: 'form' | 'table' | 'crud'): void {\n const rp = (this.quickResourcePathLink[linkIndex] || '').trim();\n if (!rp) return;\n const l = this.nav.links[linkIndex] as any;\n l.widgets = l.widgets || [];\n if (type === 'form') {\n l.widgets.push({ id: 'praxis-dynamic-form', inputs: { resourcePath: rp } });\n } else if (type === 'table') {\n l.widgets.push({ id: 'praxis-table', inputs: { resourcePath: rp, tableId: rp } });\n } else {\n l.widgets.push({ id: 'praxis-crud', inputs: { crudId: rp, metadata: { resource: { path: rp } } } });\n }\n this.onAppearanceChange();\n }\n\n stringify(v: any): string { try { return v ? JSON.stringify(v, null, 2) : ''; } catch { return ''; } }\n getCompName(id: string): string { const c = this.componentOptions.find(o => o.id === id); return c?.friendlyName || id; }\n\n // Reorder handlers (drag & drop)\n onTabWidgetDrop(tabIndex: number, event: CdkDragDrop<WidgetDefinition[]>): void {\n const t = this.editedConfig.tabs?.[tabIndex] as any;\n if (!t?.widgets) return;\n moveItemInArray(t.widgets, event.previousIndex, event.currentIndex);\n this.onAppearanceChange();\n }\n\n onLinkWidgetDrop(linkIndex: number, event: CdkDragDrop<WidgetDefinition[]>): void {\n const l = this.nav.links?.[linkIndex] as any;\n if (!l?.widgets) return;\n moveItemInArray(l.widgets, event.previousIndex, event.currentIndex);\n this.onAppearanceChange();\n }\n}\n","import { Component, Inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatIconModule } from '@angular/material/icon';\nimport { PraxisIconDirective } from '@praxisui/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { BehaviorSubject } from 'rxjs';\nimport { SETTINGS_PANEL_DATA, SettingsValueProvider } from '@praxisui/settings-panel';\nimport { TabsMetadata } from '../praxis-tabs';\n\ninterface QuickSetupModel {\n mode: 'group' | 'nav';\n labels: string[];\n dynamicHeight?: boolean;\n stretchTabs?: boolean;\n}\n\n@Component({\n selector: 'praxis-tabs-quick-setup',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n MatFormFieldModule,\n MatInputModule,\n MatIconModule,\n PraxisIconDirective,\n MatButtonModule,\n MatSlideToggleModule,\n ],\n template: `\n <div class=\"setup-root\">\n <div class=\"setup-row\">\n <button mat-stroked-button [color]=\"model.mode==='group' ? 'primary' : undefined\" (click)=\"setMode('group')\">\n <mat-icon [praxisIcon]=\"'tab'\"></mat-icon>\n Grupo de abas\n </button>\n <button mat-stroked-button [color]=\"model.mode==='nav' ? 'primary' : undefined\" (click)=\"setMode('nav')\">\n <mat-icon [praxisIcon]=\"'segment'\"></mat-icon>\n Navegacao por links\n </button>\n </div>\n\n <div class=\"setup-grid\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Adicionar rotulo</mat-label>\n <input matInput [(ngModel)]=\"newLabel\" (keyup.enter)=\"addLabel()\" placeholder=\"Ex.: Dados Gerais\" />\n </mat-form-field>\n <button mat-flat-button color=\"primary\" (click)=\"addLabel()\">\n <mat-icon [praxisIcon]=\"'add'\"></mat-icon>\n Adicionar\n </button>\n </div>\n\n <div *ngIf=\"model.labels.length; else emptyLabels\" class=\"setup-row wrap\">\n <div *ngFor=\"let l of model.labels; let i = index\" class=\"chip\">\n <span>{{ l }}</span>\n <button mat-icon-button (click)=\"removeLabel(i)\" aria-label=\"Remover rotulo\"><mat-icon [praxisIcon]=\"'close'\"></mat-icon></button>\n </div>\n </div>\n <ng-template #emptyLabels>\n <em class=\"hint\">Adicione um ou mais rotulos para criar as abas.</em>\n </ng-template>\n\n <div class=\"setup-row\">\n <mat-slide-toggle [(ngModel)]=\"model.dynamicHeight\">Altura dinamica</mat-slide-toggle>\n <mat-slide-toggle [(ngModel)]=\"model.stretchTabs\">Esticar abas</mat-slide-toggle>\n </div>\n </div>\n `,\n styles: [`\n :host {\n display: block;\n color: var(--md-sys-color-on-surface);\n }\n .setup-root {\n display: grid;\n gap: 12px;\n padding: 8px;\n background: var(--md-sys-color-surface-container-lowest, var(--md-sys-color-surface));\n border: 1px solid var(--md-sys-color-outline-variant);\n border-radius: 12px;\n }\n .setup-row {\n display: flex;\n gap: 12px;\n align-items: center;\n flex-wrap: wrap;\n }\n .setup-row.wrap { flex-wrap: wrap; }\n .setup-grid {\n display: grid;\n grid-template-columns: 1fr auto;\n gap: 8px;\n align-items: start;\n }\n .setup-root .mat-mdc-form-field {\n width: 100%;\n max-width: 520px;\n --mdc-outlined-text-field-container-height: 48px;\n --mdc-outlined-text-field-outline-color: var(--md-sys-color-outline-variant);\n --mdc-outlined-text-field-hover-outline-color: var(--md-sys-color-outline);\n --mdc-outlined-text-field-focus-outline-color: var(--md-sys-color-primary);\n --mdc-outlined-text-field-error-outline-color: var(--md-sys-color-error);\n --mdc-outlined-text-field-error-focus-outline-color: var(--md-sys-color-error);\n --mdc-outlined-text-field-error-hover-outline-color: var(--md-sys-color-error);\n --mdc-outlined-text-field-label-text-color: var(--md-sys-color-on-surface-variant);\n --mdc-outlined-text-field-input-text-color: var(--md-sys-color-on-surface);\n --mdc-outlined-text-field-supporting-text-color: var(--md-sys-color-on-surface-variant);\n }\n .chip {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 8px;\n border: 1px solid var(--md-sys-color-outline-variant);\n border-radius: 16px;\n background: var(--md-sys-color-surface);\n }\n .hint { color: var(--md-sys-color-on-surface-variant); }\n `],\n})\nexport class TabsQuickSetupComponent implements SettingsValueProvider {\n model: QuickSetupModel = { mode: 'group', labels: [], dynamicHeight: true, stretchTabs: true };\n private initial: QuickSetupModel = { ...this.model };\n newLabel = '';\n\n isDirty$ = new BehaviorSubject<boolean>(false);\n isValid$ = new BehaviorSubject<boolean>(false);\n isBusy$ = new BehaviorSubject<boolean>(false);\n\n constructor(@Inject(SETTINGS_PANEL_DATA) data: any) {\n // Optionally seed from existing config\n const cfg = (data?.config as TabsMetadata | undefined) || undefined;\n if (cfg) {\n if (cfg.tabs?.length) {\n this.model.mode = 'group';\n this.model.labels = cfg.tabs\n .map((t) => String(t.textLabel || '').trim())\n .filter((label) => label.length > 0);\n this.model.dynamicHeight = cfg.group?.dynamicHeight ?? true;\n this.model.stretchTabs = cfg.group?.stretchTabs ?? true;\n } else if (cfg.nav?.links?.length) {\n this.model.mode = 'nav';\n this.model.labels = cfg.nav.links\n .map((l) => String(l.label || '').trim())\n .filter((label) => label.length > 0);\n this.model.stretchTabs = cfg.nav.stretchTabs ?? true;\n }\n this.initial = { ...this.model, labels: [...this.model.labels] };\n }\n this.updateState();\n }\n\n private normalizedLabels(): string[] {\n return this.model.labels\n .map((label) => String(label || '').trim())\n .filter((label) => label.length > 0);\n }\n\n private updateState(): void {\n const dirty = JSON.stringify(this.model) !== JSON.stringify(this.initial);\n this.isDirty$.next(dirty);\n this.isValid$.next(this.normalizedLabels().length > 0);\n }\n\n setMode(mode: 'group' | 'nav'): void {\n this.model.mode = mode;\n this.updateState();\n }\n\n addLabel(): void {\n const l = (this.newLabel || '').trim();\n if (!l) return;\n this.model.labels.push(l);\n this.newLabel = '';\n this.updateState();\n }\n\n removeLabel(i: number): void {\n this.model.labels.splice(i, 1);\n this.updateState();\n }\n\n private buildConfig(): TabsMetadata {\n const labels = this.normalizedLabels();\n if (this.model.mode === 'group') {\n return {\n group: {\n dynamicHeight: !!this.model.dynamicHeight,\n stretchTabs: !!this.model.stretchTabs,\n selectedIndex: 0,\n },\n tabs: labels.map((label, idx) => ({ id: `tab${idx + 1}`, textLabel: label })),\n };\n }\n return {\n nav: {\n selectedIndex: 0,\n stretchTabs: !!this.model.stretchTabs,\n links: labels.map((label, idx) => ({ id: `link${idx + 1}`, label })),\n },\n } as TabsMetadata;\n }\n\n getSettingsValue(): any {\n return { config: this.buildConfig() };\n }\n\n onSave(): any {\n return { config: this.buildConfig() };\n }\n}\n","/**\n * Capabilities catalog for Praxis Tabs (TabsMetadata).\n * Paths follow TabsMetadata shape (patches are merged at config root).\n */\n\nimport type {\n AiCapability,\n AiCapabilityCatalog,\n AiCapabilityCategory,\n AiValueKind,\n} from '@praxisui/core';\n\ndeclare module '@praxisui/core' {\n interface AiCapabilityCategoryMap {\n meta: true;\n group: true;\n nav: true;\n tabs: true;\n }\n}\n\nexport type CapabilityCategory = AiCapabilityCategory;\nexport type ValueKind = AiValueKind;\n\nexport interface Capability extends AiCapability {\n category: CapabilityCategory;\n}\n\nexport interface CapabilityCatalog extends AiCapabilityCatalog {\n capabilities: Capability[];\n}\n\nconst ENUMS: Record<string, Array<string | number>> = {\n appearanceDensity: ['compact', 'comfortable', 'spacious'],\n alignTabs: ['start', 'center', 'end'],\n headerPosition: ['above', 'below'],\n matColor: ['primary', 'accent', 'warn'],\n};\n\nconst TOKENS = [\n 'active-indicator-color',\n 'active-label-text-color',\n 'active-hover-indicator-color',\n 'active-hover-label-text-color',\n 'active-focus-indicator-color',\n 'active-focus-label-text-color',\n 'inactive-label-text-color',\n 'inactive-hover-label-text-color',\n 'inactive-focus-label-text-color',\n 'inactive-ripple-color',\n 'pagination-icon-color',\n 'divider-color',\n 'background-color',\n];\n\nconst TOKEN_CAPS: Capability[] = TOKENS.map((t): Capability => ({\n path: `appearance.tokens.${t}`,\n category: 'appearance',\n valueKind: 'string',\n description: `Token ${t} (CSS color or var).`,\n}));\n\nconst CAPS: Capability[] = [\n { path: 'meta', category: 'meta', valueKind: 'object', description: 'Metadata bag for tabs.' },\n\n { path: 'appearance', category: 'appearance', valueKind: 'object', description: 'Appearance settings.' },\n { path: 'appearance.density', category: 'appearance', valueKind: 'enum', allowedValues: ENUMS.appearanceDensity, description: 'Density preset.' },\n { path: 'appearance.themeClass', category: 'appearance', valueKind: 'string', description: 'Theme CSS class applied to root.' },\n { path: 'appearance.customCss', category: 'appearance', valueKind: 'string', description: 'Custom CSS injected into component.', safetyNotes: 'CSS is injected as raw string.' },\n { path: 'appearance.tokens', category: 'appearance', valueKind: 'object', description: 'Style tokens mapped to runtime CSS.' },\n ...TOKEN_CAPS,\n\n { path: 'behavior', category: 'behavior', valueKind: 'object', description: 'Behavior settings.' },\n { path: 'behavior.lazyLoad', category: 'behavior', valueKind: 'boolean', description: 'Lazy load tab content.' },\n { path: 'behavior.closeable', category: 'behavior', valueKind: 'boolean', description: 'Show close button on tabs.' },\n { path: 'behavior.reorderable', category: 'behavior', valueKind: 'boolean', description: 'Allow reorder tabs/links.' },\n\n { path: 'accessibility', category: 'accessibility', valueKind: 'object', description: 'Accessibility settings.' },\n { path: 'accessibility.ariaLabels', category: 'accessibility', valueKind: 'object', description: 'aria-labels map.' },\n { path: 'accessibility.keyboardNavigation', category: 'accessibility', valueKind: 'boolean', description: 'Enable keyboard navigation.' },\n { path: 'accessibility.highContrast', category: 'accessibility', valueKind: 'boolean', description: 'High contrast mode.' },\n { path: 'accessibility.reduceMotion', category: 'accessibility', valueKind: 'boolean', description: 'Reduce motion.' },\n\n { path: 'group', category: 'group', valueKind: 'object', description: 'MatTabGroup settings.' },\n { path: 'group.alignTabs', category: 'group', valueKind: 'enum', allowedValues: ENUMS.alignTabs, description: 'Align tabs in header.' },\n { path: 'group.animationDuration', category: 'group', valueKind: 'string', description: 'Animation duration (e.g., 500ms).' },\n { path: 'group.ariaLabel', category: 'group', valueKind: 'string', description: 'aria-label for tab group.' },\n { path: 'group.ariaLabelledby', category: 'group', valueKind: 'string', description: 'aria-labelledby for tab group.' },\n { path: 'group.color', category: 'group', valueKind: 'enum', allowedValues: ENUMS.matColor, description: 'M2 color.' },\n { path: 'group.backgroundColor', category: 'group', valueKind: 'enum', allowedValues: ENUMS.matColor, description: 'M2 background color.' },\n { path: 'group.contentTabIndex', category: 'group', valueKind: 'number', description: 'TabIndex for content.' },\n { path: 'group.disablePagination', category: 'group', valueKind: 'boolean', description: 'Disable pagination of header.' },\n { path: 'group.disableRipple', category: 'group', valueKind: 'boolean', description: 'Disable ripple.' },\n { path: 'group.dynamicHeight', category: 'group', valueKind: 'boolean', description: 'Enable dynamic height.' },\n { path: 'group.fitInkBarToContent', category: 'group', valueKind: 'boolean', description: 'Fit ink bar to content.' },\n { path: 'group.headerPosition', category: 'group', valueKind: 'enum', allowedValues: ENUMS.headerPosition, description: 'Header position.' },\n { path: 'group.preserveContent', category: 'group', valueKind: 'boolean', description: 'Preserve content of inactive tabs.' },\n { path: 'group.selectedIndex', category: 'group', valueKind: 'number', description: 'Selected tab index.' },\n { path: 'group.stretchTabs', category: 'group', valueKind: 'boolean', description: 'Stretch tabs.' },\n\n { path: 'nav', category: 'nav', valueKind: 'object', description: 'Tab nav settings.' },\n { path: 'nav.animationDuration', category: 'nav', valueKind: 'string', description: 'Animation duration (e.g., 500ms).' },\n { path: 'nav.color', category: 'nav', valueKind: 'enum', allowedValues: ENUMS.matColor, description: 'M2 color.' },\n { path: 'nav.backgroundColor', category: 'nav', valueKind: 'enum', allowedValues: ENUMS.matColor, description: 'M2 background color.' },\n { path: 'nav.disablePagination', category: 'nav', valueKind: 'boolean', description: 'Disable pagination of nav.' },\n { path: 'nav.disableRipple', category: 'nav', valueKind: 'boolean', description: 'Disable ripple.' },\n { path: 'nav.fitInkBarToContent', category: 'nav', valueKind: 'boolean', description: 'Fit ink bar to content.' },\n { path: 'nav.selectedIndex', category: 'nav', valueKind: 'number', description: 'Selected nav link index.' },\n { path: 'nav.stretchTabs', category: 'nav', valueKind: 'boolean', description: 'Stretch nav tabs.' },\n { path: 'nav.links', category: 'nav', valueKind: 'array', description: 'Nav links array.' },\n { path: 'nav.links[].id', category: 'nav', valueKind: 'string', description: 'Link id.' },\n { path: 'nav.links[].label', category: 'nav', valueKind: 'string', description: 'Link label.' },\n { path: 'nav.links[].active', category: 'nav', valueKind: 'boolean', description: 'Link active flag.' },\n { path: 'nav.links[].disabled', category: 'nav', valueKind: 'boolean', description: 'Disable link.' },\n { path: 'nav.links[].disableRipple', category: 'nav', valueKind: 'boolean', description: 'Disable ripple on link.' },\n { path: 'nav.links[].fitInkBarToContent', category: 'nav', valueKind: 'boolean', description: 'Fit ink bar to link content.' },\n { path: 'nav.links[].content', category: 'nav', valueKind: 'array', description: 'Dynamic field metadata list.' },\n { path: 'nav.links[].widgets', category: 'nav', valueKind: 'array', description: 'Widget definitions for link content.' },\n\n { path: 'tabs', category: 'tabs', valueKind: 'array', description: 'Tabs array.' },\n { path: 'tabs[].id', category: 'tabs', valueKind: 'string', description: 'Tab id.' },\n { path: 'tabs[].textLabel', category: 'tabs', valueKind: 'string', description: 'Tab label.' },\n { path: 'tabs[].labelClass', category: 'tabs', valueKind: 'string', description: 'Label class (string or string[]).' },\n { path: 'tabs[].bodyClass', category: 'tabs', valueKind: 'string', description: 'Body class (string or string[]).' },\n { path: 'tabs[].ariaLabel', category: 'tabs', valueKind: 'string', description: 'aria-label for tab.' },\n { path: 'tabs[].ariaLabelledby', category: 'tabs', valueKind: 'string', description: 'aria-labelledby for tab.' },\n { path: 'tabs[].disabled', category: 'tabs', valueKind: 'boolean', description: 'Disable tab.' },\n { path: 'tabs[].content', category: 'tabs', valueKind: 'array', description: 'Dynamic field metadata list.' },\n { path: 'tabs[].widgets', category: 'tabs', valueKind: 'array', description: 'Widget definitions for tab content.' },\n { path: 'tabs[].isActive', category: 'tabs', valueKind: 'boolean', description: 'Active flag (metadata only).' },\n { path: 'tabs[].origin', category: 'tabs', valueKind: 'number', description: 'Origin index (metadata only).' },\n { path: 'tabs[].position', category: 'tabs', valueKind: 'number', description: 'Position index (metadata only).' },\n\n { path: 'events', category: 'events', valueKind: 'object', description: 'Event config (placeholder).' },\n];\n\nexport const TABS_AI_CAPABILITIES: CapabilityCatalog = {\n version: 'v1.0',\n enums: ENUMS,\n targets: [\n 'praxis-tabs',\n 'tab-group',\n 'tab-item',\n 'praxis-tabs-config-editor',\n 'praxis-tabs-quick-setup',\n ],\n notes: [\n 'TabsMetadata drives both group and nav modes. Use nav.* when links are present.',\n 'appearance.customCss is injected into a <style> tag; avoid unsafe CSS from untrusted sources.',\n 'tabs[].content expects DynamicFieldMetadata[] and widgets[] expects WidgetDefinition[].',\n ],\n capabilities: CAPS,\n};\n","import { BaseAiAdapter, Capability, PatchResult } from '@praxisui/ai';\nimport { deepMerge } from '@praxisui/core';\nimport { TabsMetadata } from '../praxis-tabs';\nimport { TABS_AI_CAPABILITIES } from './tabs-ai-capabilities';\nimport { PraxisTabs } from '../praxis-tabs';\n\nexport class TabsAiAdapter extends BaseAiAdapter<TabsMetadata> {\n componentName = 'Praxis Tabs';\n\n constructor(private tabs: PraxisTabs) {\n super();\n }\n\n getCurrentConfig(): TabsMetadata {\n return this.cloneConfig(this.tabs.config || {});\n }\n\n getCapabilities(): Capability[] {\n return TABS_AI_CAPABILITIES.capabilities as unknown as Capability[];\n }\n\n override getRuntimeState(): Record<string, any> {\n const cfg = this.tabs.config;\n return {\n mode: cfg?.nav?.links?.length ? 'nav' : 'group',\n tabsCount: cfg?.tabs?.length ?? 0,\n linksCount: cfg?.nav?.links?.length ?? 0,\n lazyLoad: !!cfg?.behavior?.lazyLoad,\n selectedIndex: cfg?.group?.selectedIndex ?? 0,\n navIndex: cfg?.nav?.selectedIndex ?? 0,\n };\n }\n\n createSnapshot(): TabsMetadata {\n return this.cloneConfig(this.tabs.config || {});\n }\n\n async restoreSnapshot(snapshot: TabsMetadata): Promise<void> {\n if (!snapshot) return;\n this.applyConfig(snapshot);\n }\n\n async applyPatch(patch: Partial<TabsMetadata>): Promise<PatchResult> {\n try {\n const current = this.getCurrentConfig();\n const next = this.smartMergeTabsConfig(current, patch);\n this.applyConfig(next);\n return { success: true };\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error applying patch';\n return { success: false, error: message };\n }\n }\n\n private applyConfig(config: TabsMetadata): void {\n const apply = (this.tabs as any).applyConfigFromAdapter;\n if (typeof apply === 'function') {\n apply.call(this.tabs, config);\n return;\n }\n const prev = this.tabs.config;\n this.tabs.config = config;\n this.tabs.ngOnChanges({\n config: {\n previousValue: prev,\n currentValue: config,\n firstChange: false,\n isFirstChange: () => false,\n },\n } as any);\n }\n\n private smartMergeTabsConfig(base: TabsMetadata, patch: Partial<TabsMetadata>): TabsMetadata {\n const result = deepMerge(base, patch);\n\n if (patch.tabs && Array.isArray(patch.tabs)) {\n const merged = this.mergeByKey(\n base.tabs || [],\n patch.tabs,\n (t) => t.id || t.textLabel || '',\n );\n result.tabs = merged;\n }\n\n const patchLinks = patch.nav?.links;\n if (patchLinks && Array.isArray(patchLinks)) {\n const merged = this.mergeByKey(\n base.nav?.links || [],\n patchLinks,\n (l) => l.id || l.label || '',\n );\n result.nav = { ...(result.nav || {}), links: merged };\n }\n\n return result;\n }\n\n private mergeByKey<T extends Record<string, any>>(\n baseArr: T[],\n patchArr: T[],\n keyFn: (item: T) => string,\n ): T[] {\n const merged = baseArr.map((orig) => {\n const key = keyFn(orig);\n const match = key ? patchArr.find((p) => keyFn(p) === key) : undefined;\n return match ? deepMerge(orig as any, match as any) : orig;\n });\n\n patchArr.forEach((item) => {\n const key = keyFn(item);\n if (!key || !baseArr.find((o) => keyFn(o) === key)) {\n merged.push(item);\n }\n });\n\n return merged;\n }\n\n private cloneConfig(config: TabsMetadata): TabsMetadata {\n try {\n return structuredClone(config);\n } catch {\n return JSON.parse(JSON.stringify(config));\n }\n }\n}\n","import {\n Component,\n Input,\n Output,\n EventEmitter,\n ChangeDetectionStrategy,\n OnChanges,\n SimpleChanges,\n OnInit,\n OnDestroy,\n inject,\n signal,\n computed,\n} from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport { CommonModule } from '@angular/common';\nimport { MatTabsModule, MatTabChangeEvent } from '@angular/material/tabs';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { PraxisIconDirective, ComponentKeyService } from '@praxisui/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { DynamicFieldLoaderDirective } from '@praxisui/dynamic-fields';\nimport { SettingsPanelService } from '@praxisui/settings-panel';\nimport {\n ASYNC_CONFIG_STORAGE,\n AsyncConfigStorage,\n LoggerService,\n} from '@praxisui/core';\nimport { PraxisTabsConfigEditor } from './praxis-tabs-config-editor';\nimport { produce } from 'immer';\nimport { DragDropModule, CdkDragDrop } from '@angular/cdk/drag-drop';\nimport { EmptyStateCardComponent, DynamicWidgetLoaderDirective, WidgetDefinition } from '@praxisui/core';\nimport { TabsQuickSetupComponent } from './quick-setup/tabs-quick-setup.component';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { Subject } from 'rxjs';\nimport { take, takeUntil } from 'rxjs/operators';\nimport { PraxisAiAssistantComponent } from '@praxisui/ai';\nimport { TabsAiAdapter } from './ai/tabs-ai.adapter';\n\n// =====================\n// Metadata interfaces\n// =====================\nexport interface TabsMetadata {\n meta?: any;\n appearance?: TabsAppearanceConfig;\n behavior?: TabsBehaviorConfig;\n events?: TabsEventConfig;\n accessibility?: TabsAccessibilityConfig;\n group?: TabGroupMetadata;\n tabs?: TabMetadata[];\n nav?: TabNavMetadata;\n}\n\nexport interface TabsAppearanceConfig {\n density?: 'compact' | 'comfortable' | 'spacious';\n themeClass?: string;\n customCss?: string;\n /** Optional runtime tokens mapped to CSS for per-instance styling */\n tokens?: Partial<TabsStyleTokens>;\n}\n\nexport interface TabsBehaviorConfig {\n lazyLoad?: boolean;\n closeable?: boolean;\n reorderable?: boolean;\n}\n\nexport interface TabsEventConfig {\n // Placeholder for docs parity; events are component outputs\n}\n\nexport interface TabsAccessibilityConfig {\n ariaLabels?: { [key: string]: string };\n keyboardNavigation?: boolean;\n highContrast?: boolean;\n reduceMotion?: boolean;\n}\n\nexport interface TabGroupMetadata {\n alignTabs?: 'start' | 'center' | 'end';\n animationDuration?: string;\n ariaLabel?: string;\n ariaLabelledby?: string;\n color?: 'primary' | 'accent' | 'warn';\n contentTabIndex?: number;\n disablePagination?: boolean;\n disableRipple?: boolean;\n dynamicHeight?: boolean;\n fitInkBarToContent?: boolean;\n headerPosition?: 'above' | 'below';\n preserveContent?: boolean;\n selectedIndex?: number;\n stretchTabs?: boolean;\n backgroundColor?: 'primary' | 'accent' | 'warn' | undefined;\n}\n\nexport interface TabMetadata {\n id?: string;\n ariaLabel?: string;\n ariaLabelledby?: string;\n textLabel?: string;\n labelClass?: string | string[];\n bodyClass?: string | string[];\n disabled?: boolean;\n content?: any[]; // DynamicFieldMetadata[]\n widgets?: WidgetDefinition[];\n isActive?: boolean;\n origin?: number;\n position?: number;\n}\n\nexport interface TabNavMetadata {\n animationDuration?: string;\n color?: 'primary' | 'accent' | 'warn';\n backgroundColor?: 'primary' | 'accent' | 'warn' | undefined;\n disablePagination?: boolean;\n disableRipple?: boolean;\n fitInkBarToContent?: boolean;\n selectedIndex?: number;\n stretchTabs?: boolean;\n links: TabLinkMetadata[];\n}\n\nexport interface TabLinkMetadata {\n id?: string;\n label: string;\n active?: boolean;\n disabled?: boolean;\n disableRipple?: boolean;\n fitInkBarToContent?: boolean;\n content?: any[]; // DynamicFieldMetadata[]\n widgets?: WidgetDefinition[];\n}\n\n// A minimal set of style tokens mapped to CSS at runtime.\nexport interface TabsStyleTokens {\n 'active-indicator-color': string;\n 'active-focus-indicator-color': string;\n 'active-hover-indicator-color': string;\n 'active-label-text-color': string;\n 'active-focus-label-text-color': string;\n 'active-hover-label-text-color': string;\n 'inactive-label-text-color': string;\n 'inactive-hover-label-text-color': string;\n 'inactive-focus-label-text-color': string;\n 'inactive-ripple-color': string;\n 'pagination-icon-color': string;\n 'divider-color': string;\n 'background-color': string;\n}\n\n@Component({\n selector: 'praxis-tabs',\n standalone: true,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n MatTabsModule,\n MatIconModule,\n MatTooltipModule,\n PraxisIconDirective,\n MatButtonModule,\n DragDropModule,\n EmptyStateCardComponent,\n DynamicFieldLoaderDirective,\n DynamicWidgetLoaderDirective,\n PraxisAiAssistantComponent,\n ],\n template: `\n <div\n class=\"praxis-tabs-root\"\n [class.density-compact]=\"config?.appearance?.density === 'compact'\"\n [class.density-comfortable]=\"config?.appearance?.density === 'comfortable'\"\n [class.density-spacious]=\"config?.appearance?.density === 'spacious'\"\n [class.high-contrast]=\"config?.accessibility?.highContrast\"\n [class.reduce-motion]=\"config?.accessibility?.reduceMotion\"\n [ngClass]=\"config?.appearance?.themeClass || ''\"\n [attr.data-tabs-id]=\"styleScopeId()\"\n >\n <!-- Inline custom CSS, if provided -->\n <style *ngIf=\"safeCustomCss() as css\" [innerHTML]=\"css\"></style>\n <!-- Runtime style derived from tokens -->\n <style *ngIf=\"styleCss() as s\" [innerHTML]=\"s\"></style>\n\n <div class=\"tabs-ai-assistant\" *ngIf=\"editModeEnabled\">\n <praxis-ai-assistant [adapter]=\"aiAdapter\"></praxis-ai-assistant>\n </div>\n\n <!-- Empty state (global) -->\n <ng-container *ngIf=\"isEmptyGlobal(); else notEmpty\">\n <praxis-empty-state-card\n icon=\"tab\"\n [title]=\"'Nenhuma aba configurada'\"\n [description]=\"'Crie rapidamente suas abas ou abra o editor completo.'\"\n [primaryAction]=\"{ label: 'Criar abas rapidamente', icon: 'add', action: openQuickSetup.bind(this) }\"\n [secondaryActions]=\"[\n { label: 'Adicionar aba vazia', icon: 'tab', action: addEmptyTab.bind(this) },\n { label: 'Abrir editor completo', icon: 'tune', action: openEditor.bind(this) }\n ]\"\n ></praxis-empty-state-card>\n </ng-container>\n\n <ng-template #notEmpty>\n <!-- Tab Nav variant -->\n <ng-container *ngIf=\"isNavMode(); else groupMode\">\n <nav\n mat-tab-nav-bar\n [tabPanel]=\"tabPanel\"\n cdkDropList\n cdkDropListOrientation=\"horizontal\"\n [cdkDropListDisabled]=\"!config?.behavior?.reorderable\"\n (cdkDropListDropped)=\"onNavDrop($event)\"\n [disablePagination]=\"config?.nav?.disablePagination\"\n [fitInkBarToContent]=\"config?.nav?.fitInkBarToContent\"\n [mat-stretch-tabs]=\"config?.nav?.stretchTabs\"\n [color]=\"config?.nav?.color\"\n [backgroundColor]=\"config?.nav?.backgroundColor\"\n [selectedIndex]=\"currentNavIndex()\"\n [attr.aria-label]=\"config?.group?.ariaLabel || null\"\n [attr.aria-labelledby]=\"config?.group?.ariaLabelledby || null\"\n [animationDuration]=\"effectiveAnimationDuration()\"\n (indexFocused)=\"indexFocused.emit($event)\"\n (selectFocusedIndex)=\"selectFocusedIndex.emit($event)\"\n >\n <a\n mat-tab-link\n *ngFor=\"let link of config?.nav?.links; let i = index\"\n cdkDrag\n [cdkDragDisabled]=\"!config?.behavior?.reorderable\"\n cdkDragLockAxis=\"x\"\n [active]=\"getNavActive(i)\"\n [disabled]=\"link.disabled\"\n [disableRipple]=\"config?.nav?.disableRipple || link.disableRipple\"\n [fitInkBarToContent]=\"link.fitInkBarToContent || false\"\n [id]=\"link.id || ''\"\n (click)=\"onNavClick(i)\"\n >\n <span *ngIf=\"config?.behavior?.reorderable\" class=\"drag-handle\" cdkDragHandle>\n <mat-icon fontIcon=\"drag_indicator\"></mat-icon>\n </span>\n {{ link.label }}\n </a>\n </nav>\n\n <mat-tab-nav-panel #tabPanel>\n <div class=\"praxis-tabnav-content\" *ngIf=\"currentNavIndex() >= 0\">\n <ng-container\n *ngIf=\"config?.nav?.links?.[currentNavIndex()] as l\"\n >\n <ng-container *ngIf=\"(l.content?.length || l.widgets?.length) && navContentReady(currentNavIndex()); else emptyNav\">\n <ng-container *ngIf=\"l.content && form\">\n <ng-container\n dynamicFieldLoader\n [fields]=\"l.content || []\"\n [formGroup]=\"form!\"\n ></ng-container>\n </ng-container>\n <ng-container *ngIf=\"l.widgets?.length\">\n <ng-container *ngFor=\"let w of l.widgets; let wi = index\">\n <ng-container\n [dynamicWidgetLoader]=\"w\"\n [context]=\"context || {}\"\n (widgetEvent)=\"emitWidgetEvent({ linkId: l.id, linkIndex: currentNavIndex() }, $event)\"\n ></ng-container>\n </ng-container>\n </ng-container>\n </ng-container>\n <ng-template #emptyNav>\n <praxis-empty-state-card\n [inline]=\"true\"\n icon=\"add_to_queue\"\n [title]=\"'Sem conteúdo neste link'\"\n [description]=\"'Adicione conteúdo ou use o editor para configurar.'\"\n [primaryAction]=\"{ label: 'Abrir editor', icon: 'tune', action: openEditor.bind(this) }\"\n ></praxis-empty-state-card>\n </ng-template>\n </ng-container>\n </div>\n </mat-tab-nav-panel>\n </ng-container>\n\n <!-- Tab Group variant -->\n <ng-template #groupMode>\n <mat-tab-group\n [dynamicHeight]=\"config?.group?.dynamicHeight\"\n [disableRipple]=\"config?.group?.disableRipple\"\n [disablePagination]=\"config?.group?.disablePagination\"\n [fitInkBarToContent]=\"config?.group?.fitInkBarToContent\"\n [headerPosition]=\"config?.group?.headerPosition ?? 'above'\"\n [preserveContent]=\"config?.group?.preserveContent\"\n [selectedIndex]=\"selectedIndexSignal()\"\n [mat-stretch-tabs]=\"config?.group?.stretchTabs\"\n [mat-align-tabs]=\"config?.group?.alignTabs || 'start'\"\n [color]=\"config?.group?.color\"\n [backgroundColor]=\"config?.group?.backgroundColor\"\n [animationDuration]=\"effectiveAnimationDuration()\"\n [attr.aria-label]=\"config?.group?.ariaLabel || null\"\n [attr.aria-labelledby]=\"config?.group?.ariaLabelledby || null\"\n (animationDone)=\"animationDone.emit()\"\n (focusChange)=\"focusChange.emit($event)\"\n (selectedIndexChange)=\"onSelectedIndexChange($event)\"\n (selectedTabChange)=\"selectedTabChange.emit($event)\"\n class=\"praxis-tabs-group\"\n >\n <mat-tab\n *ngFor=\"let t of config?.tabs; let i = index\"\n [disabled]=\"t.disabled\"\n [labelClass]=\"t.labelClass ?? ''\"\n [bodyClass]=\"t.bodyClass ?? ''\"\n [id]=\"t.id || ''\"\n [attr.aria-label]=\"t.ariaLabel || null\"\n [attr.aria-labelledby]=\"t.ariaLabelledby || null\"\n >\n <ng-template mat-tab-label>\n <span>{{ t.textLabel }}</span>\n <button\n *ngIf=\"config?.behavior?.closeable\"\n mat-icon-button\n type=\"button\"\n (click)=\"closeTab(i); $event.stopPropagation()\"\n (keydown.enter)=\"$event.stopPropagation()\"\n (keydown.space)=\"$event.stopPropagation()\"\n aria-label=\"Fechar aba\"\n >\n <mat-icon fontIcon=\"close\"></mat-icon>\n </button>\n <ng-container *ngIf=\"config?.behavior?.reorderable\">\n <button\n mat-icon-button\n type=\"button\"\n (click)=\"moveTab(i, -1); $event.stopPropagation()\"\n (keydown.enter)=\"$event.stopPropagation()\"\n (keydown.space)=\"$event.stopPropagation()\"\n [disabled]=\"i===0\"\n aria-label=\"Mover aba para esquerda\"\n >\n <mat-icon fontIcon=\"arrow_back\"></mat-icon>\n </button>\n <button\n mat-icon-button\n type=\"button\"\n (click)=\"moveTab(i, 1); $event.stopPropagation()\"\n (keydown.enter)=\"$event.stopPropagation()\"\n (keydown.space)=\"$event.stopPropagation()\"\n [disabled]=\"i===(config?.tabs?.length||1)-1\"\n aria-label=\"Mover aba para direita\"\n >\n <mat-icon fontIcon=\"arrow_forward\"></mat-icon>\n </button>\n </ng-container>\n </ng-template>\n\n <ng-template matTabContent>\n <ng-container *ngIf=\"(t.content?.length || t.widgets?.length) && groupContentReady(i); else emptyTab\">\n <ng-container *ngIf=\"t.content && form\">\n <ng-container\n dynamicFieldLoader\n [fields]=\"t.content || []\"\n [formGroup]=\"form!\"\n ></ng-container>\n </ng-container>\n <ng-container *ngIf=\"t.widgets?.length\">\n <ng-container *ngFor=\"let w of t.widgets; let wi = index\">\n <ng-container\n [dynamicWidgetLoader]=\"w\"\n [context]=\"context || {}\"\n (widgetEvent)=\"emitWidgetEvent({ tabId: t.id, tabIndex: i }, $event)\"\n ></ng-container>\n </ng-container>\n </ng-container>\n </ng-container>\n <ng-template #emptyTab>\n <praxis-empty-state-card\n [inline]=\"true\"\n icon=\"dashboard_customize\"\n [title]=\"'Sem conteúdo nesta aba'\"\n [description]=\"'Adicione conteúdo ou use o editor para configurar.'\"\n [primaryAction]=\"{ label: 'Abrir editor', icon: 'tune', action: openEditor.bind(this) }\"\n ></praxis-empty-state-card>\n </ng-template>\n </ng-template>\n </mat-tab>\n </mat-tab-group>\n </ng-template>\n </ng-template>\n\n <!-- Edit button -->\n <button\n *ngIf=\"editModeEnabled\"\n mat-fab\n class=\"edit-fab\"\n aria-label=\"Editar tabs\"\n (click)=\"openEditor()\"\n >\n <mat-icon fontIcon=\"edit\"></mat-icon>\n </button>\n <button\n *ngIf=\"editModeEnabled && tabsId\"\n mat-mini-fab\n class=\"edit-fab edit-fab-secondary\"\n aria-label=\"Redefinir preferências de tabs\"\n (click)=\"resetPreferences()\"\n matTooltip=\"Redefinir preferências de tabs\"\n >\n <mat-icon [praxisIcon]=\"'restart_alt'\"></mat-icon>\n </button>\n </div>\n `,\n styles: [\n `\n .praxis-tabs-root { position: relative; display: block; }\n .praxis-tabs-group.align-start .mat-mdc-tab-header { justify-content: flex-start; }\n .praxis-tabs-group.align-center .mat-mdc-tab-header { justify-content: center; }\n .praxis-tabs-group.align-end .mat-mdc-tab-header { justify-content: flex-end; }\n .density-compact .mat-mdc-tab-body-content { padding: 8px; }\n .density-comfortable .mat-mdc-tab-body-content { padding: 16px; }\n .density-spacious .mat-mdc-tab-body-content { padding: 24px; }\n .tabs-ai-assistant { position: absolute; right: 12px; bottom: 72px; z-index: 3; }\n .edit-fab { position: absolute; right: 12px; bottom: 12px; z-index: 2; }\n .edit-fab-secondary { right: 56px; }\n .tab-empty { padding: 16px; color: var(--md-sys-color-on-surface-variant); font-style: italic; }\n .high-contrast { filter: contrast(1.2); }\n .reduce-motion { --mat-animation-duration: 0ms; }\n .drag-handle { display: inline-flex; align-items: center; vertical-align: middle; margin-right: 4px; cursor: grab; }\n\n /* Gridster integration: make tabs fill the tile height */\n :host-context(.pdx-gridster-item) .praxis-tabs-root {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0; /* allow children to shrink */\n }\n :host-context(.pdx-gridster-item) .praxis-tabs-group,\n :host-context(.pdx-gridster-item) .mat-mdc-tab-group {\n flex: 1 1 auto;\n min-height: 0;\n }\n :host-context(.pdx-gridster-item) .mat-mdc-tab-body-wrapper,\n :host-context(.pdx-gridster-item) .mat-mdc-tab-body-content {\n height: 100%;\n min-height: 0;\n }\n :host-context(.pdx-gridster-item) .mat-mdc-tab-body-content {\n overflow: auto;\n }\n /* Nav variant content should expand and scroll inside tile */\n :host-context(.pdx-gridster-item) .praxis-tabnav-content {\n flex: 1 1 auto;\n min-height: 0;\n overflow: auto;\n }\n `,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class PraxisTabs implements OnInit, OnChanges, OnDestroy {\n private readonly settings = inject(SettingsPanelService);\n private readonly storage = inject<AsyncConfigStorage>(ASYNC_CONFIG_STORAGE);\n private readonly snack = inject(MatSnackBar);\n private readonly componentKeys = inject(ComponentKeyService);\n private readonly logger = inject(LoggerService);\n private readonly route = (() => { try { return inject(ActivatedRoute); } catch { return undefined as ActivatedRoute | undefined; } })();\n private warnedMissingId = false;\n\n @Input() config: TabsMetadata | null = null;\n @Input({ required: true }) tabsId!: string;\n @Input() componentInstanceId?: string;\n @Input() editModeEnabled = false;\n @Input() form: FormGroup | null = null;\n @Input() context: Record<string, any> | null = null;\n\n @Output() animationDone = new EventEmitter<void>();\n @Output() focusChange = new EventEmitter<MatTabChangeEvent>();\n @Output() selectedIndexChange = new EventEmitter<number>();\n @Output() selectedTabChange = new EventEmitter<MatTabChangeEvent>();\n @Output() indexFocused = new EventEmitter<number>();\n @Output() selectFocusedIndex = new EventEmitter<number>();\n @Output() widgetEvent = new EventEmitter<{\n tabId?: string;\n tabIndex?: number;\n linkId?: string;\n linkIndex?: number;\n sourceId: string;\n output?: string;\n payload?: any;\n }>();\n\n public aiAdapter = new TabsAiAdapter(this);\n\n // Signals to manage local state for selection in Nav mode and Group mode\n protected currentNavIndex = signal<number>(0);\n protected selectedIndexSignal = signal<number>(0);\n private groupLoaded = new Set<number>();\n private navLoaded = new Set<number>();\n private readonly destroy$ = new Subject<void>();\n\n ngOnInit(): void {\n this.syncSelectionFromConfig();\n // Load stored config if tabsId provided\n const key = this.storageKey();\n if (key) {\n this.storage.loadConfig<TabsMetadata>(key).pipe(take(1)).subscribe((stored) => {\n if (stored) {\n this.config = stored;\n }\n this.syncSelectionFromConfig();\n });\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['config'] && this.config) {\n // Reset loaded caches on config change and seed with current selections\n this.syncSelectionFromConfig();\n\n // Persist when tabsId provided\n this.persistConfig(this.config);\n }\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n isNavMode(): boolean {\n return !!this.config?.nav && !!this.config?.nav?.links?.length;\n }\n\n effectiveAnimationDuration(): string {\n const reduce = this.config?.accessibility?.reduceMotion;\n if (reduce) return '0ms';\n return (\n this.config?.group?.animationDuration || this.config?.nav?.animationDuration || '500ms'\n );\n }\n\n getNavActive(i: number): boolean {\n return this.currentNavIndex() === i;\n }\n\n onNavClick(i: number): void {\n if (!this.config?.nav?.links?.length) return;\n const linksCount = this.config.nav.links.length;\n if (i < 0 || i >= linksCount) return;\n this.currentNavIndex.set(i);\n this.config = produce(this.config, (draft) => {\n if (!draft.nav) return;\n draft.nav.selectedIndex = i;\n });\n this.persistConfig(this.config);\n // Lazy: mark as loaded\n this.navLoaded.add(i);\n // Emit as index change for consumers to track\n this.selectedIndexChange.emit(i);\n }\n\n onNavDrop(event: CdkDragDrop<any>): void {\n if (!this.config?.nav?.links) return;\n const prev = event.previousIndex;\n const curr = event.currentIndex;\n const linksLength = this.config.nav.links.length;\n if (prev < 0 || curr < 0 || prev >= linksLength || curr >= linksLength) return;\n if (prev === curr) return;\n const selectedId = this.config.nav.links[this.currentNavIndex()]?.id;\n this.config = produce(this.config, (draft) => {\n const arr = draft.nav!.links as any[];\n const [moved] = arr.splice(prev, 1);\n arr.splice(curr, 0, moved);\n });\n // Update selected index based on id\n if (selectedId) {\n const idx = this.config.nav!.links.findIndex((l) => l.id === selectedId);\n if (idx >= 0) this.currentNavIndex.set(idx);\n } else {\n // If no id, preserve selected index around move.\n const selected = this.currentNavIndex();\n if (selected === prev) {\n this.currentNavIndex.set(curr);\n } else if (prev < selected && curr >= selected) {\n this.currentNavIndex.set(selected - 1);\n } else if (prev > selected && curr <= selected) {\n this.currentNavIndex.set(selected + 1);\n }\n }\n // Reset lazy cache for nav except current\n const currIdx = this.currentNavIndex();\n this.navLoaded.clear();\n this.navLoaded.add(currIdx);\n this.config = produce(this.config, (draft) => {\n if (!draft.nav) return;\n draft.nav.selectedIndex = currIdx;\n });\n this.persistConfig(this.config);\n }\n\n onSelectedIndexChange(index: number): void {\n const selected = this.clampIndex(index, this.config?.tabs?.length ?? 0);\n this.selectedIndexSignal.set(selected);\n // Update config immutably\n if (this.config) {\n this.config = produce(this.config, (draft) => {\n if (!draft.group) {\n (draft as any).group = { selectedIndex: selected } as TabGroupMetadata;\n } else {\n draft.group.selectedIndex = selected;\n }\n });\n this.persistConfig(this.config);\n }\n // Lazy: mark as loaded\n this.groupLoaded.add(selected);\n this.selectedIndexChange.emit(selected);\n }\n\n closeTab(index: number): void {\n if (!this.config?.tabs) return;\n if (index < 0 || index >= this.config.tabs.length) return;\n const currentSelected = this.selectedIndexSignal();\n this.config = produce(this.config, (draft) => {\n draft.tabs!.splice(index, 1);\n const tabsLength = draft.tabs!.length;\n if (!draft.group) {\n (draft as any).group = {} as TabGroupMetadata;\n }\n if (tabsLength <= 0) {\n draft.group!.selectedIndex = 0;\n return;\n }\n const adjusted = currentSelected > index ? currentSelected - 1 : currentSelected;\n draft.group!.selectedIndex = this.clampIndex(adjusted, tabsLength);\n });\n const nextSelected = this.clampIndex(\n this.config?.group?.selectedIndex,\n this.config?.tabs?.length ?? 0,\n );\n this.selectedIndexSignal.set(nextSelected);\n this.groupLoaded.clear();\n if ((this.config?.tabs?.length ?? 0) > 0) {\n this.groupLoaded.add(nextSelected);\n }\n this.persistConfig(this.config);\n }\n\n moveTab(index: number, delta: number): void {\n if (!this.config?.tabs) return;\n const to = index + delta;\n if (to < 0 || to >= this.config.tabs.length) return;\n const wasSelected = this.selectedIndexSignal() === index;\n this.config = produce(this.config, (draft) => {\n const arr = draft.tabs! as any[];\n const [m] = arr.splice(index, 1);\n arr.splice(to, 0, m);\n if (!draft.group) (draft as any).group = { selectedIndex: to } as TabGroupMetadata;\n else if (wasSelected) draft.group.selectedIndex = to;\n else if (draft.group.selectedIndex != null) {\n // Adjust selection if it lies between moved indices\n const sel = draft.group.selectedIndex as number;\n if (index < sel && to >= sel) draft.group.selectedIndex = sel - 1;\n else if (index > sel && to <= sel) draft.group.selectedIndex = sel + 1;\n }\n });\n this.selectedIndexSignal.set(this.config.group?.selectedIndex ?? this.selectedIndexSignal());\n // Reset lazy cache for group except current\n const sel = this.selectedIndexSignal() ?? 0;\n this.groupLoaded.clear();\n this.groupLoaded.add(sel);\n this.persistConfig(this.config);\n }\n\n openEditor(): void {\n const key = this.storageKey() || this.tabsId || 'default';\n const ref = this.settings.open({\n id: `praxis-tabs-editor:${key}`,\n title: 'Configurar Tabs',\n content: {\n component: PraxisTabsConfigEditor,\n inputs: { config: this.config, tabsId: this.tabsId },\n },\n });\n\n // Essential preview: apply updates without closing\n ref.applied$.pipe(takeUntil(this.destroy$)).subscribe((value: any) => {\n const nextCfg: TabsMetadata = value?.config || value;\n if (nextCfg) {\n this.config = produce(this.config || {}, () => nextCfg);\n this.persistConfig(this.config);\n this.syncSelectionFromConfig();\n }\n });\n\n ref.saved$.pipe(takeUntil(this.destroy$)).subscribe((value: any) => {\n const nextCfg: TabsMetadata = value?.config || value;\n if (nextCfg) {\n this.config = produce(this.config || {}, () => nextCfg);\n this.persistConfig(this.config);\n this.syncSelectionFromConfig();\n }\n });\n }\n\n addEmptyTab(): void {\n const next = produce(this.config || {}, (draft: any) => {\n if (!draft.group) draft.group = { selectedIndex: 0 };\n if (!draft.tabs) draft.tabs = [];\n draft.tabs.push({ id: `tab${(draft.tabs.length || 0) + 1}`, textLabel: 'Nova aba' });\n draft.group.selectedIndex = (draft.tabs.length || 1) - 1;\n }) as TabsMetadata;\n this.config = next;\n this.persistConfig(this.config);\n this.selectedIndexSignal.set(this.config?.group?.selectedIndex ?? 0);\n }\n\n /** Clears persisted tabs configuration to fallback to defaults */\n resetPreferences(): void {\n const key = this.storageKey();\n if (!key) return;\n try {\n this.storage.clearConfig(key).pipe(take(1)).subscribe({ error: () => {} });\n } catch {}\n try { this.snack.open('Preferências de Tabs redefinidas', undefined, { duration: 2000 }); } catch {}\n // keep current in-memory config; caller may choose to reload\n }\n\n openQuickSetup(): void {\n const key = this.storageKey() || this.tabsId || 'default';\n const ref = this.settings.open({\n id: `praxis-tabs-quick-setup:${key}`,\n title: 'Criar abas rapidamente',\n content: {\n component: TabsQuickSetupComponent,\n inputs: { config: this.config },\n },\n });\n const apply = (value: any) => {\n const nextCfg: TabsMetadata = value?.config || value;\n if (nextCfg) {\n this.config = produce(this.config || {}, () => nextCfg);\n this.persistConfig(this.config);\n this.syncSelectionFromConfig();\n }\n };\n ref.applied$.pipe(takeUntil(this.destroy$)).subscribe(apply);\n ref.saved$.pipe(takeUntil(this.destroy$)).subscribe(apply);\n }\n\n private storageKey(): string | null {\n const id = this.componentKeyId();\n return id ? `tabs:${id}` : null;\n }\n\n private syncSelectionFromConfig(): void {\n this.groupLoaded.clear();\n this.navLoaded.clear();\n const tabsLength = this.config?.tabs?.length ?? 0;\n const linksLength = this.config?.nav?.links?.length ?? 0;\n const groupIndex = this.clampIndex(this.config?.group?.selectedIndex, tabsLength);\n const navIndex = this.clampIndex(this.config?.nav?.selectedIndex, linksLength);\n this.selectedIndexSignal.set(groupIndex);\n this.currentNavIndex.set(navIndex);\n if (tabsLength > 0) this.groupLoaded.add(groupIndex);\n if (linksLength > 0) this.navLoaded.add(navIndex);\n }\n\n private persistConfig(config?: TabsMetadata | null): void {\n const key = this.storageKey();\n if (!key || !config) return;\n this.storage.saveConfig(key, config).pipe(take(1)).subscribe({ error: () => {} });\n }\n\n private componentKeyId(): string | null {\n const key = this.componentKeys.buildComponentId({\n componentType: 'praxis-tabs',\n componentId: this.tabsId,\n instanceKey: this.componentInstanceId,\n componentRef: this,\n route: this.route,\n requireComponentId: true,\n });\n if (!key) this.warnMissingId();\n return key;\n }\n\n private warnMissingId(): void {\n if (this.warnedMissingId) return;\n this.warnedMissingId = true;\n this.logger.warnOnce(\n '[PraxisTabs] tabsId is required for config persistence.',\n {\n context: {\n lib: 'praxis-tabs',\n component: 'PraxisTabs',\n },\n data: {\n tabsId: this.tabsId,\n componentInstanceId: this.componentInstanceId,\n },\n dedupeKey: 'praxis-tabs:missing-tabs-id',\n },\n );\n }\n\n private clampIndex(index: number | undefined, size: number): number {\n if (size <= 0) return 0;\n const numeric = Number(index);\n const safe = Number.isFinite(numeric) ? Math.trunc(numeric) : 0;\n return Math.min(Math.max(safe, 0), size - 1);\n }\n\n public applyConfigFromAdapter(next: TabsMetadata): void {\n this.config = next;\n this.syncSelectionFromConfig();\n this.persistConfig(this.config);\n }\n\n // =====================\n // Lazy load helpers\n // =====================\n private isLazy(): boolean {\n return !!this.config?.behavior?.lazyLoad;\n }\n\n protected groupContentReady(index: number): boolean {\n return !this.isLazy() || this.groupLoaded.has(index) || this.selectedIndexSignal() === index;\n }\n\n protected navContentReady(index: number): boolean {\n return !this.isLazy() || this.navLoaded.has(index) || this.currentNavIndex() === index;\n }\n\n protected isEmptyGlobal(): boolean {\n const hasTabs = !!(this.config?.tabs && this.config.tabs.length > 0);\n const hasLinks = !!(this.config?.nav?.links && this.config.nav!.links.length > 0);\n return !(hasTabs || hasLinks);\n }\n\n protected emitWidgetEvent(\n loc: { tabId?: string; tabIndex?: number; linkId?: string; linkIndex?: number },\n ev: { sourceId: string; output?: string; payload?: any },\n ): void {\n this.widgetEvent.emit({ ...loc, ...ev });\n }\n\n protected styleScopeId(): string {\n const scopeSeed = [this.tabsId, this.componentInstanceId]\n .filter((v): v is string => typeof v === 'string' && !!v.trim())\n .join('--');\n const raw = String(scopeSeed || 'default').trim();\n const sanitized = raw\n .replace(/[^a-zA-Z0-9_-]+/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-|-$/g, '');\n return sanitized || 'default';\n }\n\n protected safeCustomCss(): string | null {\n const css = this.config?.appearance?.customCss;\n if (!css) return null;\n const value = String(css).trim();\n if (!value) return null;\n const forbidden = [\n /@import/i,\n /expression\\s*\\(/i,\n /behavior\\s*:/i,\n /<\\/style/i,\n /<script/i,\n /url\\s*\\(\\s*(['\"]?)\\s*(javascript:|data:text\\/html)/i,\n ];\n if (forbidden.some((pattern) => pattern.test(value))) {\n return null;\n }\n return value;\n }\n\n private sanitizeCssValue(value: unknown): string | null {\n if (typeof value !== 'string') return null;\n const trimmed = value.trim();\n if (!trimmed) return null;\n const forbidden = [\n /@import/i,\n /expression\\s*\\(/i,\n /behavior\\s*:/i,\n /url\\s*\\(\\s*(['\"]?)\\s*(javascript:|data:text\\/html)/i,\n ];\n if (forbidden.some((pattern) => pattern.test(trimmed))) {\n return null;\n }\n const sanitized = trimmed.replace(/[{};<>]/g, '').trim();\n return sanitized || null;\n }\n\n protected styleCss(): string | null {\n const t = this.config?.appearance?.tokens;\n if (!t) return null;\n const scope = `.praxis-tabs-root[data-tabs-id=\"${this.styleScopeId()}\"]`;\n const rules: string[] = [];\n const push = (selector: string, decls: string[]) => {\n rules.push(`${scope} ${selector}{${decls.join('')}}`);\n };\n\n // Active indicator underline\n const activeIndicatorColor = this.sanitizeCssValue(t['active-indicator-color']);\n if (activeIndicatorColor) {\n push(\n ' .mat-mdc-tab .mdc-tab-indicator__content--underline',\n [`background-color:${activeIndicatorColor}!important;`],\n );\n }\n // Active label\n const activeLabelColor = this.sanitizeCssValue(t['active-label-text-color']);\n if (activeLabelColor) {\n push(' .mdc-tab--active .mdc-tab__text-label', [\n `color:${activeLabelColor}!important;`,\n ]);\n }\n const activeHoverLabelColor = this.sanitizeCssValue(t['active-hover-label-text-color']);\n if (activeHoverLabelColor) {\n push(' .mdc-tab--active:hover .mdc-tab__text-label', [\n `color:${activeHoverLabelColor}!important;`,\n ]);\n }\n const activeFocusLabelColor = this.sanitizeCssValue(t['active-focus-label-text-color']);\n if (activeFocusLabelColor) {\n push(' .mdc-tab--active:focus .mdc-tab__text-label', [\n `color:${activeFocusLabelColor}!important;`,\n ]);\n }\n const activeFocusIndicatorColor = this.sanitizeCssValue(t['active-focus-indicator-color']);\n if (activeFocusIndicatorColor) {\n push(' .mdc-tab--active:focus .mdc-tab-indicator__content--underline', [\n `background-color:${activeFocusIndicatorColor}!important;`,\n ]);\n }\n const activeHoverIndicatorColor = this.sanitizeCssValue(t['active-hover-indicator-color']);\n if (activeHoverIndicatorColor) {\n push(' .mdc-tab--active:hover .mdc-tab-indicator__content--underline', [\n `background-color:${activeHoverIndicatorColor}!important;`,\n ]);\n }\n // Inactive label\n const inactiveLabelColor = this.sanitizeCssValue(t['inactive-label-text-color']);\n if (inactiveLabelColor) {\n push(' .mdc-tab:not(.mdc-tab--active) .mdc-tab__text-label', [\n `color:${inactiveLabelColor}!important;`,\n ]);\n }\n const inactiveHoverLabelColor = this.sanitizeCssValue(t['inactive-hover-label-text-color']);\n if (inactiveHoverLabelColor) {\n push(' .mdc-tab:not(.mdc-tab--active):hover .mdc-tab__text-label', [\n `color:${inactiveHoverLabelColor}!important;`,\n ]);\n }\n const inactiveFocusLabelColor = this.sanitizeCssValue(t['inactive-focus-label-text-color']);\n if (inactiveFocusLabelColor) {\n push(' .mdc-tab:not(.mdc-tab--active):focus .mdc-tab__text-label', [\n `color:${inactiveFocusLabelColor}!important;`,\n ]);\n }\n // Pagination chevrons\n const paginationIconColor = this.sanitizeCssValue(t['pagination-icon-color']);\n if (paginationIconColor) {\n push(' .mat-mdc-tab-header-pagination-chevron', [\n `color:${paginationIconColor}!important;`,\n ]);\n }\n // Divider / background\n const containerDecls: string[] = [];\n const dividerColor = this.sanitizeCssValue(t['divider-color']);\n if (dividerColor) {\n containerDecls.push(`border-bottom-color:${dividerColor}!important;`);\n }\n if (containerDecls.length) {\n push(' .mat-mdc-tab-header', containerDecls);\n push(' .mat-mdc-tab-nav-bar', containerDecls);\n }\n const backgroundColor = this.sanitizeCssValue(t['background-color']);\n if (backgroundColor) {\n push(' .mat-mdc-tab-header', [`background:${backgroundColor}!important;`]);\n push(' .mat-mdc-tab-nav-bar', [`background:${backgroundColor}!important;`]);\n }\n\n return rules.length ? rules.join('\\n') : null;\n }\n}\n","import { ComponentDocMeta, ComponentMetadataRegistry } from '@praxisui/core';\nimport { ENVIRONMENT_INITIALIZER, Provider } from '@angular/core';\nimport { PraxisTabs } from './praxis-tabs';\n\nexport const PRAXIS_TABS_COMPONENT_METADATA: ComponentDocMeta = {\n id: 'praxis-tabs',\n selector: 'praxis-tabs',\n component: PraxisTabs,\n friendlyName: 'Praxis Tabs',\n description:\n 'Abas dinâmicas baseadas em metadata, com MatTabGroup/TabNav e suporte a tokens M3 via appearance.',\n icon: 'tab',\n inputs: [\n { name: 'config', type: 'TabsMetadata', label: 'Configuração', description: 'Configuração JSON (tabs/nav, aparência e widgets internos)' },\n {\n name: 'tabsId',\n type: 'string',\n label: 'ID das Tabs',\n description: 'Identificador para persistência (obrigatório)',\n },\n {\n name: 'componentInstanceId',\n type: 'string',\n label: 'ID da instância',\n description: 'Identificador opcional para múltiplas instâncias na mesma rota',\n },\n {\n name: 'editModeEnabled',\n type: 'boolean',\n default: false,\n label: 'Modo de edição',\n description: 'Habilita editor via Settings Panel',\n },\n {\n name: 'form',\n type: 'FormGroup',\n label: 'FormGroup',\n description: 'FormGroup para conteúdo com campos dinâmicos',\n },\n {\n name: 'context',\n type: 'Record<string, any>',\n label: 'Contexto',\n description: 'Contexto entregue aos widgets internos',\n },\n ],\n outputs: [\n { name: 'selectedIndexChange', type: 'number', label: 'Índice selecionado' },\n { name: 'selectedTabChange', type: 'MatTabChangeEvent', label: 'Troca de aba' },\n { name: 'animationDone', type: 'void' },\n { name: 'focusChange', type: 'MatTabChangeEvent', label: 'Foco alterado' },\n { name: 'indexFocused', type: 'number', label: 'Índice focado' },\n { name: 'selectFocusedIndex', type: 'number', label: 'Selecionar foco' },\n {\n name: 'widgetEvent',\n type: \"{ tabId?: string; tabIndex?: number; linkId?: string; linkIndex?: number; sourceId: string; output?: string; payload?: any }\",\n label: 'Evento interno',\n description: 'Eventos reemitidos de componentes dinâmicos dentro da aba/link',\n },\n ],\n actions: [\n {\n id: 'select-tab',\n label: 'Selecionar aba',\n icon: 'tab',\n description: 'Emite alteração do índice selecionado',\n emit: 'selectedIndexChange',\n payloadSchema: {\n type: 'number',\n example: 0,\n },\n scope: 'any',\n },\n {\n id: 'tab-change',\n label: 'Troca de aba',\n icon: 'swap_horiz',\n description: 'Emite evento de troca de aba',\n emit: 'selectedTabChange',\n payloadSchema: {\n type: 'object',\n properties: {\n index: { type: 'number', description: 'Índice selecionado' },\n tab: { type: 'object', description: 'Referência da aba' },\n },\n required: ['index'],\n example: { index: 1 },\n },\n scope: 'any',\n },\n {\n id: 'focus-change',\n label: 'Foco alterado',\n icon: 'center_focus_strong',\n description: 'Emite evento quando o foco muda',\n emit: 'focusChange',\n payloadSchema: {\n type: 'object',\n properties: {\n index: { type: 'number', description: 'Índice focado' },\n tab: { type: 'object', description: 'Referência da aba' },\n },\n required: ['index'],\n example: { index: 1 },\n },\n scope: 'any',\n },\n {\n id: 'focus-index',\n label: 'Índice focado',\n icon: 'filter_center_focus',\n description: 'Emite o índice focado',\n emit: 'indexFocused',\n payloadSchema: {\n type: 'number',\n example: 0,\n },\n scope: 'any',\n },\n {\n id: 'select-focus',\n label: 'Selecionar foco',\n icon: 'gps_fixed',\n description: 'Emite seleção do índice focado',\n emit: 'selectFocusedIndex',\n payloadSchema: {\n type: 'number',\n example: 0,\n },\n scope: 'any',\n },\n ],\n tags: ['widget', 'tabs', 'configurable', 'stable'],\n lib: '@praxisui/tabs',\n};\n\nexport function providePraxisTabsMetadata(): Provider {\n return {\n provide: ENVIRONMENT_INITIALIZER,\n multi: true,\n useFactory: (registry: ComponentMetadataRegistry) => () => {\n registry.register(PRAXIS_TABS_COMPONENT_METADATA);\n },\n deps: [ComponentMetadataRegistry],\n } as Provider;\n}\n","/*\n * Public API Surface of praxis-tabs\n */\n\nexport * from './lib/praxis-tabs';\nexport * from './lib/praxis-tabs.metadata';\nexport * from './lib/praxis-tabs-config-editor';\nexport * from './lib/ai/tabs-ai-capabilities';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i4","i8","i1","i2","i3","i5","i7","i6"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"praxisui-tabs.mjs","sources":["../../../projects/praxis-tabs/src/lib/praxis-tabs-config-editor.ts","../../../projects/praxis-tabs/src/lib/quick-setup/tabs-quick-setup.component.ts","../../../projects/praxis-tabs/src/lib/ai/tabs-ai-capabilities.ts","../../../projects/praxis-tabs/src/lib/ai/tabs-ai.adapter.ts","../../../projects/praxis-tabs/src/lib/praxis-tabs.ts","../../../projects/praxis-tabs/src/lib/praxis-tabs.metadata.ts","../../../projects/praxis-tabs/src/public-api.ts","../../../projects/praxis-tabs/src/praxisui-tabs.ts"],"sourcesContent":["import {\n Component,\n Inject,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatIconModule } from '@angular/material/icon';\nimport { PraxisIconDirective } from '@praxisui/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { DragDropModule, CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { BehaviorSubject } from 'rxjs';\nimport { SETTINGS_PANEL_DATA, SettingsValueProvider } from '@praxisui/settings-panel';\nimport { TabsMetadata } from './praxis-tabs';\nimport { ComponentMetadataRegistry, WidgetDefinition } from '@praxisui/core';\n\n@Component({\n selector: 'praxis-tabs-config-editor',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n MatTabsModule,\n MatFormFieldModule,\n MatInputModule,\n MatIconModule,\n PraxisIconDirective,\n MatButtonModule,\n MatSlideToggleModule,\n DragDropModule,\n MatTooltipModule,\n ],\n template: `\n <mat-tab-group class=\"editor-tabs\">\n <mat-tab label=\"Comportamento\">\n <div class=\"editor-section\">\n <div class=\"editor-row\">\n <mat-slide-toggle [(ngModel)]=\"behavior.closeable\" (ngModelChange)=\"onAppearanceChange()\">Fechavel</mat-slide-toggle>\n <mat-slide-toggle [(ngModel)]=\"behavior.lazyLoad\" (ngModelChange)=\"onAppearanceChange()\">Carregar sob demanda</mat-slide-toggle>\n <mat-slide-toggle [(ngModel)]=\"behavior.reorderable\" (ngModelChange)=\"onAppearanceChange()\">Reordenavel</mat-slide-toggle>\n </div>\n </div>\n </mat-tab>\n <mat-tab label=\"Grupo\">\n <div class=\"editor-section\">\n <div class=\"editor-grid two\">\n <mat-form-field appearance=\"outline\"><mat-label>Alinhamento das abas</mat-label>\n <select matNativeControl [(ngModel)]=\"group.alignTabs\" (ngModelChange)=\"onAppearanceChange()\">\n <option [ngValue]=\"undefined\">Padrao</option>\n <option value=\"start\">Inicio</option>\n <option value=\"center\">Centro</option>\n <option value=\"end\">Fim</option>\n </select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>Posicao do header</mat-label>\n <select matNativeControl [(ngModel)]=\"group.headerPosition\" (ngModelChange)=\"onAppearanceChange()\">\n <option [ngValue]=\"undefined\">Acima (padrao)</option>\n <option value=\"above\">Acima</option>\n <option value=\"below\">Abaixo</option>\n </select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>Indice selecionado</mat-label>\n <input matInput type=\"number\" [(ngModel)]=\"group.selectedIndex\" (ngModelChange)=\"onAppearanceChange()\" />\n <button\n mat-icon-button\n matSuffix\n class=\"help-icon-button\"\n type=\"button\"\n [matTooltip]=\"'selectedIndex'\"\n matTooltipPosition=\"above\"\n >\n <mat-icon [praxisIcon]=\"'help_outline'\"></mat-icon>\n </button>\n </mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>Duracao da animacao</mat-label>\n <input matInput [(ngModel)]=\"group.animationDuration\" (ngModelChange)=\"onAppearanceChange()\" placeholder=\"500ms\" />\n <button\n mat-icon-button\n matSuffix\n class=\"help-icon-button\"\n type=\"button\"\n [matTooltip]=\"'animationDuration'\"\n matTooltipPosition=\"above\"\n >\n <mat-icon [praxisIcon]=\"'help_outline'\"></mat-icon>\n </button>\n </mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>Cor (M2)</mat-label>\n <select matNativeControl [(ngModel)]=\"group.color\" (ngModelChange)=\"onAppearanceChange()\">\n <option [ngValue]=\"undefined\">(nenhuma)</option>\n <option value=\"primary\">Primary</option>\n <option value=\"accent\">Accent</option>\n <option value=\"warn\">Warn</option>\n </select>\n <button\n mat-icon-button\n matSuffix\n class=\"help-icon-button\"\n type=\"button\"\n [matTooltip]=\"'Preferir tokens em Estilo.'\"\n matTooltipPosition=\"above\"\n >\n <mat-icon [praxisIcon]=\"'help_outline'\"></mat-icon>\n </button>\n </mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>Cor de fundo (M2)</mat-label>\n <select matNativeControl [(ngModel)]=\"group.backgroundColor\" (ngModelChange)=\"onAppearanceChange()\">\n <option [ngValue]=\"undefined\">(nenhuma)</option>\n <option value=\"primary\">Primary</option>\n <option value=\"accent\">Accent</option>\n <option value=\"warn\">Warn</option>\n </select>\n <button\n mat-icon-button\n matSuffix\n class=\"help-icon-button\"\n type=\"button\"\n [matTooltip]=\"'Preferir tokens em Estilo.'\"\n matTooltipPosition=\"above\"\n >\n <mat-icon [praxisIcon]=\"'help_outline'\"></mat-icon>\n </button>\n </mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>aria-label</mat-label>\n <input matInput [(ngModel)]=\"group.ariaLabel\" (ngModelChange)=\"onAppearanceChange()\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>aria-labelledby</mat-label>\n <input matInput [(ngModel)]=\"group.ariaLabelledby\" (ngModelChange)=\"onAppearanceChange()\" />\n </mat-form-field>\n </div>\n <div class=\"editor-row\">\n <mat-slide-toggle [(ngModel)]=\"group.dynamicHeight\" (ngModelChange)=\"onAppearanceChange()\">Altura dinamica</mat-slide-toggle>\n <mat-slide-toggle [(ngModel)]=\"group.fitInkBarToContent\" (ngModelChange)=\"onAppearanceChange()\">Indicador ajustado ao conteudo</mat-slide-toggle>\n <mat-slide-toggle [(ngModel)]=\"group.disablePagination\" (ngModelChange)=\"onAppearanceChange()\">Sem paginacao</mat-slide-toggle>\n <mat-slide-toggle [(ngModel)]=\"group.disableRipple\" (ngModelChange)=\"onAppearanceChange()\">Sem ripple</mat-slide-toggle>\n <mat-slide-toggle [(ngModel)]=\"group.preserveContent\" (ngModelChange)=\"onAppearanceChange()\">Preservar conteudo</mat-slide-toggle>\n <mat-slide-toggle [(ngModel)]=\"group.stretchTabs\" (ngModelChange)=\"onAppearanceChange()\">Esticar abas</mat-slide-toggle>\n </div>\n </div>\n </mat-tab>\n\n <mat-tab label=\"Navegação\">\n <div class=\"editor-section\">\n <div class=\"editor-grid two\">\n <mat-form-field appearance=\"outline\"><mat-label>Indice selecionado</mat-label>\n <input matInput type=\"number\" [(ngModel)]=\"nav.selectedIndex\" (ngModelChange)=\"onAppearanceChange()\" />\n <button\n mat-icon-button\n matSuffix\n class=\"help-icon-button\"\n type=\"button\"\n [matTooltip]=\"'selectedIndex'\"\n matTooltipPosition=\"above\"\n >\n <mat-icon [praxisIcon]=\"'help_outline'\"></mat-icon>\n </button>\n </mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>Duracao da animacao</mat-label>\n <input matInput [(ngModel)]=\"nav.animationDuration\" (ngModelChange)=\"onAppearanceChange()\" placeholder=\"500ms\" />\n <button\n mat-icon-button\n matSuffix\n class=\"help-icon-button\"\n type=\"button\"\n [matTooltip]=\"'animationDuration'\"\n matTooltipPosition=\"above\"\n >\n <mat-icon [praxisIcon]=\"'help_outline'\"></mat-icon>\n </button>\n </mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>aria-label</mat-label>\n <input matInput [(ngModel)]=\"nav.ariaLabel\" (ngModelChange)=\"onAppearanceChange()\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>aria-labelledby</mat-label>\n <input matInput [(ngModel)]=\"nav.ariaLabelledby\" (ngModelChange)=\"onAppearanceChange()\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>Cor (M2)</mat-label>\n <select matNativeControl [(ngModel)]=\"nav.color\" (ngModelChange)=\"onAppearanceChange()\">\n <option [ngValue]=\"undefined\">(nenhuma)</option>\n <option value=\"primary\">Primary</option>\n <option value=\"accent\">Accent</option>\n <option value=\"warn\">Warn</option>\n </select>\n <button\n mat-icon-button\n matSuffix\n class=\"help-icon-button\"\n type=\"button\"\n [matTooltip]=\"'Preferir tokens em Estilo.'\"\n matTooltipPosition=\"above\"\n >\n <mat-icon [praxisIcon]=\"'help_outline'\"></mat-icon>\n </button>\n </mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>Cor de fundo (M2)</mat-label>\n <select matNativeControl [(ngModel)]=\"nav.backgroundColor\" (ngModelChange)=\"onAppearanceChange()\">\n <option [ngValue]=\"undefined\">(nenhuma)</option>\n <option value=\"primary\">Primary</option>\n <option value=\"accent\">Accent</option>\n <option value=\"warn\">Warn</option>\n </select>\n <button\n mat-icon-button\n matSuffix\n class=\"help-icon-button\"\n type=\"button\"\n [matTooltip]=\"'Preferir tokens em Estilo.'\"\n matTooltipPosition=\"above\"\n >\n <mat-icon [praxisIcon]=\"'help_outline'\"></mat-icon>\n </button>\n </mat-form-field>\n </div>\n <div class=\"editor-row\">\n <mat-slide-toggle [(ngModel)]=\"nav.fitInkBarToContent\" (ngModelChange)=\"onAppearanceChange()\">Indicador ajustado ao conteudo</mat-slide-toggle>\n <mat-slide-toggle [(ngModel)]=\"nav.disablePagination\" (ngModelChange)=\"onAppearanceChange()\">Sem paginacao</mat-slide-toggle>\n <mat-slide-toggle [(ngModel)]=\"nav.disableRipple\" (ngModelChange)=\"onAppearanceChange()\">Sem ripple</mat-slide-toggle>\n <mat-slide-toggle [(ngModel)]=\"nav.stretchTabs\" (ngModelChange)=\"onAppearanceChange()\">Esticar abas</mat-slide-toggle>\n </div>\n </div>\n </mat-tab>\n <mat-tab label=\"JSON\">\n <div class=\"editor-section\">\n <div class=\"editor-toolbar\">\n <button mat-button (click)=\"formatJson()\" [disabled]=\"!isValid\"> \n <mat-icon [praxisIcon]=\"'format_align_left'\"></mat-icon>Formatar\n </button>\n <button mat-button (click)=\"reset()\"> \n <mat-icon [praxisIcon]=\"'restart_alt'\"></mat-icon>Resetar\n </button>\n </div>\n\n <mat-form-field appearance=\"outline\" class=\"json-textarea-field full\">\n <mat-label>Configuracao JSON</mat-label>\n <textarea\n matInput\n [(ngModel)]=\"jsonText\"\n (ngModelChange)=\"onJsonTextChange($event)\"\n rows=\"22\"\n spellcheck=\"false\"\n class=\"editor-json\"\n ></textarea>\n <mat-hint *ngIf=\"isValid\">JSON valido</mat-hint>\n <mat-error *ngIf=\"!isValid && jsonText\">JSON invalido: {{ errorMsg }}</mat-error>\n </mat-form-field>\n </div>\n </mat-tab>\n\n <mat-tab label=\"Estilo\">\n <div class=\"editor-section editor-section-lg\">\n <div class=\"editor-row\">\n <span class=\"editor-muted\">Presets:</span>\n <button mat-button color=\"primary\" (click)=\"applyPreset('primary')\">\n <mat-icon [praxisIcon]=\"'palette'\"></mat-icon>\n Primário\n </button>\n <button mat-button (click)=\"applyPreset('neutral')\">\n <mat-icon [praxisIcon]=\"'contrast'\"></mat-icon>\n Neutro\n </button>\n <button mat-button (click)=\"applyPreset('high-contrast')\">\n <mat-icon [praxisIcon]=\"'visibility'\"></mat-icon>\n Alto contraste\n </button>\n <button mat-button (click)=\"clearTokens()\">\n <mat-icon [praxisIcon]=\"'backspace'\"></mat-icon>\n Limpar tokens\n </button>\n </div>\n\n <div class=\"editor-grid two tight\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Classe de tema (opcional)</mat-label>\n <input matInput [(ngModel)]=\"appearance.themeClass\" (ngModelChange)=\"onAppearanceChange()\" placeholder=\"ex.: tabs-accented\" />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Densidade</mat-label>\n <select matNativeControl [(ngModel)]=\"appearance.density\" (ngModelChange)=\"onAppearanceChange()\">\n <option [ngValue]=\"undefined\">Padrao</option>\n <option value=\"compact\">Compacta</option>\n <option value=\"comfortable\">Confortavel</option>\n <option value=\"spacious\">Espacosa</option>\n </select>\n </mat-form-field>\n </div>\n\n <div>\n <div class=\"editor-title-row\">\n <h3 class=\"editor-title\">Tokens (Material 3)</h3>\n <button\n mat-icon-button\n class=\"help-icon-button\"\n type=\"button\"\n [matTooltip]=\"'Valores aceitam CSS vars (ex.: var(--md-sys-color-primary)) ou cores hex/rgb.'\"\n matTooltipPosition=\"above\"\n >\n <mat-icon [praxisIcon]=\"'help_outline'\"></mat-icon>\n </button>\n </div>\n <div class=\"editor-grid two\">\n <ng-container *ngFor=\"let t of tokenList\">\n <mat-form-field appearance=\"outline\">\n <mat-label>{{ t.label }}</mat-label>\n <input matInput placeholder=\"var(--md-sys-color-primary) / #RRGGBB\" [ngModel]=\"appearance.tokens?.[t.key]\" (ngModelChange)=\"onTokenChange(t.key, $event)\" />\n </mat-form-field>\n </ng-container>\n </div>\n </div>\n\n <div>\n <h3 class=\"editor-title\">CSS personalizado</h3>\n <mat-form-field appearance=\"outline\" class=\"json-textarea-field full\">\n <mat-label>CSS a ser injetado no componente</mat-label>\n <textarea matInput rows=\"10\" [(ngModel)]=\"appearance.customCss\" (ngModelChange)=\"onAppearanceChange()\" placeholder=\".praxis-tabs-root .mdc-tab__text-label { font-weight: 600; }\"></textarea>\n </mat-form-field>\n </div>\n\n <div>\n <h3 class=\"editor-title\">Snippet SCSS (para uso em styles.scss)</h3>\n <pre class=\"editor-code\">\n@use '@angular/material' as mat;\n{{ scssSnippet() }}\n </pre>\n </div>\n </div>\n </mat-tab>\n\n <mat-tab label=\"Abas\">\n <div class=\"editor-section\">\n <button mat-stroked-button color=\"primary\" (click)=\"addTab()\"><mat-icon [praxisIcon]=\"'add'\"></mat-icon>Adicionar aba</button>\n <div *ngIf=\"editedConfig.tabs?.length; else noTabs\" class=\"editor-grid\">\n <div *ngFor=\"let t of editedConfig.tabs; let i = index\" class=\"editor-card\">\n <div class=\"editor-card-header\">\n <strong class=\"editor-card-title\">Aba #{{ i+1 }}</strong>\n <button mat-icon-button (click)=\"moveTab(i, -1)\" [disabled]=\"i===0\"><mat-icon [praxisIcon]=\"'arrow_upward'\"></mat-icon></button>\n <button mat-icon-button (click)=\"moveTab(i, 1)\" [disabled]=\"i===editedConfig.tabs!.length-1\"><mat-icon [praxisIcon]=\"'arrow_downward'\"></mat-icon></button>\n <button mat-icon-button color=\"warn\" (click)=\"removeTab(i)\"><mat-icon [praxisIcon]=\"'delete'\"></mat-icon></button>\n </div>\n <div class=\"editor-grid two tight\">\n <mat-form-field appearance=\"outline\"><mat-label>ID</mat-label>\n <input matInput [(ngModel)]=\"t.id\" (ngModelChange)=\"onAppearanceChange()\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>Rotulo</mat-label>\n <input matInput [(ngModel)]=\"t.textLabel\" (ngModelChange)=\"onAppearanceChange()\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>Classe do rotulo</mat-label>\n <input matInput [(ngModel)]=\"t.labelClass\" (ngModelChange)=\"onAppearanceChange()\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>Classe do conteudo</mat-label>\n <input matInput [(ngModel)]=\"t.bodyClass\" (ngModelChange)=\"onAppearanceChange()\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>aria-label</mat-label>\n <input matInput [(ngModel)]=\"t.ariaLabel\" (ngModelChange)=\"onAppearanceChange()\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>aria-labelledby</mat-label>\n <input matInput [(ngModel)]=\"t.ariaLabelledby\" (ngModelChange)=\"onAppearanceChange()\" />\n </mat-form-field>\n </div>\n <mat-slide-toggle [(ngModel)]=\"t.disabled\" (ngModelChange)=\"onAppearanceChange()\">Desativada</mat-slide-toggle>\n\n <!-- Widgets (componentes dinâmicos) -->\n <div class=\"editor-divider editor-grid\">\n <div class=\"editor-row\">\n <mat-form-field appearance=\"outline\" class=\"editor-field-min\">\n <mat-label>Adicionar componente</mat-label>\n <select matNativeControl [(ngModel)]=\"selectedTabWidgetId[i]\">\n <option [ngValue]=\"''\">(selecione)</option>\n <option *ngFor=\"let c of componentOptions\" [ngValue]=\"c.id\">{{ c.friendlyName || c.id }}</option>\n </select>\n </mat-form-field>\n <button mat-stroked-button (click)=\"addWidgetToTab(i)\"><mat-icon [praxisIcon]=\"'add'\"></mat-icon>Adicionar</button>\n <span class=\"editor-spacer\"></span>\n <mat-form-field appearance=\"outline\" class=\"editor-field-240\">\n <mat-label>Recurso (resourcePath)</mat-label>\n <input matInput [(ngModel)]=\"quickResourcePathTab[i]\" placeholder=\"ex.: usuarios\" />\n </mat-form-field>\n <button mat-button (click)=\"addPresetToTab(i, 'form')\"><mat-icon [praxisIcon]=\"'description'\"></mat-icon>Form</button>\n <button mat-button (click)=\"addPresetToTab(i, 'table')\"><mat-icon [praxisIcon]=\"'grid_on'\"></mat-icon>Tabela</button>\n <button mat-button (click)=\"addPresetToTab(i, 'crud')\"><mat-icon [praxisIcon]=\"'dynamic_form'\"></mat-icon>CRUD</button>\n </div>\n\n <div *ngIf=\"t.widgets?.length\" class=\"editor-grid\" cdkDropList [cdkDropListData]=\"t.widgets || []\" (cdkDropListDropped)=\"onTabWidgetDrop(i, $event)\">\n <div *ngFor=\"let w of t.widgets; let wi = index\" cdkDrag class=\"editor-card dashed\">\n <div class=\"editor-card-header\">\n <button mat-icon-button cdkDragHandle matTooltip=\"Arrastar para reordenar\" aria-label=\"Arrastar para reordenar\">\n <mat-icon [praxisIcon]=\"'drag_indicator'\"></mat-icon>\n </button>\n <strong class=\"editor-card-title\">{{ getCompName(w.id) }}</strong>\n <button mat-icon-button color=\"warn\" (click)=\"removeWidgetFromTab(i, wi)\" matTooltip=\"Remover componente\" aria-label=\"Remover componente\"><mat-icon [praxisIcon]=\"'delete'\"></mat-icon></button>\n </div>\n <div class=\"editor-grid two tight\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Inputs (JSON)</mat-label>\n <textarea matInput rows=\"4\" [ngModel]=\"stringify(w.inputs)\" (ngModelChange)=\"updateWidgetInputsTab(i, wi, $event)\"></textarea>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Outputs (JSON)</mat-label>\n <textarea matInput rows=\"4\" [ngModel]=\"stringify(w.outputs)\" (ngModelChange)=\"updateWidgetOutputsTab(i, wi, $event)\"></textarea>\n </mat-form-field>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <ng-template #noTabs><em class=\"editor-muted\">Nenhuma aba definida.</em></ng-template>\n </div>\n </mat-tab>\n\n <mat-tab label=\"Acessibilidade\">\n <div class=\"editor-section\">\n <div class=\"editor-row\">\n <mat-slide-toggle [(ngModel)]=\"accessibility.highContrast\" (ngModelChange)=\"onAppearanceChange()\">Alto contraste</mat-slide-toggle>\n <mat-slide-toggle [(ngModel)]=\"accessibility.reduceMotion\" (ngModelChange)=\"onAppearanceChange()\">Reduzir movimento</mat-slide-toggle>\n </div>\n </div>\n </mat-tab>\n\n <mat-tab label=\"Links\">\n <div class=\"editor-section\">\n <button mat-stroked-button color=\"primary\" (click)=\"addLink()\"><mat-icon [praxisIcon]=\"'add_link'\"></mat-icon>Adicionar link</button>\n <div *ngIf=\"nav.links?.length; else noLinks\" class=\"editor-grid\">\n <div *ngFor=\"let l of nav.links; let i = index\" class=\"editor-card\">\n <div class=\"editor-card-header\">\n <strong class=\"editor-card-title\">Link #{{ i+1 }}</strong>\n <button mat-icon-button (click)=\"moveLink(i, -1)\" [disabled]=\"i===0\"><mat-icon [praxisIcon]=\"'arrow_upward'\"></mat-icon></button>\n <button mat-icon-button (click)=\"moveLink(i, 1)\" [disabled]=\"i===nav.links!.length-1\"><mat-icon [praxisIcon]=\"'arrow_downward'\"></mat-icon></button>\n <button mat-icon-button color=\"warn\" (click)=\"removeLink(i)\"><mat-icon [praxisIcon]=\"'delete'\"></mat-icon></button>\n </div>\n <div class=\"editor-grid two tight\">\n <mat-form-field appearance=\"outline\"><mat-label>ID</mat-label>\n <input matInput [(ngModel)]=\"l.id\" (ngModelChange)=\"onAppearanceChange()\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>Rotulo</mat-label>\n <input matInput [(ngModel)]=\"l.label\" (ngModelChange)=\"onAppearanceChange()\" />\n </mat-form-field>\n </div>\n <div class=\"editor-row\">\n <mat-slide-toggle [(ngModel)]=\"l.active\" (ngModelChange)=\"onAppearanceChange()\">Ativo</mat-slide-toggle>\n <mat-slide-toggle [(ngModel)]=\"l.disabled\" (ngModelChange)=\"onAppearanceChange()\">Desativado</mat-slide-toggle>\n <mat-slide-toggle [(ngModel)]=\"l.disableRipple\" (ngModelChange)=\"onAppearanceChange()\">Sem ripple</mat-slide-toggle>\n <mat-slide-toggle [(ngModel)]=\"l.fitInkBarToContent\" (ngModelChange)=\"onAppearanceChange()\">Indicador ajustado ao conteudo</mat-slide-toggle>\n </div>\n\n <!-- Widgets para Links -->\n <div class=\"editor-divider editor-grid\">\n <div class=\"editor-row\">\n <mat-form-field appearance=\"outline\" class=\"editor-field-min\">\n <mat-label>Adicionar componente</mat-label>\n <select matNativeControl [(ngModel)]=\"selectedLinkWidgetId[i]\">\n <option [ngValue]=\"''\">(selecione)</option>\n <option *ngFor=\"let c of componentOptions\" [ngValue]=\"c.id\">{{ c.friendlyName || c.id }}</option>\n </select>\n </mat-form-field>\n <button mat-stroked-button (click)=\"addWidgetToLink(i)\"><mat-icon [praxisIcon]=\"'add'\"></mat-icon>Adicionar</button>\n <span class=\"editor-spacer\"></span>\n <mat-form-field appearance=\"outline\" class=\"editor-field-240\">\n <mat-label>Recurso (resourcePath)</mat-label>\n <input matInput [(ngModel)]=\"quickResourcePathLink[i]\" placeholder=\"ex.: usuarios\" />\n </mat-form-field>\n <button mat-button (click)=\"addPresetToLink(i, 'form')\"><mat-icon [praxisIcon]=\"'description'\"></mat-icon>Form</button>\n <button mat-button (click)=\"addPresetToLink(i, 'table')\"><mat-icon [praxisIcon]=\"'grid_on'\"></mat-icon>Tabela</button>\n <button mat-button (click)=\"addPresetToLink(i, 'crud')\"><mat-icon [praxisIcon]=\"'dynamic_form'\"></mat-icon>CRUD</button>\n </div>\n\n <div *ngIf=\"l.widgets?.length\" class=\"editor-grid\" cdkDropList [cdkDropListData]=\"l.widgets || []\" (cdkDropListDropped)=\"onLinkWidgetDrop(i, $event)\">\n <div *ngFor=\"let w of l.widgets; let wi = index\" cdkDrag class=\"editor-card dashed\">\n <div class=\"editor-card-header\">\n <button mat-icon-button cdkDragHandle matTooltip=\"Arrastar para reordenar\" aria-label=\"Arrastar para reordenar\">\n <mat-icon [praxisIcon]=\"'drag_indicator'\"></mat-icon>\n </button>\n <strong class=\"editor-card-title\">{{ getCompName(w.id) }}</strong>\n <button mat-icon-button color=\"warn\" (click)=\"removeWidgetFromLink(i, wi)\" matTooltip=\"Remover componente\" aria-label=\"Remover componente\"><mat-icon [praxisIcon]=\"'delete'\"></mat-icon></button>\n </div>\n <div class=\"editor-grid two tight\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Inputs (JSON)</mat-label>\n <textarea matInput rows=\"4\" [ngModel]=\"stringify(w.inputs)\" (ngModelChange)=\"updateWidgetInputsLink(i, wi, $event)\"></textarea>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Outputs (JSON)</mat-label>\n <textarea matInput rows=\"4\" [ngModel]=\"stringify(w.outputs)\" (ngModelChange)=\"updateWidgetOutputsLink(i, wi, $event)\"></textarea>\n </mat-form-field>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <ng-template #noLinks><em class=\"editor-muted\">Nenhum link definido.</em></ng-template>\n </div>\n </mat-tab>\n </mat-tab-group>\n `,\n styles: [`\n :host {\n display: block;\n color: var(--md-sys-color-on-surface);\n }\n .editor-tabs {\n --editor-surface: var(--md-sys-color-surface-container-lowest, var(--md-sys-color-surface));\n --editor-border: 1px solid var(--md-sys-color-outline-variant);\n --editor-radius: 12px;\n --editor-muted: var(--md-sys-color-on-surface-variant);\n }\n .editor-section {\n padding: 12px;\n display: grid;\n gap: 12px;\n background: var(--editor-surface);\n border: var(--editor-border);\n border-radius: var(--editor-radius);\n }\n .editor-section-lg { gap: 16px; }\n .editor-row {\n display: flex;\n gap: 10px;\n flex-wrap: wrap;\n align-items: center;\n }\n .editor-grid {\n display: grid;\n gap: 12px;\n }\n .editor-grid.two {\n grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));\n }\n .editor-grid.tight { gap: 8px; }\n .editor-toolbar {\n display: flex;\n gap: 8px;\n flex-wrap: wrap;\n align-items: center;\n }\n .editor-muted { color: var(--editor-muted); }\n .editor-title { margin: 6px 0 8px; font-size: 1rem; }\n .editor-title-row { display: flex; align-items: center; gap: 8px; }\n .editor-code {\n white-space: pre-wrap;\n background: var(--md-sys-color-surface-container);\n padding: 8px;\n border-radius: 6px;\n border: 1px solid var(--md-sys-color-outline-variant);\n }\n .editor-card {\n border: 1px solid var(--md-sys-color-outline-variant);\n padding: 10px;\n border-radius: 10px;\n display: grid;\n gap: 8px;\n background: var(--md-sys-color-surface);\n }\n .editor-card.dashed { border-style: dashed; }\n .editor-card-header {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n .editor-card-title { flex: 1; font-weight: 600; }\n .editor-divider {\n border-top: 1px solid var(--md-sys-color-outline-variant);\n padding-top: 8px;\n }\n .editor-spacer { flex: 1; }\n .editor-field-min { min-width: 260px; }\n .editor-section .editor-field-min { width: 260px; max-width: 260px; }\n .editor-field-240 { width: 240px; }\n .editor-section .editor-field-240 { width: 240px; max-width: 240px; }\n .editor-json { font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace; }\n .editor-section .mat-mdc-form-field {\n width: 100%;\n max-width: 520px;\n --mdc-outlined-text-field-container-height: 48px;\n --mdc-outlined-text-field-outline-color: var(--md-sys-color-outline-variant);\n --mdc-outlined-text-field-hover-outline-color: var(--md-sys-color-outline);\n --mdc-outlined-text-field-focus-outline-color: var(--md-sys-color-primary);\n --mdc-outlined-text-field-error-outline-color: var(--md-sys-color-error);\n --mdc-outlined-text-field-error-focus-outline-color: var(--md-sys-color-error);\n --mdc-outlined-text-field-error-hover-outline-color: var(--md-sys-color-error);\n --mdc-outlined-text-field-label-text-color: var(--md-sys-color-on-surface-variant);\n --mdc-outlined-text-field-input-text-color: var(--md-sys-color-on-surface);\n --mdc-outlined-text-field-supporting-text-color: var(--md-sys-color-on-surface-variant);\n }\n .editor-section .mat-mdc-form-field.full { max-width: none; }\n .help-icon-button {\n --mdc-icon-button-state-layer-size: 28px;\n --mdc-icon-button-icon-size: 18px;\n width: 28px;\n height: 28px;\n padding: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n margin-right: -4px;\n }\n .help-icon-button mat-icon { font-size: 18px; width: 18px; height: 18px; }\n .mat-mdc-form-field-icon-suffix { align-self: center; }\n `],\n})\nexport class PraxisTabsConfigEditor implements SettingsValueProvider {\n editedConfig: TabsMetadata;\n private initialConfig: TabsMetadata;\n jsonText = '';\n isValid = true;\n errorMsg = '';\n componentOptions: Array<{ id: string; friendlyName?: string }> = [];\n selectedTabWidgetId: Record<number, string> = {};\n selectedLinkWidgetId: Record<number, string> = {};\n quickResourcePathTab: Record<number, string> = {};\n quickResourcePathLink: Record<number, string> = {};\n\n // Simplified token list we support at runtime\n tokenList = [\n { key: 'active-indicator-color', label: 'Indicador ativo' },\n { key: 'active-label-text-color', label: 'Texto ativo' },\n { key: 'active-hover-indicator-color', label: 'Indicador ativo (hover)' },\n { key: 'active-hover-label-text-color', label: 'Texto ativo (hover)' },\n { key: 'active-focus-indicator-color', label: 'Indicador ativo (focus)' },\n { key: 'active-focus-label-text-color', label: 'Texto ativo (focus)' },\n { key: 'inactive-label-text-color', label: 'Texto inativo' },\n { key: 'inactive-hover-label-text-color', label: 'Texto inativo (hover)' },\n { key: 'inactive-focus-label-text-color', label: 'Texto inativo (focus)' },\n { key: 'pagination-icon-color', label: 'Ícones de paginação' },\n { key: 'divider-color', label: 'Divisor/linha' },\n { key: 'background-color', label: 'Fundo do header' },\n ] as const;\n\n private presets: Record<string, Record<string, string>> = {\n primary: {\n 'active-indicator-color': 'var(--md-sys-color-primary)',\n 'active-label-text-color': 'var(--md-sys-color-primary)',\n 'inactive-label-text-color': 'var(--md-sys-color-on-surface-variant)',\n 'inactive-hover-label-text-color': 'var(--md-sys-color-on-surface)',\n 'divider-color': 'var(--md-sys-color-outline-variant)',\n 'background-color': 'var(--md-sys-color-surface-container)',\n 'pagination-icon-color': 'var(--md-sys-color-on-surface)'\n },\n neutral: {\n 'active-indicator-color': 'var(--md-sys-color-on-surface)',\n 'active-label-text-color': 'var(--md-sys-color-on-surface)',\n 'inactive-label-text-color': 'var(--md-sys-color-on-surface-variant)',\n 'inactive-hover-label-text-color': 'var(--md-sys-color-on-surface)',\n 'divider-color': 'var(--md-sys-color-outline-variant)',\n 'background-color': 'var(--md-sys-color-surface-container)',\n 'pagination-icon-color': 'var(--md-sys-color-on-surface)'\n },\n 'high-contrast': {\n 'active-indicator-color': 'var(--md-sys-color-primary)',\n 'active-label-text-color': 'var(--md-sys-color-on-primary)',\n 'inactive-label-text-color': 'var(--md-sys-color-on-surface-variant)',\n 'inactive-hover-label-text-color': 'var(--md-sys-color-on-surface)',\n 'divider-color': 'var(--md-sys-color-outline)',\n 'background-color': 'var(--md-sys-color-surface)',\n 'pagination-icon-color': 'var(--md-sys-color-on-surface)'\n }\n };\n\n isDirty$ = new BehaviorSubject<boolean>(false);\n isValid$ = new BehaviorSubject<boolean>(true);\n isBusy$ = new BehaviorSubject<boolean>(false);\n\n constructor(@Inject(SETTINGS_PANEL_DATA) data: any, private registry: ComponentMetadataRegistry) {\n const cfg: TabsMetadata = data?.config || data || ({} as TabsMetadata);\n this.initialConfig = structuredClone(cfg);\n this.editedConfig = structuredClone(cfg);\n this.isValid$.next(true);\n this.jsonText = this.stringify(this.editedConfig);\n this.updateDirty();\n this.componentOptions = this.registry.getAll().map((m) => ({ id: m.id, friendlyName: m.friendlyName }));\n }\n\n private updateDirty(): void {\n this.isDirty$.next(\n JSON.stringify(this.initialConfig) !== JSON.stringify(this.editedConfig),\n );\n }\n\n onJsonTextChange(text: string): void {\n try {\n const parsed = JSON.parse(text) as TabsMetadata;\n this.errorMsg = '';\n this.isValid = true;\n this.isValid$.next(true);\n this.editedConfig = parsed;\n this.updateDirty();\n } catch (e: any) {\n this.isValid = false;\n this.isValid$.next(false);\n this.errorMsg = e?.message || 'Erro de sintaxe JSON';\n }\n }\n\n // stringify helper is public to be used in the template\n\n formatJson(): void {\n if (!this.isValid) return;\n this.jsonText = this.stringify(this.editedConfig);\n }\n\n getSettingsValue(): any {\n return { config: this.editedConfig };\n }\n\n onSave(): any {\n return { config: this.editedConfig };\n }\n\n reset(): void {\n this.editedConfig = structuredClone(this.initialConfig);\n this.jsonText = this.stringify(this.editedConfig);\n this.isValid = true;\n this.isValid$.next(true);\n this.updateDirty();\n }\n\n // Appearance helpers\n get appearance(): NonNullable<TabsMetadata['appearance']> {\n const ap = (this.editedConfig.appearance ??= {} as any);\n (ap.tokens ??= {} as any);\n return ap as any;\n }\n\n onAppearanceChange(): void {\n this.updateDirty();\n this.jsonText = this.stringify(this.editedConfig);\n }\n\n onTokenChange(key: string, value: string): void {\n const ap = this.appearance;\n const tokens = (ap.tokens = ap.tokens || {});\n if (!value) {\n delete tokens[key as keyof typeof tokens];\n } else {\n (tokens as any)[key] = value;\n }\n this.onAppearanceChange();\n }\n\n clearTokens(): void {\n const ap = this.appearance;\n ap.tokens = {} as any;\n this.onAppearanceChange();\n }\n\n applyPreset(id: 'primary' | 'neutral' | 'high-contrast'): void {\n const preset = this.presets[id];\n if (!preset) return;\n const ap = this.appearance;\n const tokens = (ap.tokens = ap.tokens || {});\n for (const [k, v] of Object.entries(preset)) {\n (tokens as any)[k] = v;\n }\n this.onAppearanceChange();\n }\n\n scssSnippet(): string {\n const tokens = this.editedConfig.appearance?.tokens || {};\n const entries = Object.entries(tokens).filter(([, v]) => !!v);\n const selector = this.editedConfig.appearance?.themeClass\n ? `.${this.editedConfig.appearance.themeClass}`\n : ':root';\n const map = entries.map(([k, v]) => ` ${k}: ${v},`).join('\\n');\n return `${selector} {\\n @include mat.tabs-overrides((\\n${map}\\n ));\\n}`;\n }\n\n // Group/Nav helpers and list editors\n get group(): any {\n if (!this.editedConfig.group) this.editedConfig.group = {} as any;\n return this.editedConfig.group as any;\n }\n\n get nav(): any {\n const nav = (this.editedConfig.nav ??= { links: [] } as any);\n if (!nav.links) nav.links = [] as any;\n return nav as any;\n }\n\n get behavior(): any {\n if (!this.editedConfig.behavior) this.editedConfig.behavior = {} as any;\n // Default to lazy load to improve UX/perf with heavy widgets (table/form)\n if (typeof (this.editedConfig.behavior as any).lazyLoad === 'undefined') {\n (this.editedConfig.behavior as any).lazyLoad = true;\n }\n return this.editedConfig.behavior as any;\n }\n\n get accessibility(): any {\n if (!this.editedConfig.accessibility) this.editedConfig.accessibility = {} as any;\n return this.editedConfig.accessibility as any;\n }\n\n addTab(): void {\n if (!this.editedConfig.tabs) this.editedConfig.tabs = [];\n this.editedConfig.tabs.push({ id: `tab${(this.editedConfig.tabs.length + 1)}`, textLabel: 'Nova aba' } as any);\n this.onAppearanceChange();\n }\n\n removeTab(index: number): void {\n this.editedConfig.tabs?.splice(index, 1);\n this.onAppearanceChange();\n }\n\n moveTab(index: number, delta: number): void {\n if (!this.editedConfig.tabs) return;\n const i2 = index + delta;\n if (i2 < 0 || i2 >= this.editedConfig.tabs.length) return;\n const [item] = this.editedConfig.tabs.splice(index, 1);\n this.editedConfig.tabs.splice(i2, 0, item);\n this.onAppearanceChange();\n }\n // ===== Widgets (Tabs) =====\n addWidgetToTab(tabIndex: number): void {\n const id = (this.selectedTabWidgetId[tabIndex] || '').trim();\n if (!id) return;\n const t = this.editedConfig.tabs![tabIndex] as any;\n t.widgets = t.widgets || [];\n t.widgets.push({ id } as WidgetDefinition);\n this.onAppearanceChange();\n }\n removeWidgetFromTab(tabIndex: number, widgetIndex: number): void {\n const t = this.editedConfig.tabs![tabIndex] as any;\n if (!t.widgets) return;\n t.widgets.splice(widgetIndex, 1);\n this.onAppearanceChange();\n }\n updateWidgetInputsTab(tabIndex: number, widgetIndex: number, text: string): void {\n const t = this.editedConfig.tabs![tabIndex] as any;\n try { const obj = text ? JSON.parse(text) : undefined; t.widgets[widgetIndex].inputs = obj; this.onAppearanceChange(); } catch {}\n }\n updateWidgetOutputsTab(tabIndex: number, widgetIndex: number, text: string): void {\n const t = this.editedConfig.tabs![tabIndex] as any;\n try { const obj = text ? JSON.parse(text) : undefined; t.widgets[widgetIndex].outputs = obj; this.onAppearanceChange(); } catch {}\n }\n addPresetToTab(tabIndex: number, type: 'form' | 'table' | 'crud'): void {\n const rp = (this.quickResourcePathTab[tabIndex] || '').trim();\n if (!rp) return;\n const t = this.editedConfig.tabs![tabIndex] as any;\n t.widgets = t.widgets || [];\n if (type === 'form') {\n t.widgets.push({ id: 'praxis-dynamic-form', inputs: { resourcePath: rp } });\n } else if (type === 'table') {\n t.widgets.push({ id: 'praxis-table', inputs: { resourcePath: rp, tableId: rp } });\n } else {\n t.widgets.push({ id: 'praxis-crud', inputs: { crudId: rp, metadata: { resource: { path: rp } } } });\n }\n this.onAppearanceChange();\n }\n\n addLink(): void {\n if (!this.nav.links) this.nav.links = [];\n this.nav.links.push({ id: `link${this.nav.links.length + 1}`, label: 'Novo link' });\n this.onAppearanceChange();\n }\n\n removeLink(index: number): void {\n if (!this.nav.links) return;\n this.nav.links.splice(index, 1);\n this.onAppearanceChange();\n }\n\n moveLink(index: number, delta: number): void {\n if (!this.nav.links) return;\n const i2 = index + delta;\n if (i2 < 0 || i2 >= this.nav.links.length) return;\n const [item] = this.nav.links.splice(index, 1);\n this.nav.links.splice(i2, 0, item);\n this.onAppearanceChange();\n }\n // ===== Widgets (Links) =====\n addWidgetToLink(linkIndex: number): void {\n const id = (this.selectedLinkWidgetId[linkIndex] || '').trim();\n if (!id) return;\n const l = this.nav.links[linkIndex] as any;\n l.widgets = l.widgets || [];\n l.widgets.push({ id } as WidgetDefinition);\n this.onAppearanceChange();\n }\n removeWidgetFromLink(linkIndex: number, widgetIndex: number): void {\n const l = this.nav.links[linkIndex] as any;\n if (!l.widgets) return;\n l.widgets.splice(widgetIndex, 1);\n this.onAppearanceChange();\n }\n updateWidgetInputsLink(linkIndex: number, widgetIndex: number, text: string): void {\n const l = this.nav.links[linkIndex] as any;\n try { const obj = text ? JSON.parse(text) : undefined; l.widgets[widgetIndex].inputs = obj; this.onAppearanceChange(); } catch {}\n }\n updateWidgetOutputsLink(linkIndex: number, widgetIndex: number, text: string): void {\n const l = this.nav.links[linkIndex] as any;\n try { const obj = text ? JSON.parse(text) : undefined; l.widgets[widgetIndex].outputs = obj; this.onAppearanceChange(); } catch {}\n }\n addPresetToLink(linkIndex: number, type: 'form' | 'table' | 'crud'): void {\n const rp = (this.quickResourcePathLink[linkIndex] || '').trim();\n if (!rp) return;\n const l = this.nav.links[linkIndex] as any;\n l.widgets = l.widgets || [];\n if (type === 'form') {\n l.widgets.push({ id: 'praxis-dynamic-form', inputs: { resourcePath: rp } });\n } else if (type === 'table') {\n l.widgets.push({ id: 'praxis-table', inputs: { resourcePath: rp, tableId: rp } });\n } else {\n l.widgets.push({ id: 'praxis-crud', inputs: { crudId: rp, metadata: { resource: { path: rp } } } });\n }\n this.onAppearanceChange();\n }\n\n stringify(v: any): string { try { return v ? JSON.stringify(v, null, 2) : ''; } catch { return ''; } }\n getCompName(id: string): string { const c = this.componentOptions.find(o => o.id === id); return c?.friendlyName || id; }\n\n // Reorder handlers (drag & drop)\n onTabWidgetDrop(tabIndex: number, event: CdkDragDrop<WidgetDefinition[]>): void {\n const t = this.editedConfig.tabs?.[tabIndex] as any;\n if (!t?.widgets) return;\n moveItemInArray(t.widgets, event.previousIndex, event.currentIndex);\n this.onAppearanceChange();\n }\n\n onLinkWidgetDrop(linkIndex: number, event: CdkDragDrop<WidgetDefinition[]>): void {\n const l = this.nav.links?.[linkIndex] as any;\n if (!l?.widgets) return;\n moveItemInArray(l.widgets, event.previousIndex, event.currentIndex);\n this.onAppearanceChange();\n }\n}\n","import { Component, Inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatIconModule } from '@angular/material/icon';\nimport { PraxisIconDirective } from '@praxisui/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { BehaviorSubject } from 'rxjs';\nimport { SETTINGS_PANEL_DATA, SettingsValueProvider } from '@praxisui/settings-panel';\nimport { TabsMetadata } from '../praxis-tabs';\n\ninterface QuickSetupModel {\n mode: 'group' | 'nav';\n labels: string[];\n dynamicHeight?: boolean;\n stretchTabs?: boolean;\n}\n\n@Component({\n selector: 'praxis-tabs-quick-setup',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n MatFormFieldModule,\n MatInputModule,\n MatIconModule,\n PraxisIconDirective,\n MatButtonModule,\n MatSlideToggleModule,\n ],\n template: `\n <div class=\"setup-root\">\n <div class=\"setup-row\">\n <button mat-stroked-button [color]=\"model.mode==='group' ? 'primary' : undefined\" (click)=\"setMode('group')\">\n <mat-icon [praxisIcon]=\"'tab'\"></mat-icon>\n Grupo de abas\n </button>\n <button mat-stroked-button [color]=\"model.mode==='nav' ? 'primary' : undefined\" (click)=\"setMode('nav')\">\n <mat-icon [praxisIcon]=\"'segment'\"></mat-icon>\n Navegacao por links\n </button>\n </div>\n\n <div class=\"setup-grid\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Adicionar rotulo</mat-label>\n <input matInput [(ngModel)]=\"newLabel\" (keyup.enter)=\"addLabel()\" placeholder=\"Ex.: Dados Gerais\" />\n </mat-form-field>\n <button mat-flat-button color=\"primary\" (click)=\"addLabel()\">\n <mat-icon [praxisIcon]=\"'add'\"></mat-icon>\n Adicionar\n </button>\n </div>\n\n <div *ngIf=\"model.labels.length; else emptyLabels\" class=\"setup-row wrap\">\n <div *ngFor=\"let l of model.labels; let i = index\" class=\"chip\">\n <span>{{ l }}</span>\n <button mat-icon-button (click)=\"removeLabel(i)\" aria-label=\"Remover rotulo\"><mat-icon [praxisIcon]=\"'close'\"></mat-icon></button>\n </div>\n </div>\n <ng-template #emptyLabels>\n <em class=\"hint\">Adicione um ou mais rotulos para criar as abas.</em>\n </ng-template>\n\n <div class=\"setup-row\">\n <mat-slide-toggle [(ngModel)]=\"model.dynamicHeight\">Altura dinamica</mat-slide-toggle>\n <mat-slide-toggle [(ngModel)]=\"model.stretchTabs\">Esticar abas</mat-slide-toggle>\n </div>\n </div>\n `,\n styles: [`\n :host {\n display: block;\n color: var(--md-sys-color-on-surface);\n }\n .setup-root {\n display: grid;\n gap: 12px;\n padding: 8px;\n background: var(--md-sys-color-surface-container-lowest, var(--md-sys-color-surface));\n border: 1px solid var(--md-sys-color-outline-variant);\n border-radius: 12px;\n }\n .setup-row {\n display: flex;\n gap: 12px;\n align-items: center;\n flex-wrap: wrap;\n }\n .setup-row.wrap { flex-wrap: wrap; }\n .setup-grid {\n display: grid;\n grid-template-columns: 1fr auto;\n gap: 8px;\n align-items: start;\n }\n .setup-root .mat-mdc-form-field {\n width: 100%;\n max-width: 520px;\n --mdc-outlined-text-field-container-height: 48px;\n --mdc-outlined-text-field-outline-color: var(--md-sys-color-outline-variant);\n --mdc-outlined-text-field-hover-outline-color: var(--md-sys-color-outline);\n --mdc-outlined-text-field-focus-outline-color: var(--md-sys-color-primary);\n --mdc-outlined-text-field-error-outline-color: var(--md-sys-color-error);\n --mdc-outlined-text-field-error-focus-outline-color: var(--md-sys-color-error);\n --mdc-outlined-text-field-error-hover-outline-color: var(--md-sys-color-error);\n --mdc-outlined-text-field-label-text-color: var(--md-sys-color-on-surface-variant);\n --mdc-outlined-text-field-input-text-color: var(--md-sys-color-on-surface);\n --mdc-outlined-text-field-supporting-text-color: var(--md-sys-color-on-surface-variant);\n }\n .chip {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 8px;\n border: 1px solid var(--md-sys-color-outline-variant);\n border-radius: 16px;\n background: var(--md-sys-color-surface);\n }\n .hint { color: var(--md-sys-color-on-surface-variant); }\n `],\n})\nexport class TabsQuickSetupComponent implements SettingsValueProvider {\n model: QuickSetupModel = { mode: 'group', labels: [], dynamicHeight: true, stretchTabs: true };\n private initial: QuickSetupModel = { ...this.model };\n newLabel = '';\n\n isDirty$ = new BehaviorSubject<boolean>(false);\n isValid$ = new BehaviorSubject<boolean>(false);\n isBusy$ = new BehaviorSubject<boolean>(false);\n\n constructor(@Inject(SETTINGS_PANEL_DATA) data: any) {\n // Optionally seed from existing config\n const cfg = (data?.config as TabsMetadata | undefined) || undefined;\n if (cfg) {\n if (cfg.tabs?.length) {\n this.model.mode = 'group';\n this.model.labels = cfg.tabs\n .map((t) => String(t.textLabel || '').trim())\n .filter((label) => label.length > 0);\n this.model.dynamicHeight = cfg.group?.dynamicHeight ?? true;\n this.model.stretchTabs = cfg.group?.stretchTabs ?? true;\n } else if (cfg.nav?.links?.length) {\n this.model.mode = 'nav';\n this.model.labels = cfg.nav.links\n .map((l) => String(l.label || '').trim())\n .filter((label) => label.length > 0);\n this.model.stretchTabs = cfg.nav.stretchTabs ?? true;\n }\n this.initial = { ...this.model, labels: [...this.model.labels] };\n }\n this.updateState();\n }\n\n private normalizedLabels(): string[] {\n return this.model.labels\n .map((label) => String(label || '').trim())\n .filter((label) => label.length > 0);\n }\n\n private updateState(): void {\n const dirty = JSON.stringify(this.model) !== JSON.stringify(this.initial);\n this.isDirty$.next(dirty);\n this.isValid$.next(this.normalizedLabels().length > 0);\n }\n\n setMode(mode: 'group' | 'nav'): void {\n this.model.mode = mode;\n this.updateState();\n }\n\n addLabel(): void {\n const l = (this.newLabel || '').trim();\n if (!l) return;\n this.model.labels.push(l);\n this.newLabel = '';\n this.updateState();\n }\n\n removeLabel(i: number): void {\n this.model.labels.splice(i, 1);\n this.updateState();\n }\n\n private buildConfig(): TabsMetadata {\n const labels = this.normalizedLabels();\n if (this.model.mode === 'group') {\n return {\n group: {\n dynamicHeight: !!this.model.dynamicHeight,\n stretchTabs: !!this.model.stretchTabs,\n selectedIndex: 0,\n },\n tabs: labels.map((label, idx) => ({ id: `tab${idx + 1}`, textLabel: label })),\n };\n }\n return {\n nav: {\n selectedIndex: 0,\n stretchTabs: !!this.model.stretchTabs,\n links: labels.map((label, idx) => ({ id: `link${idx + 1}`, label })),\n },\n } as TabsMetadata;\n }\n\n getSettingsValue(): any {\n return { config: this.buildConfig() };\n }\n\n onSave(): any {\n return { config: this.buildConfig() };\n }\n}\n","/**\n * Capabilities catalog for Praxis Tabs (TabsMetadata).\n * Paths follow TabsMetadata shape (patches are merged at config root).\n */\n\nimport type {\n AiCapability,\n AiCapabilityCatalog,\n AiCapabilityCategory,\n AiValueKind,\n} from '@praxisui/core';\n\ndeclare module '@praxisui/core' {\n interface AiCapabilityCategoryMap {\n meta: true;\n group: true;\n nav: true;\n tabs: true;\n }\n}\n\nexport type CapabilityCategory = AiCapabilityCategory;\nexport type ValueKind = AiValueKind;\n\nexport interface Capability extends AiCapability {\n category: CapabilityCategory;\n}\n\nexport interface CapabilityCatalog extends AiCapabilityCatalog {\n capabilities: Capability[];\n}\n\nconst ENUMS: Record<string, Array<string | number>> = {\n appearanceDensity: ['compact', 'comfortable', 'spacious'],\n alignTabs: ['start', 'center', 'end'],\n headerPosition: ['above', 'below'],\n matColor: ['primary', 'accent', 'warn'],\n};\n\nconst TOKENS = [\n 'active-indicator-color',\n 'active-label-text-color',\n 'active-hover-indicator-color',\n 'active-hover-label-text-color',\n 'active-focus-indicator-color',\n 'active-focus-label-text-color',\n 'inactive-label-text-color',\n 'inactive-hover-label-text-color',\n 'inactive-focus-label-text-color',\n 'inactive-ripple-color',\n 'pagination-icon-color',\n 'divider-color',\n 'background-color',\n];\n\nconst TOKEN_CAPS: Capability[] = TOKENS.map((t): Capability => ({\n path: `appearance.tokens.${t}`,\n category: 'appearance',\n valueKind: 'string',\n description: `Token ${t} (CSS color or var).`,\n}));\n\nconst CAPS: Capability[] = [\n { path: 'meta', category: 'meta', valueKind: 'object', description: 'Metadata bag for tabs.' },\n\n { path: 'appearance', category: 'appearance', valueKind: 'object', description: 'Appearance settings.' },\n { path: 'appearance.density', category: 'appearance', valueKind: 'enum', allowedValues: ENUMS.appearanceDensity, description: 'Density preset.' },\n { path: 'appearance.themeClass', category: 'appearance', valueKind: 'string', description: 'Theme CSS class applied to root.' },\n { path: 'appearance.customCss', category: 'appearance', valueKind: 'string', description: 'Custom CSS injected into component.', safetyNotes: 'CSS is injected as raw string.' },\n { path: 'appearance.tokens', category: 'appearance', valueKind: 'object', description: 'Style tokens mapped to runtime CSS.' },\n ...TOKEN_CAPS,\n\n { path: 'behavior', category: 'behavior', valueKind: 'object', description: 'Behavior settings.' },\n { path: 'behavior.lazyLoad', category: 'behavior', valueKind: 'boolean', description: 'Lazy load tab content.' },\n { path: 'behavior.closeable', category: 'behavior', valueKind: 'boolean', description: 'Show close button on tabs.' },\n { path: 'behavior.reorderable', category: 'behavior', valueKind: 'boolean', description: 'Allow reorder tabs/links.' },\n\n { path: 'accessibility', category: 'accessibility', valueKind: 'object', description: 'Accessibility settings.' },\n { path: 'accessibility.highContrast', category: 'accessibility', valueKind: 'boolean', description: 'High contrast mode.' },\n { path: 'accessibility.reduceMotion', category: 'accessibility', valueKind: 'boolean', description: 'Reduce motion.' },\n\n { path: 'group', category: 'group', valueKind: 'object', description: 'MatTabGroup settings.' },\n { path: 'group.alignTabs', category: 'group', valueKind: 'enum', allowedValues: ENUMS.alignTabs, description: 'Align tabs in header.' },\n { path: 'group.animationDuration', category: 'group', valueKind: 'string', description: 'Animation duration (e.g., 500ms).' },\n { path: 'group.ariaLabel', category: 'group', valueKind: 'string', description: 'aria-label for tab group.' },\n { path: 'group.ariaLabelledby', category: 'group', valueKind: 'string', description: 'aria-labelledby for tab group.' },\n { path: 'group.color', category: 'group', valueKind: 'enum', allowedValues: ENUMS.matColor, description: 'M2 color.' },\n { path: 'group.backgroundColor', category: 'group', valueKind: 'enum', allowedValues: ENUMS.matColor, description: 'M2 background color.' },\n { path: 'group.disablePagination', category: 'group', valueKind: 'boolean', description: 'Disable pagination of header.' },\n { path: 'group.disableRipple', category: 'group', valueKind: 'boolean', description: 'Disable ripple.' },\n { path: 'group.dynamicHeight', category: 'group', valueKind: 'boolean', description: 'Enable dynamic height.' },\n { path: 'group.fitInkBarToContent', category: 'group', valueKind: 'boolean', description: 'Fit ink bar to content.' },\n { path: 'group.headerPosition', category: 'group', valueKind: 'enum', allowedValues: ENUMS.headerPosition, description: 'Header position.' },\n { path: 'group.preserveContent', category: 'group', valueKind: 'boolean', description: 'Preserve content of inactive tabs.' },\n { path: 'group.selectedIndex', category: 'group', valueKind: 'number', description: 'Selected tab index.' },\n { path: 'group.stretchTabs', category: 'group', valueKind: 'boolean', description: 'Stretch tabs.' },\n\n { path: 'nav', category: 'nav', valueKind: 'object', description: 'Tab nav settings.' },\n { path: 'nav.animationDuration', category: 'nav', valueKind: 'string', description: 'Animation duration (e.g., 500ms).' },\n { path: 'nav.ariaLabel', category: 'nav', valueKind: 'string', description: 'aria-label for nav mode.' },\n { path: 'nav.ariaLabelledby', category: 'nav', valueKind: 'string', description: 'aria-labelledby for nav mode.' },\n { path: 'nav.color', category: 'nav', valueKind: 'enum', allowedValues: ENUMS.matColor, description: 'M2 color.' },\n { path: 'nav.backgroundColor', category: 'nav', valueKind: 'enum', allowedValues: ENUMS.matColor, description: 'M2 background color.' },\n { path: 'nav.disablePagination', category: 'nav', valueKind: 'boolean', description: 'Disable pagination of nav.' },\n { path: 'nav.disableRipple', category: 'nav', valueKind: 'boolean', description: 'Disable ripple.' },\n { path: 'nav.fitInkBarToContent', category: 'nav', valueKind: 'boolean', description: 'Fit ink bar to content.' },\n { path: 'nav.selectedIndex', category: 'nav', valueKind: 'number', description: 'Selected nav link index.' },\n { path: 'nav.stretchTabs', category: 'nav', valueKind: 'boolean', description: 'Stretch nav tabs.' },\n { path: 'nav.links', category: 'nav', valueKind: 'array', description: 'Nav links array.' },\n { path: 'nav.links[].id', category: 'nav', valueKind: 'string', description: 'Link id.' },\n { path: 'nav.links[].label', category: 'nav', valueKind: 'string', description: 'Link label.' },\n { path: 'nav.links[].active', category: 'nav', valueKind: 'boolean', description: 'Link active flag.' },\n { path: 'nav.links[].disabled', category: 'nav', valueKind: 'boolean', description: 'Disable link.' },\n { path: 'nav.links[].disableRipple', category: 'nav', valueKind: 'boolean', description: 'Disable ripple on link.' },\n { path: 'nav.links[].fitInkBarToContent', category: 'nav', valueKind: 'boolean', description: 'Fit ink bar to link content.' },\n { path: 'nav.links[].content', category: 'nav', valueKind: 'array', description: 'Dynamic field metadata list.' },\n { path: 'nav.links[].widgets', category: 'nav', valueKind: 'array', description: 'Widget definitions for link content.' },\n\n { path: 'tabs', category: 'tabs', valueKind: 'array', description: 'Tabs array.' },\n { path: 'tabs[].id', category: 'tabs', valueKind: 'string', description: 'Tab id.' },\n { path: 'tabs[].textLabel', category: 'tabs', valueKind: 'string', description: 'Tab label.' },\n { path: 'tabs[].labelClass', category: 'tabs', valueKind: 'string', description: 'Label class (string or string[]).' },\n { path: 'tabs[].bodyClass', category: 'tabs', valueKind: 'string', description: 'Body class (string or string[]).' },\n { path: 'tabs[].ariaLabel', category: 'tabs', valueKind: 'string', description: 'aria-label for tab.' },\n { path: 'tabs[].ariaLabelledby', category: 'tabs', valueKind: 'string', description: 'aria-labelledby for tab.' },\n { path: 'tabs[].disabled', category: 'tabs', valueKind: 'boolean', description: 'Disable tab.' },\n { path: 'tabs[].content', category: 'tabs', valueKind: 'array', description: 'Dynamic field metadata list.' },\n { path: 'tabs[].widgets', category: 'tabs', valueKind: 'array', description: 'Widget definitions for tab content.' },\n { path: 'tabs[].isActive', category: 'tabs', valueKind: 'boolean', description: 'Active flag (metadata only).' },\n { path: 'tabs[].origin', category: 'tabs', valueKind: 'number', description: 'Origin index (metadata only).' },\n { path: 'tabs[].position', category: 'tabs', valueKind: 'number', description: 'Position index (metadata only).' },\n\n { path: 'events', category: 'events', valueKind: 'object', description: 'Event config (placeholder).' },\n];\n\nexport const TABS_AI_CAPABILITIES: CapabilityCatalog = {\n version: 'v1.0',\n enums: ENUMS,\n targets: [\n 'praxis-tabs',\n 'tab-group',\n 'tab-item',\n 'praxis-tabs-config-editor',\n 'praxis-tabs-quick-setup',\n ],\n notes: [\n 'TabsMetadata drives both group and nav modes. Use nav.* when links are present.',\n 'appearance.customCss is injected into a <style> tag; avoid unsafe CSS from untrusted sources.',\n 'tabs[].content expects DynamicFieldMetadata[] and widgets[] expects WidgetDefinition[].',\n ],\n capabilities: CAPS,\n};\n","import { BaseAiAdapter, Capability, PatchResult } from '@praxisui/ai';\nimport { deepMerge } from '@praxisui/core';\nimport { TabsMetadata } from '../praxis-tabs';\nimport { TABS_AI_CAPABILITIES } from './tabs-ai-capabilities';\nimport { PraxisTabs } from '../praxis-tabs';\n\nexport class TabsAiAdapter extends BaseAiAdapter<TabsMetadata> {\n componentName = 'Praxis Tabs';\n\n constructor(private tabs: PraxisTabs) {\n super();\n }\n\n getCurrentConfig(): TabsMetadata {\n return this.cloneConfig(this.tabs.config || {});\n }\n\n getCapabilities(): Capability[] {\n return TABS_AI_CAPABILITIES.capabilities as unknown as Capability[];\n }\n\n override getRuntimeState(): Record<string, any> {\n const cfg = this.tabs.config;\n return {\n mode: cfg?.nav?.links?.length ? 'nav' : 'group',\n tabsCount: cfg?.tabs?.length ?? 0,\n linksCount: cfg?.nav?.links?.length ?? 0,\n lazyLoad: !!cfg?.behavior?.lazyLoad,\n selectedIndex: cfg?.group?.selectedIndex ?? 0,\n navIndex: cfg?.nav?.selectedIndex ?? 0,\n };\n }\n\n createSnapshot(): TabsMetadata {\n return this.cloneConfig(this.tabs.config || {});\n }\n\n async restoreSnapshot(snapshot: TabsMetadata): Promise<void> {\n if (!snapshot) return;\n this.applyConfig(snapshot);\n }\n\n async applyPatch(patch: Partial<TabsMetadata>): Promise<PatchResult> {\n try {\n const current = this.getCurrentConfig();\n const next = this.smartMergeTabsConfig(current, patch);\n this.applyConfig(next);\n return { success: true };\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error applying patch';\n return { success: false, error: message };\n }\n }\n\n private applyConfig(config: TabsMetadata): void {\n const apply = (this.tabs as any).applyConfigFromAdapter;\n if (typeof apply === 'function') {\n apply.call(this.tabs, config);\n return;\n }\n const prev = this.tabs.config;\n this.tabs.config = config;\n this.tabs.ngOnChanges({\n config: {\n previousValue: prev,\n currentValue: config,\n firstChange: false,\n isFirstChange: () => false,\n },\n } as any);\n }\n\n private smartMergeTabsConfig(base: TabsMetadata, patch: Partial<TabsMetadata>): TabsMetadata {\n const result = deepMerge(base, patch);\n\n if (patch.tabs && Array.isArray(patch.tabs)) {\n const merged = this.mergeByKey(\n base.tabs || [],\n patch.tabs,\n (t) => t.id || t.textLabel || '',\n );\n result.tabs = merged;\n }\n\n const patchLinks = patch.nav?.links;\n if (patchLinks && Array.isArray(patchLinks)) {\n const merged = this.mergeByKey(\n base.nav?.links || [],\n patchLinks,\n (l) => l.id || l.label || '',\n );\n result.nav = { ...(result.nav || {}), links: merged };\n }\n\n return result;\n }\n\n private mergeByKey<T extends Record<string, any>>(\n baseArr: T[],\n patchArr: T[],\n keyFn: (item: T) => string,\n ): T[] {\n const merged = baseArr.map((orig) => {\n const key = keyFn(orig);\n const match = key ? patchArr.find((p) => keyFn(p) === key) : undefined;\n return match ? deepMerge(orig as any, match as any) : orig;\n });\n\n patchArr.forEach((item) => {\n const key = keyFn(item);\n if (!key || !baseArr.find((o) => keyFn(o) === key)) {\n merged.push(item);\n }\n });\n\n return merged;\n }\n\n private cloneConfig(config: TabsMetadata): TabsMetadata {\n try {\n return structuredClone(config);\n } catch {\n return JSON.parse(JSON.stringify(config));\n }\n }\n}\n","import {\n Component,\n Input,\n Output,\n EventEmitter,\n ChangeDetectionStrategy,\n OnChanges,\n SimpleChanges,\n OnInit,\n OnDestroy,\n inject,\n signal,\n computed,\n} from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport { CommonModule } from '@angular/common';\nimport { MatTabsModule, MatTabChangeEvent } from '@angular/material/tabs';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { PraxisIconDirective, ComponentKeyService } from '@praxisui/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { DynamicFieldLoaderDirective } from '@praxisui/dynamic-fields';\nimport { SettingsPanelService } from '@praxisui/settings-panel';\nimport {\n ASYNC_CONFIG_STORAGE,\n AsyncConfigStorage,\n LoggerService,\n} from '@praxisui/core';\nimport { PraxisTabsConfigEditor } from './praxis-tabs-config-editor';\nimport { produce } from 'immer';\nimport { DragDropModule, CdkDragDrop } from '@angular/cdk/drag-drop';\nimport { EmptyStateCardComponent, DynamicWidgetLoaderDirective, WidgetDefinition } from '@praxisui/core';\nimport { TabsQuickSetupComponent } from './quick-setup/tabs-quick-setup.component';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { Subject } from 'rxjs';\nimport { take, takeUntil } from 'rxjs/operators';\nimport { PraxisAiAssistantComponent } from '@praxisui/ai';\nimport { TabsAiAdapter } from './ai/tabs-ai.adapter';\n\n// =====================\n// Metadata interfaces\n// =====================\nexport interface TabsMetadata {\n meta?: any;\n appearance?: TabsAppearanceConfig;\n behavior?: TabsBehaviorConfig;\n events?: TabsEventConfig;\n accessibility?: TabsAccessibilityConfig;\n group?: TabGroupMetadata;\n tabs?: TabMetadata[];\n nav?: TabNavMetadata;\n}\n\nexport interface TabsAppearanceConfig {\n density?: 'compact' | 'comfortable' | 'spacious';\n themeClass?: string;\n customCss?: string;\n /** Optional runtime tokens mapped to CSS for per-instance styling */\n tokens?: Partial<TabsStyleTokens>;\n}\n\nexport interface TabsBehaviorConfig {\n lazyLoad?: boolean;\n closeable?: boolean;\n reorderable?: boolean;\n}\n\nexport interface TabsEventConfig {\n // Placeholder for docs parity; events are component outputs\n}\n\nexport interface TabsAccessibilityConfig {\n /** @deprecated Declared-only. No direct runtime binding; prefer mode-specific aria fields instead. */\n ariaLabels?: { [key: string]: string };\n /** @deprecated Declared-only. Keyboard navigation follows Angular Material defaults; no dedicated runtime gate exists. */\n keyboardNavigation?: boolean;\n highContrast?: boolean;\n reduceMotion?: boolean;\n}\n\nexport interface TabGroupMetadata {\n alignTabs?: 'start' | 'center' | 'end';\n animationDuration?: string;\n ariaLabel?: string;\n ariaLabelledby?: string;\n color?: 'primary' | 'accent' | 'warn';\n /** @deprecated Declared-only. No template binding in the current runtime. */\n contentTabIndex?: number;\n disablePagination?: boolean;\n disableRipple?: boolean;\n dynamicHeight?: boolean;\n fitInkBarToContent?: boolean;\n headerPosition?: 'above' | 'below';\n preserveContent?: boolean;\n selectedIndex?: number;\n stretchTabs?: boolean;\n backgroundColor?: 'primary' | 'accent' | 'warn' | undefined;\n}\n\nexport interface TabMetadata {\n id?: string;\n ariaLabel?: string;\n ariaLabelledby?: string;\n textLabel?: string;\n labelClass?: string | string[];\n bodyClass?: string | string[];\n disabled?: boolean;\n content?: any[]; // DynamicFieldMetadata[]\n widgets?: WidgetDefinition[];\n isActive?: boolean;\n origin?: number;\n position?: number;\n}\n\nexport interface TabNavMetadata {\n animationDuration?: string;\n color?: 'primary' | 'accent' | 'warn';\n backgroundColor?: 'primary' | 'accent' | 'warn' | undefined;\n ariaLabel?: string;\n ariaLabelledby?: string;\n disablePagination?: boolean;\n disableRipple?: boolean;\n fitInkBarToContent?: boolean;\n selectedIndex?: number;\n stretchTabs?: boolean;\n links: TabLinkMetadata[];\n}\n\nexport interface TabLinkMetadata {\n id?: string;\n label: string;\n active?: boolean;\n disabled?: boolean;\n disableRipple?: boolean;\n fitInkBarToContent?: boolean;\n content?: any[]; // DynamicFieldMetadata[]\n widgets?: WidgetDefinition[];\n}\n\n// A minimal set of style tokens mapped to CSS at runtime.\nexport interface TabsStyleTokens {\n 'active-indicator-color': string;\n 'active-focus-indicator-color': string;\n 'active-hover-indicator-color': string;\n 'active-label-text-color': string;\n 'active-focus-label-text-color': string;\n 'active-hover-label-text-color': string;\n 'inactive-label-text-color': string;\n 'inactive-hover-label-text-color': string;\n 'inactive-focus-label-text-color': string;\n 'inactive-ripple-color': string;\n 'pagination-icon-color': string;\n 'divider-color': string;\n 'background-color': string;\n}\n\n@Component({\n selector: 'praxis-tabs',\n standalone: true,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n MatTabsModule,\n MatIconModule,\n MatTooltipModule,\n PraxisIconDirective,\n MatButtonModule,\n DragDropModule,\n EmptyStateCardComponent,\n DynamicFieldLoaderDirective,\n DynamicWidgetLoaderDirective,\n PraxisAiAssistantComponent,\n ],\n template: `\n <div\n class=\"praxis-tabs-root\"\n [class.density-compact]=\"config?.appearance?.density === 'compact'\"\n [class.density-comfortable]=\"config?.appearance?.density === 'comfortable'\"\n [class.density-spacious]=\"config?.appearance?.density === 'spacious'\"\n [class.high-contrast]=\"config?.accessibility?.highContrast\"\n [class.reduce-motion]=\"config?.accessibility?.reduceMotion\"\n [ngClass]=\"config?.appearance?.themeClass || ''\"\n [attr.data-tabs-id]=\"styleScopeId()\"\n >\n <!-- Inline custom CSS, if provided -->\n <style *ngIf=\"safeCustomCss() as css\" [innerHTML]=\"css\"></style>\n <!-- Runtime style derived from tokens -->\n <style *ngIf=\"styleCss() as s\" [innerHTML]=\"s\"></style>\n\n <div class=\"tabs-ai-assistant\" *ngIf=\"editModeEnabled\">\n <praxis-ai-assistant [adapter]=\"aiAdapter\"></praxis-ai-assistant>\n </div>\n\n <!-- Empty state (global) -->\n <ng-container *ngIf=\"isEmptyGlobal(); else notEmpty\">\n <praxis-empty-state-card\n icon=\"tab\"\n [title]=\"'Nenhuma aba configurada'\"\n [description]=\"'Crie rapidamente suas abas ou abra o editor completo.'\"\n [primaryAction]=\"{ label: 'Criar abas rapidamente', icon: 'add', action: openQuickSetup.bind(this) }\"\n [secondaryActions]=\"[\n { label: 'Adicionar aba vazia', icon: 'tab', action: addEmptyTab.bind(this) },\n { label: 'Abrir editor completo', icon: 'tune', action: openEditor.bind(this) }\n ]\"\n ></praxis-empty-state-card>\n </ng-container>\n\n <ng-template #notEmpty>\n <!-- Tab Nav variant -->\n <ng-container *ngIf=\"isNavMode(); else groupMode\">\n <nav\n mat-tab-nav-bar\n [tabPanel]=\"tabPanel\"\n cdkDropList\n cdkDropListOrientation=\"horizontal\"\n [cdkDropListDisabled]=\"!config?.behavior?.reorderable\"\n (cdkDropListDropped)=\"onNavDrop($event)\"\n [disablePagination]=\"config?.nav?.disablePagination\"\n [fitInkBarToContent]=\"config?.nav?.fitInkBarToContent\"\n [mat-stretch-tabs]=\"config?.nav?.stretchTabs\"\n [color]=\"config?.nav?.color\"\n [backgroundColor]=\"config?.nav?.backgroundColor\"\n [selectedIndex]=\"currentNavIndex()\"\n [attr.aria-label]=\"config?.nav?.ariaLabel || config?.group?.ariaLabel || null\"\n [attr.aria-labelledby]=\"config?.nav?.ariaLabelledby || config?.group?.ariaLabelledby || null\"\n [animationDuration]=\"effectiveAnimationDuration()\"\n (indexFocused)=\"indexFocused.emit($event)\"\n (selectFocusedIndex)=\"selectFocusedIndex.emit($event)\"\n >\n <a\n mat-tab-link\n *ngFor=\"let link of config?.nav?.links; let i = index\"\n cdkDrag\n [cdkDragDisabled]=\"!config?.behavior?.reorderable\"\n cdkDragLockAxis=\"x\"\n [active]=\"getNavActive(i)\"\n [disabled]=\"link.disabled\"\n [disableRipple]=\"config?.nav?.disableRipple || link.disableRipple\"\n [fitInkBarToContent]=\"link.fitInkBarToContent || false\"\n [id]=\"link.id || ''\"\n (click)=\"onNavClick(i)\"\n >\n <span *ngIf=\"config?.behavior?.reorderable\" class=\"drag-handle\" cdkDragHandle>\n <mat-icon fontIcon=\"drag_indicator\"></mat-icon>\n </span>\n {{ link.label }}\n </a>\n </nav>\n\n <mat-tab-nav-panel #tabPanel>\n <div class=\"praxis-tabnav-content\" *ngIf=\"currentNavIndex() >= 0\">\n <ng-container\n *ngIf=\"config?.nav?.links?.[currentNavIndex()] as l\"\n >\n <ng-container *ngIf=\"(l.content?.length || l.widgets?.length) && navContentReady(currentNavIndex()); else emptyNav\">\n <ng-container *ngIf=\"l.content && form\">\n <ng-container\n dynamicFieldLoader\n [fields]=\"l.content || []\"\n [formGroup]=\"form!\"\n ></ng-container>\n </ng-container>\n <ng-container *ngIf=\"l.widgets?.length\">\n <ng-container *ngFor=\"let w of l.widgets; let wi = index\">\n <ng-container\n [dynamicWidgetLoader]=\"w\"\n [context]=\"context || {}\"\n (widgetEvent)=\"emitWidgetEvent({ linkId: l.id, linkIndex: currentNavIndex() }, $event)\"\n ></ng-container>\n </ng-container>\n </ng-container>\n </ng-container>\n <ng-template #emptyNav>\n <praxis-empty-state-card\n [inline]=\"true\"\n icon=\"add_to_queue\"\n [title]=\"'Sem conteúdo neste link'\"\n [description]=\"'Adicione conteúdo ou use o editor para configurar.'\"\n [primaryAction]=\"{ label: 'Abrir editor', icon: 'tune', action: openEditor.bind(this) }\"\n ></praxis-empty-state-card>\n </ng-template>\n </ng-container>\n </div>\n </mat-tab-nav-panel>\n </ng-container>\n\n <!-- Tab Group variant -->\n <ng-template #groupMode>\n <mat-tab-group\n [dynamicHeight]=\"config?.group?.dynamicHeight\"\n [disableRipple]=\"config?.group?.disableRipple\"\n [disablePagination]=\"config?.group?.disablePagination\"\n [fitInkBarToContent]=\"config?.group?.fitInkBarToContent\"\n [headerPosition]=\"config?.group?.headerPosition ?? 'above'\"\n [preserveContent]=\"config?.group?.preserveContent\"\n [selectedIndex]=\"selectedIndexSignal()\"\n [mat-stretch-tabs]=\"config?.group?.stretchTabs\"\n [mat-align-tabs]=\"config?.group?.alignTabs || 'start'\"\n [color]=\"config?.group?.color\"\n [backgroundColor]=\"config?.group?.backgroundColor\"\n [animationDuration]=\"effectiveAnimationDuration()\"\n [attr.aria-label]=\"config?.group?.ariaLabel || null\"\n [attr.aria-labelledby]=\"config?.group?.ariaLabelledby || null\"\n (animationDone)=\"animationDone.emit()\"\n (focusChange)=\"focusChange.emit($event)\"\n (selectedIndexChange)=\"onSelectedIndexChange($event)\"\n (selectedTabChange)=\"selectedTabChange.emit($event)\"\n class=\"praxis-tabs-group\"\n >\n <mat-tab\n *ngFor=\"let t of config?.tabs; let i = index\"\n [disabled]=\"t.disabled\"\n [labelClass]=\"t.labelClass ?? ''\"\n [bodyClass]=\"t.bodyClass ?? ''\"\n [id]=\"t.id || ''\"\n [attr.aria-label]=\"t.ariaLabel || null\"\n [attr.aria-labelledby]=\"t.ariaLabelledby || null\"\n >\n <ng-template mat-tab-label>\n <span>{{ t.textLabel }}</span>\n <button\n *ngIf=\"config?.behavior?.closeable\"\n mat-icon-button\n type=\"button\"\n (click)=\"closeTab(i); $event.stopPropagation()\"\n (keydown.enter)=\"$event.stopPropagation()\"\n (keydown.space)=\"$event.stopPropagation()\"\n aria-label=\"Fechar aba\"\n >\n <mat-icon fontIcon=\"close\"></mat-icon>\n </button>\n <ng-container *ngIf=\"config?.behavior?.reorderable\">\n <button\n mat-icon-button\n type=\"button\"\n (click)=\"moveTab(i, -1); $event.stopPropagation()\"\n (keydown.enter)=\"$event.stopPropagation()\"\n (keydown.space)=\"$event.stopPropagation()\"\n [disabled]=\"i===0\"\n aria-label=\"Mover aba para esquerda\"\n >\n <mat-icon fontIcon=\"arrow_back\"></mat-icon>\n </button>\n <button\n mat-icon-button\n type=\"button\"\n (click)=\"moveTab(i, 1); $event.stopPropagation()\"\n (keydown.enter)=\"$event.stopPropagation()\"\n (keydown.space)=\"$event.stopPropagation()\"\n [disabled]=\"i===(config?.tabs?.length||1)-1\"\n aria-label=\"Mover aba para direita\"\n >\n <mat-icon fontIcon=\"arrow_forward\"></mat-icon>\n </button>\n </ng-container>\n </ng-template>\n\n <ng-template matTabContent>\n <ng-container *ngIf=\"(t.content?.length || t.widgets?.length) && groupContentReady(i); else emptyTab\">\n <ng-container *ngIf=\"t.content && form\">\n <ng-container\n dynamicFieldLoader\n [fields]=\"t.content || []\"\n [formGroup]=\"form!\"\n ></ng-container>\n </ng-container>\n <ng-container *ngIf=\"t.widgets?.length\">\n <ng-container *ngFor=\"let w of t.widgets; let wi = index\">\n <ng-container\n [dynamicWidgetLoader]=\"w\"\n [context]=\"context || {}\"\n (widgetEvent)=\"emitWidgetEvent({ tabId: t.id, tabIndex: i }, $event)\"\n ></ng-container>\n </ng-container>\n </ng-container>\n </ng-container>\n <ng-template #emptyTab>\n <praxis-empty-state-card\n [inline]=\"true\"\n icon=\"dashboard_customize\"\n [title]=\"'Sem conteúdo nesta aba'\"\n [description]=\"'Adicione conteúdo ou use o editor para configurar.'\"\n [primaryAction]=\"{ label: 'Abrir editor', icon: 'tune', action: openEditor.bind(this) }\"\n ></praxis-empty-state-card>\n </ng-template>\n </ng-template>\n </mat-tab>\n </mat-tab-group>\n </ng-template>\n </ng-template>\n\n <!-- Edit button -->\n <button\n *ngIf=\"editModeEnabled\"\n mat-fab\n class=\"edit-fab\"\n aria-label=\"Editar tabs\"\n (click)=\"openEditor()\"\n >\n <mat-icon fontIcon=\"edit\"></mat-icon>\n </button>\n <button\n *ngIf=\"editModeEnabled && tabsId\"\n mat-mini-fab\n class=\"edit-fab edit-fab-secondary\"\n aria-label=\"Redefinir preferências de tabs\"\n (click)=\"resetPreferences()\"\n matTooltip=\"Redefinir preferências de tabs\"\n >\n <mat-icon [praxisIcon]=\"'restart_alt'\"></mat-icon>\n </button>\n </div>\n `,\n styles: [\n `\n .praxis-tabs-root { position: relative; display: block; }\n .praxis-tabs-group.align-start .mat-mdc-tab-header { justify-content: flex-start; }\n .praxis-tabs-group.align-center .mat-mdc-tab-header { justify-content: center; }\n .praxis-tabs-group.align-end .mat-mdc-tab-header { justify-content: flex-end; }\n .density-compact .mat-mdc-tab-body-content { padding: 8px; }\n .density-comfortable .mat-mdc-tab-body-content { padding: 16px; }\n .density-spacious .mat-mdc-tab-body-content { padding: 24px; }\n .tabs-ai-assistant { position: absolute; right: 12px; bottom: 72px; z-index: 3; }\n .edit-fab { position: absolute; right: 12px; bottom: 12px; z-index: 2; }\n .edit-fab-secondary { right: 56px; }\n .tab-empty { padding: 16px; color: var(--md-sys-color-on-surface-variant); font-style: italic; }\n .high-contrast { filter: contrast(1.2); }\n .reduce-motion { --mat-animation-duration: 0ms; }\n .drag-handle { display: inline-flex; align-items: center; vertical-align: middle; margin-right: 4px; cursor: grab; }\n\n /* Gridster integration: make tabs fill the tile height */\n :host-context(.pdx-gridster-item) .praxis-tabs-root {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0; /* allow children to shrink */\n }\n :host-context(.pdx-gridster-item) .praxis-tabs-group,\n :host-context(.pdx-gridster-item) .mat-mdc-tab-group {\n flex: 1 1 auto;\n min-height: 0;\n }\n :host-context(.pdx-gridster-item) .mat-mdc-tab-body-wrapper,\n :host-context(.pdx-gridster-item) .mat-mdc-tab-body-content {\n height: 100%;\n min-height: 0;\n }\n :host-context(.pdx-gridster-item) .mat-mdc-tab-body-content {\n overflow: auto;\n }\n /* Nav variant content should expand and scroll inside tile */\n :host-context(.pdx-gridster-item) .praxis-tabnav-content {\n flex: 1 1 auto;\n min-height: 0;\n overflow: auto;\n }\n `,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class PraxisTabs implements OnInit, OnChanges, OnDestroy {\n private readonly settings = inject(SettingsPanelService);\n private readonly storage = inject<AsyncConfigStorage>(ASYNC_CONFIG_STORAGE);\n private readonly snack = inject(MatSnackBar);\n private readonly componentKeys = inject(ComponentKeyService);\n private readonly logger = inject(LoggerService);\n private readonly route = (() => { try { return inject(ActivatedRoute); } catch { return undefined as ActivatedRoute | undefined; } })();\n private warnedMissingId = false;\n\n @Input() config: TabsMetadata | null = null;\n @Input({ required: true }) tabsId!: string;\n @Input() componentInstanceId?: string;\n @Input() editModeEnabled = false;\n @Input() form: FormGroup | null = null;\n @Input() context: Record<string, any> | null = null;\n\n @Output() animationDone = new EventEmitter<void>();\n @Output() focusChange = new EventEmitter<MatTabChangeEvent>();\n @Output() selectedIndexChange = new EventEmitter<number>();\n @Output() selectedTabChange = new EventEmitter<MatTabChangeEvent>();\n @Output() indexFocused = new EventEmitter<number>();\n @Output() selectFocusedIndex = new EventEmitter<number>();\n @Output() widgetEvent = new EventEmitter<{\n tabId?: string;\n tabIndex?: number;\n linkId?: string;\n linkIndex?: number;\n sourceId: string;\n output?: string;\n payload?: any;\n }>();\n\n public aiAdapter = new TabsAiAdapter(this);\n\n // Signals to manage local state for selection in Nav mode and Group mode\n protected currentNavIndex = signal<number>(0);\n protected selectedIndexSignal = signal<number>(0);\n private groupLoaded = new Set<number>();\n private navLoaded = new Set<number>();\n private readonly destroy$ = new Subject<void>();\n\n ngOnInit(): void {\n this.syncSelectionFromConfig();\n // Load stored config if tabsId provided\n const key = this.storageKey();\n if (key) {\n this.storage.loadConfig<TabsMetadata>(key).pipe(take(1)).subscribe((stored) => {\n if (stored) {\n this.config = stored;\n }\n this.syncSelectionFromConfig();\n });\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['config'] && this.config) {\n // Reset loaded caches on config change and seed with current selections\n this.syncSelectionFromConfig();\n\n // Persist when tabsId provided\n this.persistConfig(this.config);\n }\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n isNavMode(): boolean {\n return !!this.config?.nav && !!this.config?.nav?.links?.length;\n }\n\n effectiveAnimationDuration(): string {\n const reduce = this.config?.accessibility?.reduceMotion;\n if (reduce) return '0ms';\n return (\n this.config?.group?.animationDuration || this.config?.nav?.animationDuration || '500ms'\n );\n }\n\n getNavActive(i: number): boolean {\n return this.currentNavIndex() === i;\n }\n\n onNavClick(i: number): void {\n if (!this.config?.nav?.links?.length) return;\n const linksCount = this.config.nav.links.length;\n if (i < 0 || i >= linksCount) return;\n this.currentNavIndex.set(i);\n this.config = produce(this.config, (draft) => {\n if (!draft.nav) return;\n draft.nav.selectedIndex = i;\n });\n this.persistConfig(this.config);\n // Lazy: mark as loaded\n this.navLoaded.add(i);\n // Emit as index change for consumers to track\n this.selectedIndexChange.emit(i);\n }\n\n onNavDrop(event: CdkDragDrop<any>): void {\n if (!this.config?.nav?.links) return;\n const prev = event.previousIndex;\n const curr = event.currentIndex;\n const linksLength = this.config.nav.links.length;\n if (prev < 0 || curr < 0 || prev >= linksLength || curr >= linksLength) return;\n if (prev === curr) return;\n const selectedId = this.config.nav.links[this.currentNavIndex()]?.id;\n this.config = produce(this.config, (draft) => {\n const arr = draft.nav!.links as any[];\n const [moved] = arr.splice(prev, 1);\n arr.splice(curr, 0, moved);\n });\n // Update selected index based on id\n if (selectedId) {\n const idx = this.config.nav!.links.findIndex((l) => l.id === selectedId);\n if (idx >= 0) this.currentNavIndex.set(idx);\n } else {\n // If no id, preserve selected index around move.\n const selected = this.currentNavIndex();\n if (selected === prev) {\n this.currentNavIndex.set(curr);\n } else if (prev < selected && curr >= selected) {\n this.currentNavIndex.set(selected - 1);\n } else if (prev > selected && curr <= selected) {\n this.currentNavIndex.set(selected + 1);\n }\n }\n // Reset lazy cache for nav except current\n const currIdx = this.currentNavIndex();\n this.navLoaded.clear();\n this.navLoaded.add(currIdx);\n this.config = produce(this.config, (draft) => {\n if (!draft.nav) return;\n draft.nav.selectedIndex = currIdx;\n });\n this.persistConfig(this.config);\n }\n\n onSelectedIndexChange(index: number): void {\n const selected = this.clampIndex(index, this.config?.tabs?.length ?? 0);\n this.selectedIndexSignal.set(selected);\n // Update config immutably\n if (this.config) {\n this.config = produce(this.config, (draft) => {\n if (!draft.group) {\n (draft as any).group = { selectedIndex: selected } as TabGroupMetadata;\n } else {\n draft.group.selectedIndex = selected;\n }\n });\n this.persistConfig(this.config);\n }\n // Lazy: mark as loaded\n this.groupLoaded.add(selected);\n this.selectedIndexChange.emit(selected);\n }\n\n closeTab(index: number): void {\n if (!this.config?.tabs) return;\n if (index < 0 || index >= this.config.tabs.length) return;\n const currentSelected = this.selectedIndexSignal();\n this.config = produce(this.config, (draft) => {\n draft.tabs!.splice(index, 1);\n const tabsLength = draft.tabs!.length;\n if (!draft.group) {\n (draft as any).group = {} as TabGroupMetadata;\n }\n if (tabsLength <= 0) {\n draft.group!.selectedIndex = 0;\n return;\n }\n const adjusted = currentSelected > index ? currentSelected - 1 : currentSelected;\n draft.group!.selectedIndex = this.clampIndex(adjusted, tabsLength);\n });\n const nextSelected = this.clampIndex(\n this.config?.group?.selectedIndex,\n this.config?.tabs?.length ?? 0,\n );\n this.selectedIndexSignal.set(nextSelected);\n this.groupLoaded.clear();\n if ((this.config?.tabs?.length ?? 0) > 0) {\n this.groupLoaded.add(nextSelected);\n }\n this.persistConfig(this.config);\n }\n\n moveTab(index: number, delta: number): void {\n if (!this.config?.tabs) return;\n const to = index + delta;\n if (to < 0 || to >= this.config.tabs.length) return;\n const wasSelected = this.selectedIndexSignal() === index;\n this.config = produce(this.config, (draft) => {\n const arr = draft.tabs! as any[];\n const [m] = arr.splice(index, 1);\n arr.splice(to, 0, m);\n if (!draft.group) (draft as any).group = { selectedIndex: to } as TabGroupMetadata;\n else if (wasSelected) draft.group.selectedIndex = to;\n else if (draft.group.selectedIndex != null) {\n // Adjust selection if it lies between moved indices\n const sel = draft.group.selectedIndex as number;\n if (index < sel && to >= sel) draft.group.selectedIndex = sel - 1;\n else if (index > sel && to <= sel) draft.group.selectedIndex = sel + 1;\n }\n });\n this.selectedIndexSignal.set(this.config.group?.selectedIndex ?? this.selectedIndexSignal());\n // Reset lazy cache for group except current\n const sel = this.selectedIndexSignal() ?? 0;\n this.groupLoaded.clear();\n this.groupLoaded.add(sel);\n this.persistConfig(this.config);\n }\n\n openEditor(): void {\n const key = this.storageKey() || this.tabsId || 'default';\n const ref = this.settings.open({\n id: `praxis-tabs-editor:${key}`,\n title: 'Configurar Tabs',\n content: {\n component: PraxisTabsConfigEditor,\n inputs: { config: this.config, tabsId: this.tabsId },\n },\n });\n\n // Essential preview: apply updates without closing\n ref.applied$.pipe(takeUntil(this.destroy$)).subscribe((value: any) => {\n const nextCfg: TabsMetadata = value?.config || value;\n if (nextCfg) {\n this.config = produce(this.config || {}, () => nextCfg);\n this.persistConfig(this.config);\n this.syncSelectionFromConfig();\n }\n });\n\n ref.saved$.pipe(takeUntil(this.destroy$)).subscribe((value: any) => {\n const nextCfg: TabsMetadata = value?.config || value;\n if (nextCfg) {\n this.config = produce(this.config || {}, () => nextCfg);\n this.persistConfig(this.config);\n this.syncSelectionFromConfig();\n }\n });\n }\n\n addEmptyTab(): void {\n const next = produce(this.config || {}, (draft: any) => {\n if (!draft.group) draft.group = { selectedIndex: 0 };\n if (!draft.tabs) draft.tabs = [];\n draft.tabs.push({ id: `tab${(draft.tabs.length || 0) + 1}`, textLabel: 'Nova aba' });\n draft.group.selectedIndex = (draft.tabs.length || 1) - 1;\n }) as TabsMetadata;\n this.config = next;\n this.persistConfig(this.config);\n this.selectedIndexSignal.set(this.config?.group?.selectedIndex ?? 0);\n }\n\n /** Clears persisted tabs configuration to fallback to defaults */\n resetPreferences(): void {\n const key = this.storageKey();\n if (!key) return;\n try {\n this.storage.clearConfig(key).pipe(take(1)).subscribe({ error: () => {} });\n } catch {}\n try { this.snack.open('Preferências de Tabs redefinidas', undefined, { duration: 2000 }); } catch {}\n // keep current in-memory config; caller may choose to reload\n }\n\n openQuickSetup(): void {\n const key = this.storageKey() || this.tabsId || 'default';\n const ref = this.settings.open({\n id: `praxis-tabs-quick-setup:${key}`,\n title: 'Criar abas rapidamente',\n content: {\n component: TabsQuickSetupComponent,\n inputs: { config: this.config },\n },\n });\n const apply = (value: any) => {\n const nextCfg: TabsMetadata = value?.config || value;\n if (nextCfg) {\n this.config = produce(this.config || {}, () => nextCfg);\n this.persistConfig(this.config);\n this.syncSelectionFromConfig();\n }\n };\n ref.applied$.pipe(takeUntil(this.destroy$)).subscribe(apply);\n ref.saved$.pipe(takeUntil(this.destroy$)).subscribe(apply);\n }\n\n private storageKey(): string | null {\n const id = this.componentKeyId();\n return id ? `tabs:${id}` : null;\n }\n\n private syncSelectionFromConfig(): void {\n this.groupLoaded.clear();\n this.navLoaded.clear();\n const tabsLength = this.config?.tabs?.length ?? 0;\n const linksLength = this.config?.nav?.links?.length ?? 0;\n const groupIndex = this.clampIndex(this.config?.group?.selectedIndex, tabsLength);\n const navIndex = this.clampIndex(this.config?.nav?.selectedIndex, linksLength);\n this.selectedIndexSignal.set(groupIndex);\n this.currentNavIndex.set(navIndex);\n if (tabsLength > 0) this.groupLoaded.add(groupIndex);\n if (linksLength > 0) this.navLoaded.add(navIndex);\n }\n\n private persistConfig(config?: TabsMetadata | null): void {\n const key = this.storageKey();\n if (!key || !config) return;\n this.storage.saveConfig(key, config).pipe(take(1)).subscribe({ error: () => {} });\n }\n\n private componentKeyId(): string | null {\n const key = this.componentKeys.buildComponentId({\n componentType: 'praxis-tabs',\n componentId: this.tabsId,\n instanceKey: this.componentInstanceId,\n componentRef: this,\n route: this.route,\n requireComponentId: true,\n });\n if (!key) this.warnMissingId();\n return key;\n }\n\n private warnMissingId(): void {\n if (this.warnedMissingId) return;\n this.warnedMissingId = true;\n this.logger.warnOnce(\n '[PraxisTabs] tabsId is required for config persistence.',\n {\n context: {\n lib: 'praxis-tabs',\n component: 'PraxisTabs',\n },\n data: {\n tabsId: this.tabsId,\n componentInstanceId: this.componentInstanceId,\n },\n dedupeKey: 'praxis-tabs:missing-tabs-id',\n },\n );\n }\n\n private clampIndex(index: number | undefined, size: number): number {\n if (size <= 0) return 0;\n const numeric = Number(index);\n const safe = Number.isFinite(numeric) ? Math.trunc(numeric) : 0;\n return Math.min(Math.max(safe, 0), size - 1);\n }\n\n public applyConfigFromAdapter(next: TabsMetadata): void {\n this.config = next;\n this.syncSelectionFromConfig();\n this.persistConfig(this.config);\n }\n\n // =====================\n // Lazy load helpers\n // =====================\n private isLazy(): boolean {\n return !!this.config?.behavior?.lazyLoad;\n }\n\n protected groupContentReady(index: number): boolean {\n return !this.isLazy() || this.groupLoaded.has(index) || this.selectedIndexSignal() === index;\n }\n\n protected navContentReady(index: number): boolean {\n return !this.isLazy() || this.navLoaded.has(index) || this.currentNavIndex() === index;\n }\n\n protected isEmptyGlobal(): boolean {\n const hasTabs = !!(this.config?.tabs && this.config.tabs.length > 0);\n const hasLinks = !!(this.config?.nav?.links && this.config.nav!.links.length > 0);\n return !(hasTabs || hasLinks);\n }\n\n protected emitWidgetEvent(\n loc: { tabId?: string; tabIndex?: number; linkId?: string; linkIndex?: number },\n ev: { sourceId: string; output?: string; payload?: any },\n ): void {\n this.widgetEvent.emit({ ...loc, ...ev });\n }\n\n protected styleScopeId(): string {\n const scopeSeed = [this.tabsId, this.componentInstanceId]\n .filter((v): v is string => typeof v === 'string' && !!v.trim())\n .join('--');\n const raw = String(scopeSeed || 'default').trim();\n const sanitized = raw\n .replace(/[^a-zA-Z0-9_-]+/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-|-$/g, '');\n return sanitized || 'default';\n }\n\n protected safeCustomCss(): string | null {\n const css = this.config?.appearance?.customCss;\n if (!css) return null;\n const value = String(css).trim();\n if (!value) return null;\n const forbidden = [\n /@import/i,\n /expression\\s*\\(/i,\n /behavior\\s*:/i,\n /<\\/style/i,\n /<script/i,\n /url\\s*\\(\\s*(['\"]?)\\s*(javascript:|data:text\\/html)/i,\n ];\n if (forbidden.some((pattern) => pattern.test(value))) {\n return null;\n }\n return value;\n }\n\n private sanitizeCssValue(value: unknown): string | null {\n if (typeof value !== 'string') return null;\n const trimmed = value.trim();\n if (!trimmed) return null;\n const forbidden = [\n /@import/i,\n /expression\\s*\\(/i,\n /behavior\\s*:/i,\n /url\\s*\\(\\s*(['\"]?)\\s*(javascript:|data:text\\/html)/i,\n ];\n if (forbidden.some((pattern) => pattern.test(trimmed))) {\n return null;\n }\n const sanitized = trimmed.replace(/[{};<>]/g, '').trim();\n return sanitized || null;\n }\n\n protected styleCss(): string | null {\n const t = this.config?.appearance?.tokens;\n if (!t) return null;\n const scope = `.praxis-tabs-root[data-tabs-id=\"${this.styleScopeId()}\"]`;\n const rules: string[] = [];\n const push = (selector: string, decls: string[]) => {\n rules.push(`${scope} ${selector}{${decls.join('')}}`);\n };\n\n // Active indicator underline\n const activeIndicatorColor = this.sanitizeCssValue(t['active-indicator-color']);\n if (activeIndicatorColor) {\n push(\n ' .mat-mdc-tab .mdc-tab-indicator__content--underline',\n [`background-color:${activeIndicatorColor}!important;`],\n );\n }\n // Active label\n const activeLabelColor = this.sanitizeCssValue(t['active-label-text-color']);\n if (activeLabelColor) {\n push(' .mdc-tab--active .mdc-tab__text-label', [\n `color:${activeLabelColor}!important;`,\n ]);\n }\n const activeHoverLabelColor = this.sanitizeCssValue(t['active-hover-label-text-color']);\n if (activeHoverLabelColor) {\n push(' .mdc-tab--active:hover .mdc-tab__text-label', [\n `color:${activeHoverLabelColor}!important;`,\n ]);\n }\n const activeFocusLabelColor = this.sanitizeCssValue(t['active-focus-label-text-color']);\n if (activeFocusLabelColor) {\n push(' .mdc-tab--active:focus .mdc-tab__text-label', [\n `color:${activeFocusLabelColor}!important;`,\n ]);\n }\n const activeFocusIndicatorColor = this.sanitizeCssValue(t['active-focus-indicator-color']);\n if (activeFocusIndicatorColor) {\n push(' .mdc-tab--active:focus .mdc-tab-indicator__content--underline', [\n `background-color:${activeFocusIndicatorColor}!important;`,\n ]);\n }\n const activeHoverIndicatorColor = this.sanitizeCssValue(t['active-hover-indicator-color']);\n if (activeHoverIndicatorColor) {\n push(' .mdc-tab--active:hover .mdc-tab-indicator__content--underline', [\n `background-color:${activeHoverIndicatorColor}!important;`,\n ]);\n }\n // Inactive label\n const inactiveLabelColor = this.sanitizeCssValue(t['inactive-label-text-color']);\n if (inactiveLabelColor) {\n push(' .mdc-tab:not(.mdc-tab--active) .mdc-tab__text-label', [\n `color:${inactiveLabelColor}!important;`,\n ]);\n }\n const inactiveHoverLabelColor = this.sanitizeCssValue(t['inactive-hover-label-text-color']);\n if (inactiveHoverLabelColor) {\n push(' .mdc-tab:not(.mdc-tab--active):hover .mdc-tab__text-label', [\n `color:${inactiveHoverLabelColor}!important;`,\n ]);\n }\n const inactiveFocusLabelColor = this.sanitizeCssValue(t['inactive-focus-label-text-color']);\n if (inactiveFocusLabelColor) {\n push(' .mdc-tab:not(.mdc-tab--active):focus .mdc-tab__text-label', [\n `color:${inactiveFocusLabelColor}!important;`,\n ]);\n }\n // Pagination chevrons\n const paginationIconColor = this.sanitizeCssValue(t['pagination-icon-color']);\n if (paginationIconColor) {\n push(' .mat-mdc-tab-header-pagination-chevron', [\n `color:${paginationIconColor}!important;`,\n ]);\n }\n // Divider / background\n const containerDecls: string[] = [];\n const dividerColor = this.sanitizeCssValue(t['divider-color']);\n if (dividerColor) {\n containerDecls.push(`border-bottom-color:${dividerColor}!important;`);\n }\n if (containerDecls.length) {\n push(' .mat-mdc-tab-header', containerDecls);\n push(' .mat-mdc-tab-nav-bar', containerDecls);\n }\n const backgroundColor = this.sanitizeCssValue(t['background-color']);\n if (backgroundColor) {\n push(' .mat-mdc-tab-header', [`background:${backgroundColor}!important;`]);\n push(' .mat-mdc-tab-nav-bar', [`background:${backgroundColor}!important;`]);\n }\n\n return rules.length ? rules.join('\\n') : null;\n }\n}\n","import { ComponentDocMeta, ComponentMetadataRegistry } from '@praxisui/core';\nimport { ENVIRONMENT_INITIALIZER, Provider } from '@angular/core';\nimport { PraxisTabs } from './praxis-tabs';\n\nexport const PRAXIS_TABS_COMPONENT_METADATA: ComponentDocMeta = {\n id: 'praxis-tabs',\n selector: 'praxis-tabs',\n component: PraxisTabs,\n friendlyName: 'Praxis Tabs',\n description:\n 'Abas dinâmicas baseadas em metadata, com MatTabGroup/TabNav e suporte a tokens M3 via appearance.',\n icon: 'tab',\n inputs: [\n { name: 'config', type: 'TabsMetadata', label: 'Configuração', description: 'Configuração JSON (tabs/nav, aparência e widgets internos)' },\n {\n name: 'tabsId',\n type: 'string',\n label: 'ID das Tabs',\n description: 'Identificador para persistência (obrigatório)',\n },\n {\n name: 'componentInstanceId',\n type: 'string',\n label: 'ID da instância',\n description: 'Identificador opcional para múltiplas instâncias na mesma rota',\n },\n {\n name: 'editModeEnabled',\n type: 'boolean',\n default: false,\n label: 'Modo de edição',\n description: 'Habilita editor via Settings Panel',\n },\n {\n name: 'form',\n type: 'FormGroup',\n label: 'FormGroup',\n description: 'FormGroup para conteúdo com campos dinâmicos',\n },\n {\n name: 'context',\n type: 'Record<string, any>',\n label: 'Contexto',\n description: 'Contexto entregue aos widgets internos',\n },\n ],\n outputs: [\n { name: 'selectedIndexChange', type: 'number', label: 'Índice selecionado' },\n { name: 'selectedTabChange', type: 'MatTabChangeEvent', label: 'Troca de aba' },\n { name: 'animationDone', type: 'void' },\n { name: 'focusChange', type: 'MatTabChangeEvent', label: 'Foco alterado' },\n { name: 'indexFocused', type: 'number', label: 'Índice focado' },\n { name: 'selectFocusedIndex', type: 'number', label: 'Selecionar foco' },\n {\n name: 'widgetEvent',\n type: \"{ tabId?: string; tabIndex?: number; linkId?: string; linkIndex?: number; sourceId: string; output?: string; payload?: any }\",\n label: 'Evento interno',\n description: 'Eventos reemitidos de componentes dinâmicos dentro da aba/link',\n },\n ],\n actions: [\n {\n id: 'select-tab',\n label: 'Selecionar aba',\n icon: 'tab',\n description: 'Emite alteração do índice selecionado',\n emit: 'selectedIndexChange',\n payloadSchema: {\n type: 'number',\n example: 0,\n },\n scope: 'any',\n },\n {\n id: 'tab-change',\n label: 'Troca de aba',\n icon: 'swap_horiz',\n description: 'Emite evento de troca de aba',\n emit: 'selectedTabChange',\n payloadSchema: {\n type: 'object',\n properties: {\n index: { type: 'number', description: 'Índice selecionado' },\n tab: { type: 'object', description: 'Referência da aba' },\n },\n required: ['index'],\n example: { index: 1 },\n },\n scope: 'any',\n },\n {\n id: 'focus-change',\n label: 'Foco alterado',\n icon: 'center_focus_strong',\n description: 'Emite evento quando o foco muda',\n emit: 'focusChange',\n payloadSchema: {\n type: 'object',\n properties: {\n index: { type: 'number', description: 'Índice focado' },\n tab: { type: 'object', description: 'Referência da aba' },\n },\n required: ['index'],\n example: { index: 1 },\n },\n scope: 'any',\n },\n {\n id: 'focus-index',\n label: 'Índice focado',\n icon: 'filter_center_focus',\n description: 'Emite o índice focado',\n emit: 'indexFocused',\n payloadSchema: {\n type: 'number',\n example: 0,\n },\n scope: 'any',\n },\n {\n id: 'select-focus',\n label: 'Selecionar foco',\n icon: 'gps_fixed',\n description: 'Emite seleção do índice focado',\n emit: 'selectFocusedIndex',\n payloadSchema: {\n type: 'number',\n example: 0,\n },\n scope: 'any',\n },\n ],\n tags: ['widget', 'tabs', 'configurable', 'stable'],\n lib: '@praxisui/tabs',\n};\n\nexport function providePraxisTabsMetadata(): Provider {\n return {\n provide: ENVIRONMENT_INITIALIZER,\n multi: true,\n useFactory: (registry: ComponentMetadataRegistry) => () => {\n registry.register(PRAXIS_TABS_COMPONENT_METADATA);\n },\n deps: [ComponentMetadataRegistry],\n } as Provider;\n}\n","/*\n * Public API Surface of praxis-tabs\n */\n\nexport * from './lib/praxis-tabs';\nexport * from './lib/praxis-tabs.metadata';\nexport * from './lib/praxis-tabs-config-editor';\nexport * from './lib/ai/tabs-ai-capabilities';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i4","i8","i1","i2","i3","i5","i7","i6"],"mappings":"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"}
|
package/index.d.ts
CHANGED
|
@@ -49,9 +49,11 @@ interface TabsBehaviorConfig {
|
|
|
49
49
|
interface TabsEventConfig {
|
|
50
50
|
}
|
|
51
51
|
interface TabsAccessibilityConfig {
|
|
52
|
+
/** @deprecated Declared-only. No direct runtime binding; prefer mode-specific aria fields instead. */
|
|
52
53
|
ariaLabels?: {
|
|
53
54
|
[key: string]: string;
|
|
54
55
|
};
|
|
56
|
+
/** @deprecated Declared-only. Keyboard navigation follows Angular Material defaults; no dedicated runtime gate exists. */
|
|
55
57
|
keyboardNavigation?: boolean;
|
|
56
58
|
highContrast?: boolean;
|
|
57
59
|
reduceMotion?: boolean;
|
|
@@ -62,6 +64,7 @@ interface TabGroupMetadata {
|
|
|
62
64
|
ariaLabel?: string;
|
|
63
65
|
ariaLabelledby?: string;
|
|
64
66
|
color?: 'primary' | 'accent' | 'warn';
|
|
67
|
+
/** @deprecated Declared-only. No template binding in the current runtime. */
|
|
65
68
|
contentTabIndex?: number;
|
|
66
69
|
disablePagination?: boolean;
|
|
67
70
|
disableRipple?: boolean;
|
|
@@ -91,6 +94,8 @@ interface TabNavMetadata {
|
|
|
91
94
|
animationDuration?: string;
|
|
92
95
|
color?: 'primary' | 'accent' | 'warn';
|
|
93
96
|
backgroundColor?: 'primary' | 'accent' | 'warn' | undefined;
|
|
97
|
+
ariaLabel?: string;
|
|
98
|
+
ariaLabelledby?: string;
|
|
94
99
|
disablePagination?: boolean;
|
|
95
100
|
disableRipple?: boolean;
|
|
96
101
|
fitInkBarToContent?: boolean;
|
package/package.json
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@praxisui/tabs",
|
|
3
|
-
"version": "1.0.0-beta.
|
|
3
|
+
"version": "1.0.0-beta.52",
|
|
4
4
|
"description": "Configurable tabs (group and nav) for Praxis UI with metadata-driven content and runtime editor.",
|
|
5
5
|
"peerDependencies": {
|
|
6
6
|
"@angular/common": "^20.0.0",
|
|
7
7
|
"@angular/core": "^20.0.0",
|
|
8
8
|
"@angular/material": "^20.0.0",
|
|
9
9
|
"@angular/cdk": "^20.0.0",
|
|
10
|
-
"@praxisui/core": "^1.0.0-beta.
|
|
11
|
-
"@praxisui/dynamic-fields": "^1.0.0-beta.
|
|
12
|
-
"@praxisui/settings-panel": "^1.0.0-beta.
|
|
10
|
+
"@praxisui/core": "^1.0.0-beta.52",
|
|
11
|
+
"@praxisui/dynamic-fields": "^1.0.0-beta.52",
|
|
12
|
+
"@praxisui/settings-panel": "^1.0.0-beta.52"
|
|
13
13
|
},
|
|
14
14
|
"dependencies": {
|
|
15
15
|
"tslib": "^2.3.0",
|