@praxisui/tabs 0.0.1
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/LICENSE +7 -0
- package/README.md +127 -0
- package/fesm2022/praxisui-tabs.mjs +2192 -0
- package/fesm2022/praxisui-tabs.mjs.map +1 -0
- package/index.d.ts +273 -0
- package/package.json +41 -0
|
@@ -0,0 +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/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>\n <mat-tab label=\"Comportamento\">\n <div style=\"padding: 12px; display:grid; gap: 12px;\">\n <div style=\"display:flex; gap: 10px; flex-wrap: wrap;\">\n <mat-slide-toggle [(ngModel)]=\"behavior.closeable\" (ngModelChange)=\"onAppearanceChange()\">closeable</mat-slide-toggle>\n <mat-slide-toggle [(ngModel)]=\"behavior.lazyLoad\" (ngModelChange)=\"onAppearanceChange()\">lazyLoad (planejado)</mat-slide-toggle>\n <mat-slide-toggle [(ngModel)]=\"behavior.reorderable\" (ngModelChange)=\"onAppearanceChange()\">reorderable (planejado)</mat-slide-toggle>\n </div>\n </div>\n </mat-tab>\n <mat-tab label=\"Grupo\">\n <div style=\"padding: 12px; display:grid; gap: 12px;\">\n <div style=\"display:grid; grid-template-columns: repeat(2, minmax(220px,1fr)); gap: 12px;\">\n <mat-form-field appearance=\"outline\"><mat-label>Alinhamento</mat-label>\n <select matNativeControl [(ngModel)]=\"group.alignTabs\" (ngModelChange)=\"onAppearanceChange()\">\n <option [ngValue]=\"undefined\">padrão</option>\n <option value=\"start\">start</option>\n <option value=\"center\">center</option>\n <option value=\"end\">end</option>\n </select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>Header</mat-label>\n <select matNativeControl [(ngModel)]=\"group.headerPosition\" (ngModelChange)=\"onAppearanceChange()\">\n <option [ngValue]=\"undefined\">above</option>\n <option value=\"above\">above</option>\n <option value=\"below\">below</option>\n </select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>selectedIndex</mat-label>\n <input matInput type=\"number\" [(ngModel)]=\"group.selectedIndex\" (ngModelChange)=\"onAppearanceChange()\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>animationDuration</mat-label>\n <input matInput [(ngModel)]=\"group.animationDuration\" (ngModelChange)=\"onAppearanceChange()\" placeholder=\"500ms\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>contentTabIndex</mat-label>\n <input matInput type=\"number\" [(ngModel)]=\"group.contentTabIndex\" (ngModelChange)=\"onAppearanceChange()\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>color (M2)</mat-label>\n <select matNativeControl [(ngModel)]=\"group.color\" (ngModelChange)=\"onAppearanceChange()\">\n <option [ngValue]=\"undefined\">(nenhum)</option>\n <option value=\"primary\">primary</option>\n <option value=\"accent\">accent</option>\n <option value=\"warn\">warn</option>\n </select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>backgroundColor (M2)</mat-label>\n <select matNativeControl [(ngModel)]=\"group.backgroundColor\" (ngModelChange)=\"onAppearanceChange()\">\n <option [ngValue]=\"undefined\">(nenhum)</option>\n <option value=\"primary\">primary</option>\n <option value=\"accent\">accent</option>\n <option value=\"warn\">warn</option>\n </select>\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 style=\"display:flex; gap: 10px; flex-wrap: wrap;\">\n <mat-slide-toggle [(ngModel)]=\"group.dynamicHeight\" (ngModelChange)=\"onAppearanceChange()\">dynamicHeight</mat-slide-toggle>\n <mat-slide-toggle [(ngModel)]=\"group.fitInkBarToContent\" (ngModelChange)=\"onAppearanceChange()\">fitInkBarToContent</mat-slide-toggle>\n <mat-slide-toggle [(ngModel)]=\"group.disablePagination\" (ngModelChange)=\"onAppearanceChange()\">disablePagination</mat-slide-toggle>\n <mat-slide-toggle [(ngModel)]=\"group.disableRipple\" (ngModelChange)=\"onAppearanceChange()\">disableRipple</mat-slide-toggle>\n <mat-slide-toggle [(ngModel)]=\"group.preserveContent\" (ngModelChange)=\"onAppearanceChange()\">preserveContent</mat-slide-toggle>\n <mat-slide-toggle [(ngModel)]=\"group.stretchTabs\" (ngModelChange)=\"onAppearanceChange()\">stretchTabs</mat-slide-toggle>\n </div>\n </div>\n </mat-tab>\n\n <mat-tab label=\"Navegação\">\n <div style=\"padding: 12px; display:grid; gap: 12px;\">\n <div style=\"display:grid; grid-template-columns: repeat(2, minmax(220px,1fr)); gap: 12px;\">\n <mat-form-field appearance=\"outline\"><mat-label>selectedIndex</mat-label>\n <input matInput type=\"number\" [(ngModel)]=\"nav.selectedIndex\" (ngModelChange)=\"onAppearanceChange()\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>animationDuration</mat-label>\n <input matInput [(ngModel)]=\"nav.animationDuration\" (ngModelChange)=\"onAppearanceChange()\" placeholder=\"500ms\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>color (M2)</mat-label>\n <select matNativeControl [(ngModel)]=\"nav.color\" (ngModelChange)=\"onAppearanceChange()\">\n <option [ngValue]=\"undefined\">(nenhum)</option>\n <option value=\"primary\">primary</option>\n <option value=\"accent\">accent</option>\n <option value=\"warn\">warn</option>\n </select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>backgroundColor (M2)</mat-label>\n <select matNativeControl [(ngModel)]=\"nav.backgroundColor\" (ngModelChange)=\"onAppearanceChange()\">\n <option [ngValue]=\"undefined\">(nenhum)</option>\n <option value=\"primary\">primary</option>\n <option value=\"accent\">accent</option>\n <option value=\"warn\">warn</option>\n </select>\n </mat-form-field>\n </div>\n <div style=\"display:flex; gap: 10px; flex-wrap: wrap;\">\n <mat-slide-toggle [(ngModel)]=\"nav.fitInkBarToContent\" (ngModelChange)=\"onAppearanceChange()\">fitInkBarToContent</mat-slide-toggle>\n <mat-slide-toggle [(ngModel)]=\"nav.disablePagination\" (ngModelChange)=\"onAppearanceChange()\">disablePagination</mat-slide-toggle>\n <mat-slide-toggle [(ngModel)]=\"nav.disableRipple\" (ngModelChange)=\"onAppearanceChange()\">disableRipple</mat-slide-toggle>\n <mat-slide-toggle [(ngModel)]=\"nav.stretchTabs\" (ngModelChange)=\"onAppearanceChange()\">stretchTabs</mat-slide-toggle>\n </div>\n </div>\n </mat-tab>\n <mat-tab label=\"JSON\">\n <div style=\"padding: 12px; display: grid; gap: 12px;\">\n <div class=\"json-editor-toolbar\" style=\"display:flex; gap:8px;\">\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\" style=\"width:100%\">\n <mat-label>Configuração JSON</mat-label>\n <textarea\n matInput\n [(ngModel)]=\"jsonText\"\n (ngModelChange)=\"onJsonTextChange($event)\"\n rows=\"22\"\n spellcheck=\"false\"\n style=\"font-family: monospace\"\n ></textarea>\n <mat-hint *ngIf=\"isValid\">JSON válido</mat-hint>\n <mat-error *ngIf=\"!isValid && jsonText\">JSON inválido: {{ errorMsg }}</mat-error>\n </mat-form-field>\n </div>\n </mat-tab>\n\n <mat-tab label=\"Estilo\">\n <div style=\"padding: 12px; display: grid; gap: 16px;\">\n <div style=\"display:flex; gap:8px; align-items:center; flex-wrap: wrap;\">\n <span style=\"opacity:.75\">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 style=\"display:grid; gap:8px; grid-template-columns: repeat(2, minmax(220px, 1fr));\">\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\">padrão</option>\n <option value=\"compact\">compact</option>\n <option value=\"comfortable\">comfortable</option>\n <option value=\"spacious\">spacious</option>\n </select>\n </mat-form-field>\n </div>\n\n <div>\n <h3 style=\"margin: 6px 0 8px;\">Tokens (M3 aproximados)</h3>\n <div style=\"display:grid; grid-template-columns: repeat(2, minmax(220px, 1fr)); gap: 10px;\">\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(--mat-sys-primary) / #RRGGBB\" [ngModel]=\"appearance.tokens?.[t.key]\" (ngModelChange)=\"onTokenChange(t.key, $event)\" />\n </mat-form-field>\n </ng-container>\n </div>\n <p style=\"margin:8px 0 0; color: var(--mat-sys-on-surface-variant); font-size: 12px;\">Dica: valores aceitam CSS vars (ex.: <code>var(--mat-sys-primary)</code>) ou cores hex/rgb.</p>\n </div>\n\n <div>\n <h3 style=\"margin: 6px 0 8px;\">CSS Personalizado</h3>\n <mat-form-field appearance=\"outline\" class=\"json-textarea-field\" style=\"width:100%\">\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 style=\"margin: 6px 0 8px;\">Snippet SCSS (para uso em styles.scss)</h3>\n <pre style=\"white-space: pre-wrap; background: rgba(0,0,0,0.2); padding: 8px; border-radius: 6px;\">\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 style=\"padding:12px; display:grid; gap:12px;\">\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\" style=\"display:grid; gap:10px;\">\n <div *ngFor=\"let t of editedConfig.tabs; let i = index\" style=\"border:1px solid var(--mat-sys-outline-variant); padding:10px; border-radius:8px; display:grid; gap:8px;\">\n <div style=\"display:flex; align-items:center; gap:8px;\">\n <strong style=\"flex:1\">#{{ 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 style=\"display:grid; grid-template-columns: repeat(2, minmax(220px,1fr)); gap: 10px;\">\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>Texto</mat-label>\n <input matInput [(ngModel)]=\"t.textLabel\" (ngModelChange)=\"onAppearanceChange()\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>Label class</mat-label>\n <input matInput [(ngModel)]=\"t.labelClass\" (ngModelChange)=\"onAppearanceChange()\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>Body class</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()\">disabled</mat-slide-toggle>\n\n <!-- Widgets (componentes dinâmicos) -->\n <div style=\"border-top:1px solid var(--mat-sys-outline-variant); padding-top:8px; display:grid; gap:8px;\">\n <div style=\"display:flex; gap:8px; align-items:center; flex-wrap:wrap;\">\n <mat-form-field appearance=\"outline\" style=\"min-width:260px;\">\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 style=\"flex:1\"></span>\n <mat-form-field appearance=\"outline\" style=\"width:240px;\">\n <mat-label>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\" style=\"display:grid; gap:8px;\" cdkDropList [cdkDropListData]=\"t.widgets || []\" (cdkDropListDropped)=\"onTabWidgetDrop(i, $event)\">\n <div *ngFor=\"let w of t.widgets; let wi = index\" cdkDrag style=\"border:1px dashed var(--mat-sys-outline-variant); padding:8px; border-radius:6px;\">\n <div style=\"display:flex; align-items:center; gap:8px;\">\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 style=\"flex:1\">{{ 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 style=\"display:grid; grid-template-columns: 1fr 1fr; gap:8px;\">\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>Nenhuma aba definida.</em></ng-template>\n </div>\n </mat-tab>\n\n <mat-tab label=\"Acessibilidade\">\n <div style=\"padding: 12px; display:grid; gap: 12px;\">\n <div style=\"display:flex; gap: 10px; flex-wrap: wrap;\">\n <mat-slide-toggle [(ngModel)]=\"accessibility.highContrast\" (ngModelChange)=\"onAppearanceChange()\">highContrast</mat-slide-toggle>\n <mat-slide-toggle [(ngModel)]=\"accessibility.reduceMotion\" (ngModelChange)=\"onAppearanceChange()\">reduceMotion</mat-slide-toggle>\n </div>\n </div>\n </mat-tab>\n\n <mat-tab label=\"Links\">\n <div style=\"padding:12px; display:grid; gap:12px;\">\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\" style=\"display:grid; gap:10px;\">\n <div *ngFor=\"let l of nav.links; let i = index\" style=\"border:1px solid var(--mat-sys-outline-variant); padding:10px; border-radius:8px; display:grid; gap:8px;\">\n <div style=\"display:flex; align-items:center; gap:8px;\">\n <strong style=\"flex:1\">#{{ 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 style=\"display:grid; grid-template-columns: repeat(2, minmax(220px,1fr)); gap: 10px;\">\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>Label</mat-label>\n <input matInput [(ngModel)]=\"l.label\" (ngModelChange)=\"onAppearanceChange()\" />\n </mat-form-field>\n </div>\n <div style=\"display:flex; gap:10px; flex-wrap:wrap;\">\n <mat-slide-toggle [(ngModel)]=\"l.active\" (ngModelChange)=\"onAppearanceChange()\">active</mat-slide-toggle>\n <mat-slide-toggle [(ngModel)]=\"l.disabled\" (ngModelChange)=\"onAppearanceChange()\">disabled</mat-slide-toggle>\n <mat-slide-toggle [(ngModel)]=\"l.disableRipple\" (ngModelChange)=\"onAppearanceChange()\">disableRipple</mat-slide-toggle>\n <mat-slide-toggle [(ngModel)]=\"l.fitInkBarToContent\" (ngModelChange)=\"onAppearanceChange()\">fitInkBarToContent</mat-slide-toggle>\n </div>\n\n <!-- Widgets para Links -->\n <div style=\"border-top:1px solid var(--mat-sys-outline-variant); padding-top:8px; display:grid; gap:8px;\">\n <div style=\"display:flex; gap:8px; align-items:center; flex-wrap:wrap;\">\n <mat-form-field appearance=\"outline\" style=\"min-width:260px;\">\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 style=\"flex:1\"></span>\n <mat-form-field appearance=\"outline\" style=\"width:240px;\">\n <mat-label>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\" style=\"display:grid; gap:8px;\" cdkDropList [cdkDropListData]=\"l.widgets || []\" (cdkDropListDropped)=\"onLinkWidgetDrop(i, $event)\">\n <div *ngFor=\"let w of l.widgets; let wi = index\" cdkDrag style=\"border:1px dashed var(--mat-sys-outline-variant); padding:8px; border-radius:6px;\">\n <div style=\"display:flex; align-items:center; gap:8px;\">\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 style=\"flex:1\">{{ 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 style=\"display:grid; grid-template-columns: 1fr 1fr; gap:8px;\">\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>Nenhum link definido.</em></ng-template>\n </div>\n </mat-tab>\n </mat-tab-group>\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(--mat-sys-primary)',\n 'active-label-text-color': 'var(--mat-sys-primary)',\n 'inactive-label-text-color': 'rgba(var(--mat-sys-on-surface-rgb), 0.72)',\n 'inactive-hover-label-text-color': 'var(--mat-sys-on-surface)',\n 'divider-color': 'rgba(255, 255, 255, 0.12)',\n 'background-color': 'var(--mat-sys-surface-container)',\n 'pagination-icon-color': 'var(--mat-sys-on-surface)'\n },\n neutral: {\n 'active-indicator-color': 'var(--mat-sys-on-surface)',\n 'active-label-text-color': 'var(--mat-sys-on-surface)',\n 'inactive-label-text-color': 'rgba(var(--mat-sys-on-surface-rgb), 0.56)',\n 'inactive-hover-label-text-color': 'var(--mat-sys-on-surface)',\n 'divider-color': 'rgba(255, 255, 255, 0.10)',\n 'background-color': 'var(--mat-sys-surface-container)',\n 'pagination-icon-color': 'var(--mat-sys-on-surface)'\n },\n 'high-contrast': {\n 'active-indicator-color': '#FFD54F',\n 'active-label-text-color': '#FFFFFF',\n 'inactive-label-text-color': '#BDBDBD',\n 'inactive-hover-label-text-color': '#EEEEEE',\n 'divider-color': '#FFFFFF',\n 'background-color': 'var(--mat-sys-surface)',\n 'pagination-icon-color': '#FFFFFF'\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 } });\n } else {\n t.widgets.push({ id: 'praxis-crud', inputs: { 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 } });\n } else {\n l.widgets.push({ id: 'praxis-crud', inputs: { 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 style=\"display:grid; gap: 12px; padding: 8px;\">\n <div style=\"display:flex; gap: 12px; align-items:center; flex-wrap:wrap;\">\n <button mat-stroked-button [color]=\"model.mode==='group' ? 'primary' : undefined\" (click)=\"setMode('group')\">\n <mat-icon [praxisIcon]=\"'tab'\"></mat-icon>\n Abas (TabGroup)\n </button>\n <button mat-stroked-button [color]=\"model.mode==='nav' ? 'primary' : undefined\" (click)=\"setMode('nav')\">\n <mat-icon [praxisIcon]=\"'segment'\"></mat-icon>\n Navegação (TabNav)\n </button>\n </div>\n\n <div style=\"display:grid; grid-template-columns: 1fr auto; gap: 8px; align-items:start;\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Adicionar label</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\" style=\"display:flex; flex-wrap:wrap; gap: 8px;\">\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)\"><mat-icon [praxisIcon]=\"'close'\"></mat-icon></button>\n </div>\n </div>\n <ng-template #emptyLabels>\n <em>Adicione 1 ou mais labels para criar as abas.</em>\n </ng-template>\n\n <div style=\"display:flex; gap: 12px; flex-wrap:wrap;\">\n <mat-slide-toggle [(ngModel)]=\"model.dynamicHeight\">dynamicHeight</mat-slide-toggle>\n <mat-slide-toggle [(ngModel)]=\"model.stretchTabs\">stretchTabs</mat-slide-toggle>\n </div>\n </div>\n `,\n styles: [`\n .chip { display:inline-flex; align-items:center; gap:6px; padding:4px 8px; border: 1px solid var(--mat-sys-outline-variant); border-radius: 16px; }\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.map((t) => t.textLabel || 'Aba');\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.map((l) => l.label || 'Link');\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 updateState(): void {\n const dirty = JSON.stringify(this.model) !== JSON.stringify(this.initial);\n this.isDirty$.next(dirty);\n this.isValid$.next(this.model.labels.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 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: this.model.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: this.model.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","import {\n Component,\n Input,\n Output,\n EventEmitter,\n ChangeDetectionStrategy,\n OnChanges,\n SimpleChanges,\n OnInit,\n inject,\n signal,\n computed,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatTabsModule, MatTabChangeEvent } from '@angular/material/tabs';\nimport { MatIconModule } from '@angular/material/icon';\nimport { PraxisIconDirective } 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 { CONFIG_STORAGE, ConfigStorage } 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';\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 PraxisIconDirective,\n MatButtonModule,\n DragDropModule,\n EmptyStateCardComponent,\n DynamicFieldLoaderDirective,\n DynamicWidgetLoaderDirective,\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]=\"tabsId || 'default'\"\n >\n <!-- Inline custom CSS, if provided -->\n <style *ngIf=\"config?.appearance?.customCss\" [innerHTML]=\"config?.appearance?.customCss\"></style>\n <!-- Runtime style derived from tokens -->\n <style *ngIf=\"styleCss() as s\" [innerHTML]=\"s\"></style>\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 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 <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 </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 aria-label=\"Fechar aba\"\n >\n <mat-icon fontIcon=\"close\"></mat-icon>\n </button>\n <ng-container *ngIf=\"config?.behavior?.reorderable\">\n <button mat-icon-button type=\"button\" (click)=\"moveTab(i, -1); $event.stopPropagation()\" [disabled]=\"i===0\" aria-label=\"Mover aba para esquerda\">\n <mat-icon fontIcon=\"arrow_back\"></mat-icon>\n </button>\n <button mat-icon-button type=\"button\" (click)=\"moveTab(i, 1); $event.stopPropagation()\" [disabled]=\"i===(config?.tabs?.length||1)-1\" aria-label=\"Mover aba para direita\">\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\"\n style=\"right: 56px\"\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 .edit-fab { position: absolute; right: 12px; bottom: 12px; z-index: 2; }\n .tab-empty { padding: 16px; color: rgba(0,0,0,0.54); 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 {\n private readonly settings = inject(SettingsPanelService);\n private readonly storage = inject<ConfigStorage>(CONFIG_STORAGE);\n private readonly snack = inject(MatSnackBar);\n\n @Input() config: TabsMetadata | null = null;\n @Input() tabsId?: 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 // 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\n ngOnInit(): void {\n // Load stored config if tabsId provided\n if (this.tabsId) {\n const stored = this.storage.loadConfig<TabsMetadata>(this.storageKey());\n if (stored) {\n this.config = stored;\n }\n }\n // Initialize selected indices from config\n this.selectedIndexSignal.set(this.config?.group?.selectedIndex ?? 0);\n this.currentNavIndex.set(this.config?.nav?.selectedIndex ?? 0);\n // Mark initial selections as loaded for lazy mode\n this.groupLoaded.add(this.selectedIndexSignal() ?? 0);\n this.navLoaded.add(this.currentNavIndex() ?? 0);\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.groupLoaded.clear();\n this.navLoaded.clear();\n // Keep indices in sync when config input changes\n this.selectedIndexSignal.set(this.config?.group?.selectedIndex ?? 0);\n this.currentNavIndex.set(this.config?.nav?.selectedIndex ?? 0);\n this.groupLoaded.add(this.selectedIndexSignal() ?? 0);\n this.navLoaded.add(this.currentNavIndex() ?? 0);\n\n // Persist when tabsId provided\n if (this.tabsId) {\n this.storage.saveConfig(this.storageKey(), this.config);\n }\n }\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) return;\n this.currentNavIndex.set(i);\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 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, try to preserve selection around movement\n if (this.currentNavIndex() === prev) this.currentNavIndex.set(curr);\n }\n // Reset lazy cache for nav except current\n const currIdx = this.currentNavIndex();\n this.navLoaded.clear();\n this.navLoaded.add(currIdx);\n }\n\n onSelectedIndexChange(index: number): void {\n this.selectedIndexSignal.set(index);\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: index } as TabGroupMetadata;\n } else {\n draft.group.selectedIndex = index;\n }\n });\n if (this.tabsId) {\n this.storage.saveConfig(this.storageKey(), this.config);\n }\n }\n // Lazy: mark as loaded\n this.groupLoaded.add(index);\n this.selectedIndexChange.emit(index);\n }\n\n closeTab(index: number): void {\n if (!this.config?.tabs) return;\n this.config = produce(this.config, (draft) => {\n draft.tabs!.splice(index, 1);\n });\n if (this.tabsId) this.storage.saveConfig(this.storageKey(), 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 }\n\n openEditor(): void {\n const ref = this.settings.open({\n id: `praxis-tabs-editor:${this.tabsId || 'default'}`,\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$.subscribe((value: any) => {\n const nextCfg: TabsMetadata = value?.config || value;\n if (nextCfg) {\n this.config = produce(this.config || {}, () => nextCfg);\n if (this.tabsId) this.storage.saveConfig(this.storageKey(), this.config);\n this.selectedIndexSignal.set(this.config?.group?.selectedIndex ?? 0);\n this.currentNavIndex.set(this.config?.nav?.selectedIndex ?? 0);\n }\n });\n\n ref.saved$.subscribe((value: any) => {\n const nextCfg: TabsMetadata = value?.config || value;\n if (nextCfg) {\n this.config = produce(this.config || {}, () => nextCfg);\n if (this.tabsId) this.storage.saveConfig(this.storageKey(), this.config);\n // Sync indices\n this.selectedIndexSignal.set(this.config?.group?.selectedIndex ?? 0);\n this.currentNavIndex.set(this.config?.nav?.selectedIndex ?? 0);\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 if (this.tabsId) this.storage.saveConfig(this.storageKey(), 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 if (!this.tabsId) return;\n try { this.storage.clearConfig(this.storageKey()); } 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 ref = this.settings.open({\n id: `praxis-tabs-quick-setup:${this.tabsId || 'default'}`,\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 if (this.tabsId) this.storage.saveConfig(this.storageKey(), this.config);\n this.selectedIndexSignal.set(this.config?.group?.selectedIndex ?? 0);\n this.currentNavIndex.set(this.config?.nav?.selectedIndex ?? 0);\n }\n };\n ref.applied$.subscribe(apply);\n ref.saved$.subscribe(apply);\n }\n\n private storageKey(): string {\n return `tabs:${this.tabsId}`;\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 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.tabsId || 'default').replace(/\"/g, '')}\"]`;\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 if (t['active-indicator-color']) {\n push(\n ' .mat-mdc-tab .mdc-tab-indicator__content--underline',\n [`background-color:${t['active-indicator-color']}!important;`],\n );\n }\n // Active label\n if (t['active-label-text-color']) {\n push(' .mdc-tab--active .mdc-tab__text-label', [\n `color:${t['active-label-text-color']}!important;`,\n ]);\n }\n if (t['active-hover-label-text-color']) {\n push(' .mdc-tab--active:hover .mdc-tab__text-label', [\n `color:${t['active-hover-label-text-color']}!important;`,\n ]);\n }\n if (t['active-focus-label-text-color']) {\n push(' .mdc-tab--active:focus .mdc-tab__text-label', [\n `color:${t['active-focus-label-text-color']}!important;`,\n ]);\n }\n if (t['active-focus-indicator-color']) {\n push(' .mdc-tab--active:focus .mdc-tab-indicator__content--underline', [\n `background-color:${t['active-focus-indicator-color']}!important;`,\n ]);\n }\n if (t['active-hover-indicator-color']) {\n push(' .mdc-tab--active:hover .mdc-tab-indicator__content--underline', [\n `background-color:${t['active-hover-indicator-color']}!important;`,\n ]);\n }\n // Inactive label\n if (t['inactive-label-text-color']) {\n push(' .mdc-tab:not(.mdc-tab--active) .mdc-tab__text-label', [\n `color:${t['inactive-label-text-color']}!important;`,\n ]);\n }\n if (t['inactive-hover-label-text-color']) {\n push(' .mdc-tab:not(.mdc-tab--active):hover .mdc-tab__text-label', [\n `color:${t['inactive-hover-label-text-color']}!important;`,\n ]);\n }\n if (t['inactive-focus-label-text-color']) {\n push(' .mdc-tab:not(.mdc-tab--active):focus .mdc-tab__text-label', [\n `color:${t['inactive-focus-label-text-color']}!important;`,\n ]);\n }\n // Pagination chevrons\n if (t['pagination-icon-color']) {\n push(' .mat-mdc-tab-header-pagination-chevron', [\n `color:${t['pagination-icon-color']}!important;`,\n ]);\n }\n // Divider / background\n const containerDecls: string[] = [];\n if (t['divider-color']) {\n containerDecls.push(`border-bottom-color:${t['divider-color']}!important;`);\n }\n if (containerDecls.length) {\n push(' .mat-mdc-tab-header', containerDecls);\n }\n if (t['background-color']) {\n push(' .mat-mdc-tab-header', [`background:${t['background-color']}!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, suportando MatTabGroup e TabNav.',\n icon: 'tab',\n inputs: [\n { name: 'config', type: 'TabsMetadata', label: 'Configuração', description: 'Configuração JSON (tabs/nav e widgets internos)' },\n {\n name: 'tabsId',\n type: 'string',\n label: 'ID das Tabs',\n description: 'Identificador para persistência local',\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 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 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';\n\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
ADDED
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { OnInit, OnChanges, EventEmitter, SimpleChanges, Provider } from '@angular/core';
|
|
3
|
+
import { MatTabChangeEvent } from '@angular/material/tabs';
|
|
4
|
+
import { FormGroup } from '@angular/forms';
|
|
5
|
+
import { CdkDragDrop } from '@angular/cdk/drag-drop';
|
|
6
|
+
import { WidgetDefinition, ComponentDocMeta, ComponentMetadataRegistry } from '@praxisui/core';
|
|
7
|
+
import { BehaviorSubject } from 'rxjs';
|
|
8
|
+
import { SettingsValueProvider } from '@praxisui/settings-panel';
|
|
9
|
+
|
|
10
|
+
interface TabsMetadata {
|
|
11
|
+
meta?: any;
|
|
12
|
+
appearance?: TabsAppearanceConfig;
|
|
13
|
+
behavior?: TabsBehaviorConfig;
|
|
14
|
+
events?: TabsEventConfig;
|
|
15
|
+
accessibility?: TabsAccessibilityConfig;
|
|
16
|
+
group?: TabGroupMetadata;
|
|
17
|
+
tabs?: TabMetadata[];
|
|
18
|
+
nav?: TabNavMetadata;
|
|
19
|
+
}
|
|
20
|
+
interface TabsAppearanceConfig {
|
|
21
|
+
density?: 'compact' | 'comfortable' | 'spacious';
|
|
22
|
+
themeClass?: string;
|
|
23
|
+
customCss?: string;
|
|
24
|
+
/** Optional runtime tokens mapped to CSS for per-instance styling */
|
|
25
|
+
tokens?: Partial<TabsStyleTokens>;
|
|
26
|
+
}
|
|
27
|
+
interface TabsBehaviorConfig {
|
|
28
|
+
lazyLoad?: boolean;
|
|
29
|
+
closeable?: boolean;
|
|
30
|
+
reorderable?: boolean;
|
|
31
|
+
}
|
|
32
|
+
interface TabsEventConfig {
|
|
33
|
+
}
|
|
34
|
+
interface TabsAccessibilityConfig {
|
|
35
|
+
ariaLabels?: {
|
|
36
|
+
[key: string]: string;
|
|
37
|
+
};
|
|
38
|
+
keyboardNavigation?: boolean;
|
|
39
|
+
highContrast?: boolean;
|
|
40
|
+
reduceMotion?: boolean;
|
|
41
|
+
}
|
|
42
|
+
interface TabGroupMetadata {
|
|
43
|
+
alignTabs?: 'start' | 'center' | 'end';
|
|
44
|
+
animationDuration?: string;
|
|
45
|
+
ariaLabel?: string;
|
|
46
|
+
ariaLabelledby?: string;
|
|
47
|
+
color?: 'primary' | 'accent' | 'warn';
|
|
48
|
+
contentTabIndex?: number;
|
|
49
|
+
disablePagination?: boolean;
|
|
50
|
+
disableRipple?: boolean;
|
|
51
|
+
dynamicHeight?: boolean;
|
|
52
|
+
fitInkBarToContent?: boolean;
|
|
53
|
+
headerPosition?: 'above' | 'below';
|
|
54
|
+
preserveContent?: boolean;
|
|
55
|
+
selectedIndex?: number;
|
|
56
|
+
stretchTabs?: boolean;
|
|
57
|
+
backgroundColor?: 'primary' | 'accent' | 'warn' | undefined;
|
|
58
|
+
}
|
|
59
|
+
interface TabMetadata {
|
|
60
|
+
id?: string;
|
|
61
|
+
ariaLabel?: string;
|
|
62
|
+
ariaLabelledby?: string;
|
|
63
|
+
textLabel?: string;
|
|
64
|
+
labelClass?: string | string[];
|
|
65
|
+
bodyClass?: string | string[];
|
|
66
|
+
disabled?: boolean;
|
|
67
|
+
content?: any[];
|
|
68
|
+
widgets?: WidgetDefinition[];
|
|
69
|
+
isActive?: boolean;
|
|
70
|
+
origin?: number;
|
|
71
|
+
position?: number;
|
|
72
|
+
}
|
|
73
|
+
interface TabNavMetadata {
|
|
74
|
+
animationDuration?: string;
|
|
75
|
+
color?: 'primary' | 'accent' | 'warn';
|
|
76
|
+
backgroundColor?: 'primary' | 'accent' | 'warn' | undefined;
|
|
77
|
+
disablePagination?: boolean;
|
|
78
|
+
disableRipple?: boolean;
|
|
79
|
+
fitInkBarToContent?: boolean;
|
|
80
|
+
selectedIndex?: number;
|
|
81
|
+
stretchTabs?: boolean;
|
|
82
|
+
links: TabLinkMetadata[];
|
|
83
|
+
}
|
|
84
|
+
interface TabLinkMetadata {
|
|
85
|
+
id?: string;
|
|
86
|
+
label: string;
|
|
87
|
+
active?: boolean;
|
|
88
|
+
disabled?: boolean;
|
|
89
|
+
disableRipple?: boolean;
|
|
90
|
+
fitInkBarToContent?: boolean;
|
|
91
|
+
content?: any[];
|
|
92
|
+
widgets?: WidgetDefinition[];
|
|
93
|
+
}
|
|
94
|
+
interface TabsStyleTokens {
|
|
95
|
+
'active-indicator-color': string;
|
|
96
|
+
'active-focus-indicator-color': string;
|
|
97
|
+
'active-hover-indicator-color': string;
|
|
98
|
+
'active-label-text-color': string;
|
|
99
|
+
'active-focus-label-text-color': string;
|
|
100
|
+
'active-hover-label-text-color': string;
|
|
101
|
+
'inactive-label-text-color': string;
|
|
102
|
+
'inactive-hover-label-text-color': string;
|
|
103
|
+
'inactive-focus-label-text-color': string;
|
|
104
|
+
'inactive-ripple-color': string;
|
|
105
|
+
'pagination-icon-color': string;
|
|
106
|
+
'divider-color': string;
|
|
107
|
+
'background-color': string;
|
|
108
|
+
}
|
|
109
|
+
declare class PraxisTabs implements OnInit, OnChanges {
|
|
110
|
+
private readonly settings;
|
|
111
|
+
private readonly storage;
|
|
112
|
+
private readonly snack;
|
|
113
|
+
config: TabsMetadata | null;
|
|
114
|
+
tabsId?: string;
|
|
115
|
+
editModeEnabled: boolean;
|
|
116
|
+
form: FormGroup | null;
|
|
117
|
+
context: Record<string, any> | null;
|
|
118
|
+
animationDone: EventEmitter<void>;
|
|
119
|
+
focusChange: EventEmitter<MatTabChangeEvent>;
|
|
120
|
+
selectedIndexChange: EventEmitter<number>;
|
|
121
|
+
selectedTabChange: EventEmitter<MatTabChangeEvent>;
|
|
122
|
+
indexFocused: EventEmitter<number>;
|
|
123
|
+
selectFocusedIndex: EventEmitter<number>;
|
|
124
|
+
widgetEvent: EventEmitter<{
|
|
125
|
+
tabId?: string;
|
|
126
|
+
tabIndex?: number;
|
|
127
|
+
linkId?: string;
|
|
128
|
+
linkIndex?: number;
|
|
129
|
+
sourceId: string;
|
|
130
|
+
output?: string;
|
|
131
|
+
payload?: any;
|
|
132
|
+
}>;
|
|
133
|
+
protected currentNavIndex: i0.WritableSignal<number>;
|
|
134
|
+
protected selectedIndexSignal: i0.WritableSignal<number>;
|
|
135
|
+
private groupLoaded;
|
|
136
|
+
private navLoaded;
|
|
137
|
+
ngOnInit(): void;
|
|
138
|
+
ngOnChanges(changes: SimpleChanges): void;
|
|
139
|
+
isNavMode(): boolean;
|
|
140
|
+
effectiveAnimationDuration(): string;
|
|
141
|
+
getNavActive(i: number): boolean;
|
|
142
|
+
onNavClick(i: number): void;
|
|
143
|
+
onNavDrop(event: CdkDragDrop<any>): void;
|
|
144
|
+
onSelectedIndexChange(index: number): void;
|
|
145
|
+
closeTab(index: number): void;
|
|
146
|
+
moveTab(index: number, delta: number): void;
|
|
147
|
+
openEditor(): void;
|
|
148
|
+
addEmptyTab(): void;
|
|
149
|
+
/** Clears persisted tabs configuration to fallback to defaults */
|
|
150
|
+
resetPreferences(): void;
|
|
151
|
+
openQuickSetup(): void;
|
|
152
|
+
private storageKey;
|
|
153
|
+
private isLazy;
|
|
154
|
+
protected groupContentReady(index: number): boolean;
|
|
155
|
+
protected navContentReady(index: number): boolean;
|
|
156
|
+
protected isEmptyGlobal(): boolean;
|
|
157
|
+
protected emitWidgetEvent(loc: {
|
|
158
|
+
tabId?: string;
|
|
159
|
+
tabIndex?: number;
|
|
160
|
+
linkId?: string;
|
|
161
|
+
linkIndex?: number;
|
|
162
|
+
}, ev: {
|
|
163
|
+
sourceId: string;
|
|
164
|
+
output?: string;
|
|
165
|
+
payload?: any;
|
|
166
|
+
}): void;
|
|
167
|
+
protected styleCss(): string | null;
|
|
168
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<PraxisTabs, never>;
|
|
169
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<PraxisTabs, "praxis-tabs", never, { "config": { "alias": "config"; "required": false; }; "tabsId": { "alias": "tabsId"; "required": false; }; "editModeEnabled": { "alias": "editModeEnabled"; "required": false; }; "form": { "alias": "form"; "required": false; }; "context": { "alias": "context"; "required": false; }; }, { "animationDone": "animationDone"; "focusChange": "focusChange"; "selectedIndexChange": "selectedIndexChange"; "selectedTabChange": "selectedTabChange"; "indexFocused": "indexFocused"; "selectFocusedIndex": "selectFocusedIndex"; "widgetEvent": "widgetEvent"; }, never, never, true, never>;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
declare const PRAXIS_TABS_COMPONENT_METADATA: ComponentDocMeta;
|
|
173
|
+
declare function providePraxisTabsMetadata(): Provider;
|
|
174
|
+
|
|
175
|
+
declare class PraxisTabsConfigEditor implements SettingsValueProvider {
|
|
176
|
+
private registry;
|
|
177
|
+
editedConfig: TabsMetadata;
|
|
178
|
+
private initialConfig;
|
|
179
|
+
jsonText: string;
|
|
180
|
+
isValid: boolean;
|
|
181
|
+
errorMsg: string;
|
|
182
|
+
componentOptions: Array<{
|
|
183
|
+
id: string;
|
|
184
|
+
friendlyName?: string;
|
|
185
|
+
}>;
|
|
186
|
+
selectedTabWidgetId: Record<number, string>;
|
|
187
|
+
selectedLinkWidgetId: Record<number, string>;
|
|
188
|
+
quickResourcePathTab: Record<number, string>;
|
|
189
|
+
quickResourcePathLink: Record<number, string>;
|
|
190
|
+
tokenList: readonly [{
|
|
191
|
+
readonly key: "active-indicator-color";
|
|
192
|
+
readonly label: "Indicador ativo";
|
|
193
|
+
}, {
|
|
194
|
+
readonly key: "active-label-text-color";
|
|
195
|
+
readonly label: "Texto ativo";
|
|
196
|
+
}, {
|
|
197
|
+
readonly key: "active-hover-indicator-color";
|
|
198
|
+
readonly label: "Indicador ativo (hover)";
|
|
199
|
+
}, {
|
|
200
|
+
readonly key: "active-hover-label-text-color";
|
|
201
|
+
readonly label: "Texto ativo (hover)";
|
|
202
|
+
}, {
|
|
203
|
+
readonly key: "active-focus-indicator-color";
|
|
204
|
+
readonly label: "Indicador ativo (focus)";
|
|
205
|
+
}, {
|
|
206
|
+
readonly key: "active-focus-label-text-color";
|
|
207
|
+
readonly label: "Texto ativo (focus)";
|
|
208
|
+
}, {
|
|
209
|
+
readonly key: "inactive-label-text-color";
|
|
210
|
+
readonly label: "Texto inativo";
|
|
211
|
+
}, {
|
|
212
|
+
readonly key: "inactive-hover-label-text-color";
|
|
213
|
+
readonly label: "Texto inativo (hover)";
|
|
214
|
+
}, {
|
|
215
|
+
readonly key: "inactive-focus-label-text-color";
|
|
216
|
+
readonly label: "Texto inativo (focus)";
|
|
217
|
+
}, {
|
|
218
|
+
readonly key: "pagination-icon-color";
|
|
219
|
+
readonly label: "Ícones de paginação";
|
|
220
|
+
}, {
|
|
221
|
+
readonly key: "divider-color";
|
|
222
|
+
readonly label: "Divisor/linha";
|
|
223
|
+
}, {
|
|
224
|
+
readonly key: "background-color";
|
|
225
|
+
readonly label: "Fundo do header";
|
|
226
|
+
}];
|
|
227
|
+
private presets;
|
|
228
|
+
isDirty$: BehaviorSubject<boolean>;
|
|
229
|
+
isValid$: BehaviorSubject<boolean>;
|
|
230
|
+
isBusy$: BehaviorSubject<boolean>;
|
|
231
|
+
constructor(data: any, registry: ComponentMetadataRegistry);
|
|
232
|
+
private updateDirty;
|
|
233
|
+
onJsonTextChange(text: string): void;
|
|
234
|
+
formatJson(): void;
|
|
235
|
+
getSettingsValue(): any;
|
|
236
|
+
onSave(): any;
|
|
237
|
+
reset(): void;
|
|
238
|
+
get appearance(): NonNullable<TabsMetadata['appearance']>;
|
|
239
|
+
onAppearanceChange(): void;
|
|
240
|
+
onTokenChange(key: string, value: string): void;
|
|
241
|
+
clearTokens(): void;
|
|
242
|
+
applyPreset(id: 'primary' | 'neutral' | 'high-contrast'): void;
|
|
243
|
+
scssSnippet(): string;
|
|
244
|
+
get group(): any;
|
|
245
|
+
get nav(): any;
|
|
246
|
+
get behavior(): any;
|
|
247
|
+
get accessibility(): any;
|
|
248
|
+
addTab(): void;
|
|
249
|
+
removeTab(index: number): void;
|
|
250
|
+
moveTab(index: number, delta: number): void;
|
|
251
|
+
addWidgetToTab(tabIndex: number): void;
|
|
252
|
+
removeWidgetFromTab(tabIndex: number, widgetIndex: number): void;
|
|
253
|
+
updateWidgetInputsTab(tabIndex: number, widgetIndex: number, text: string): void;
|
|
254
|
+
updateWidgetOutputsTab(tabIndex: number, widgetIndex: number, text: string): void;
|
|
255
|
+
addPresetToTab(tabIndex: number, type: 'form' | 'table' | 'crud'): void;
|
|
256
|
+
addLink(): void;
|
|
257
|
+
removeLink(index: number): void;
|
|
258
|
+
moveLink(index: number, delta: number): void;
|
|
259
|
+
addWidgetToLink(linkIndex: number): void;
|
|
260
|
+
removeWidgetFromLink(linkIndex: number, widgetIndex: number): void;
|
|
261
|
+
updateWidgetInputsLink(linkIndex: number, widgetIndex: number, text: string): void;
|
|
262
|
+
updateWidgetOutputsLink(linkIndex: number, widgetIndex: number, text: string): void;
|
|
263
|
+
addPresetToLink(linkIndex: number, type: 'form' | 'table' | 'crud'): void;
|
|
264
|
+
stringify(v: any): string;
|
|
265
|
+
getCompName(id: string): string;
|
|
266
|
+
onTabWidgetDrop(tabIndex: number, event: CdkDragDrop<WidgetDefinition[]>): void;
|
|
267
|
+
onLinkWidgetDrop(linkIndex: number, event: CdkDragDrop<WidgetDefinition[]>): void;
|
|
268
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<PraxisTabsConfigEditor, never>;
|
|
269
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<PraxisTabsConfigEditor, "praxis-tabs-config-editor", never, {}, {}, never, never, true, never>;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
export { PRAXIS_TABS_COMPONENT_METADATA, PraxisTabs, PraxisTabsConfigEditor, providePraxisTabsMetadata };
|
|
273
|
+
export type { TabGroupMetadata, TabLinkMetadata, TabMetadata, TabNavMetadata, TabsAccessibilityConfig, TabsAppearanceConfig, TabsBehaviorConfig, TabsEventConfig, TabsMetadata, TabsStyleTokens };
|
package/package.json
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@praxisui/tabs",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"peerDependencies": {
|
|
5
|
+
"@angular/common": "^20.0.0",
|
|
6
|
+
"@angular/core": "^20.0.0",
|
|
7
|
+
"@angular/material": "^20.0.0",
|
|
8
|
+
"@angular/cdk": "^20.0.0",
|
|
9
|
+
"@praxisui/core": "^0.0.1",
|
|
10
|
+
"@praxisui/dynamic-fields": "^0.0.1",
|
|
11
|
+
"@praxisui/settings-panel": "^0.0.1"
|
|
12
|
+
},
|
|
13
|
+
"dependencies": {
|
|
14
|
+
"tslib": "^2.3.0",
|
|
15
|
+
"immer": "^10.1.1"
|
|
16
|
+
},
|
|
17
|
+
"license": "Apache-2.0",
|
|
18
|
+
"publishConfig": {
|
|
19
|
+
"access": "public"
|
|
20
|
+
},
|
|
21
|
+
"repository": {
|
|
22
|
+
"type": "git",
|
|
23
|
+
"url": "https://github.com/codexrodrigues/praxis"
|
|
24
|
+
},
|
|
25
|
+
"homepage": "https://github.com/codexrodrigues/praxis#readme",
|
|
26
|
+
"bugs": {
|
|
27
|
+
"url": "https://github.com/codexrodrigues/praxis/issues"
|
|
28
|
+
},
|
|
29
|
+
"sideEffects": false,
|
|
30
|
+
"module": "fesm2022/praxisui-tabs.mjs",
|
|
31
|
+
"typings": "index.d.ts",
|
|
32
|
+
"exports": {
|
|
33
|
+
"./package.json": {
|
|
34
|
+
"default": "./package.json"
|
|
35
|
+
},
|
|
36
|
+
".": {
|
|
37
|
+
"types": "./index.d.ts",
|
|
38
|
+
"default": "./fesm2022/praxisui-tabs.mjs"
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|