@praxisui/stepper 1.0.0-beta.17
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 +229 -0
- package/fesm2022/praxisui-stepper.mjs +2046 -0
- package/fesm2022/praxisui-stepper.mjs.map +1 -0
- package/index.d.ts +240 -0
- package/package.json +43 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"praxisui-stepper.mjs","sources":["../../../projects/praxis-stepper/src/lib/select-quick-config.dialog.ts","../../../projects/praxis-stepper/src/lib/praxis-stepper-config-editor.ts","../../../projects/praxis-stepper/src/lib/praxis-stepper.ts","../../../projects/praxis-stepper/src/lib/praxis-stepper.metadata.ts","../../../projects/praxis-stepper/src/public-api.ts","../../../projects/praxis-stepper/src/praxisui-stepper.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport { Component, Inject } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { MatDialogModule, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatButtonModule } from '@angular/material/button';\n\nexport interface SelectQuickConfigResult {\n label?: string;\n name?: string;\n resourcePath?: string;\n optionLabelKey?: string;\n optionValueKey?: string;\n multiple?: boolean;\n required?: boolean;\n}\n\n@Component({\n selector: 'praxis-select-quick-config-dialog',\n standalone: true,\n imports: [CommonModule, FormsModule, MatDialogModule, MatFormFieldModule, MatInputModule, MatCheckboxModule, MatButtonModule],\n template: `\n <h2 mat-dialog-title>Configurar Select (busca)</h2>\n <div mat-dialog-content class=\"g gap-12\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Rótulo</mat-label>\n <input matInput [(ngModel)]=\"model.label\" placeholder=\"Ex.: Cliente\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Nome</mat-label>\n <input matInput [(ngModel)]=\"model.name\" placeholder=\"Ex.: customerId\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label>resourcePath</mat-label>\n <input matInput [(ngModel)]=\"model.resourcePath\" placeholder=\"Ex.: customers\" />\n </mat-form-field>\n <div class=\"g g-auto-220 gap-12\">\n <mat-form-field appearance=\"outline\">\n <mat-label>optionLabelKey</mat-label>\n <input matInput [(ngModel)]=\"model.optionLabelKey\" placeholder=\"Ex.: name\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>optionValueKey</mat-label>\n <input matInput [(ngModel)]=\"model.optionValueKey\" placeholder=\"Ex.: id\" />\n </mat-form-field>\n </div>\n <div class=\"row gap-16 ai-center\">\n <mat-checkbox [(ngModel)]=\"model.multiple\">Múltipla seleção</mat-checkbox>\n <mat-checkbox [(ngModel)]=\"model.required\">Obrigatório</mat-checkbox>\n </div>\n </div>\n <div mat-dialog-actions align=\"end\">\n <button mat-button (click)=\"cancel()\">Cancelar</button>\n <button mat-flat-button color=\"primary\" (click)=\"confirm()\">Adicionar</button>\n </div>\n `,\n styles: [\n `\n .g { display: grid; }\n .gap-12 { gap: 12px; }\n .w-full { width: 100%; }\n .row { display: flex; }\n .ai-center { align-items: center; }\n .gap-16 { gap: 16px; }\n .g-auto-220 { grid-template-columns: repeat(auto-fit, minmax(220px,1fr)); }\n `,\n ],\n})\nexport class SelectQuickConfigDialogComponent {\n model: SelectQuickConfigResult = {\n label: '',\n name: '',\n resourcePath: '',\n optionLabelKey: 'label',\n optionValueKey: 'id',\n multiple: false,\n required: false,\n };\n\n constructor(\n private ref: MatDialogRef<SelectQuickConfigDialogComponent, SelectQuickConfigResult>,\n @Inject(MAT_DIALOG_DATA) data?: { from?: Partial<SelectQuickConfigResult> },\n ) {\n if (data?.from) this.model = { ...this.model, ...data.from };\n }\n\n cancel(): void { this.ref.close(); }\n confirm(): void { this.ref.close(this.model); }\n}\n\n","import { CommonModule } from '@angular/common';\nimport { Component, Inject, inject } from '@angular/core';\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 { DragDropModule, CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatCardModule } from '@angular/material/card';\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\nimport { MatDialog, MatDialogModule } from '@angular/material/dialog';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { BehaviorSubject } from 'rxjs';\nimport { SETTINGS_PANEL_DATA, SettingsPanelService, SettingsValueProvider } from '@praxisui/settings-panel';\nimport { StepperMetadata, StepConfig } from './praxis-stepper';\nimport type { WidgetDefinition } from '@praxisui/core';\nimport { PraxisDynamicFormConfigEditor } from '@praxisui/dynamic-form';\nimport { PraxisListConfigEditor } from '@praxisui/list';\nimport { PraxisFilesUploadConfigEditor } from '@praxisui/files-upload';\nimport { IconPickerService } from '@praxisui/core';\nimport { ComponentPaletteDialogComponent } from '@praxisui/page-builder';\nimport { SelectQuickConfigDialogComponent, SelectQuickConfigResult } from './select-quick-config.dialog';\n\n@Component({\n selector: 'praxis-stepper-config-editor',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n MatFormFieldModule,\n MatInputModule,\n MatIconModule,\n PraxisIconDirective,\n MatButtonModule,\n MatSlideToggleModule,\n DragDropModule,\n MatTooltipModule,\n MatChipsModule,\n MatCardModule,\n MatButtonToggleModule,\n MatDialogModule,\n MatTabsModule,\n ],\n template: `\n <div class=\"pdx-editor\">\n <mat-tab-group>\n <mat-tab label=\"Geral\">\n <div class=\"tab-pad\">\n <div class=\"help\">Configure o funcionamento e a aparência básica do passo a passo.</div>\n <div class=\"pdx-grid\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Orientação</mat-label>\n <select matNativeControl [(ngModel)]=\"config.orientation\" (ngModelChange)=\"markDirty()\">\n <option value=\"horizontal\">Horizontal</option>\n <option value=\"vertical\">Vertical</option>\n </select>\n <mat-hint>Horizontal: cabeçalho no topo • Vertical: lista à esquerda</mat-hint>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Posição dos títulos</mat-label>\n <select matNativeControl [(ngModel)]=\"config.headerPosition\" (ngModelChange)=\"markDirty()\">\n <option value=\"top\">Acima</option>\n <option value=\"bottom\">Abaixo</option>\n </select>\n <mat-hint>Válido na orientação horizontal</mat-hint>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Posição do rótulo</mat-label>\n <select matNativeControl [(ngModel)]=\"config.labelPosition\" (ngModelChange)=\"markDirty()\" [disabled]=\"config.orientation !== 'horizontal'\">\n <option value=\"end\">Ao lado</option>\n <option value=\"bottom\">Abaixo</option>\n </select>\n <mat-hint>Como o texto aparece no cabeçalho</mat-hint>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Cor</mat-label>\n <select matNativeControl [(ngModel)]=\"config.color\" (ngModelChange)=\"markDirty()\">\n <option [ngValue]=\"undefined\">Padrão</option>\n <option value=\"primary\">Primária</option>\n <option value=\"accent\">Acento</option>\n <option value=\"warn\">Alerta</option>\n </select>\n <mat-hint>Aplicável a temas Material 2 (M2)</mat-hint>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Duração da animação</mat-label>\n <input matInput [(ngModel)]=\"config.animationDuration\" (ngModelChange)=\"markDirty()\" placeholder=\"Ex.: 300ms\" />\n <mat-hint>Tempo da transição entre etapas</mat-hint>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Etapa selecionada</mat-label>\n <input matInput type=\"number\" [(ngModel)]=\"config.selectedIndex\" (ngModelChange)=\"markDirty()\" />\n <mat-hint>Índice inicia em 0 (primeira etapa)</mat-hint>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Densidade</mat-label>\n <select matNativeControl [(ngModel)]=\"config.density\" (ngModelChange)=\"markDirty()\">\n <option [ngValue]=\"undefined\">Padrão</option>\n <option value=\"comfortable\">Confortável</option>\n <option value=\"compact\">Compacta</option>\n </select>\n <mat-hint>Controla espaçamentos e alturas</mat-hint>\n </mat-form-field>\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label>Classe do stepper (opcional)</mat-label>\n <input matInput [(ngModel)]=\"config.stepperClass\" (ngModelChange)=\"markDirty()\" placeholder=\"Ex.: meu-stepper\" />\n <mat-hint>Permite estilizar com CSS escopado</mat-hint>\n </mat-form-field>\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label>Classe do cabeçalho (opcional)</mat-label>\n <input matInput [(ngModel)]=\"config.headerClass\" (ngModelChange)=\"markDirty()\" placeholder=\"Ex.: stepper-header\" />\n <mat-hint>Use para ajustes finos de aparência</mat-hint>\n </mat-form-field>\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label>Classe do conteúdo (opcional)</mat-label>\n <input matInput [(ngModel)]=\"config.contentClass\" (ngModelChange)=\"markDirty()\" placeholder=\"Ex.: stepper-content\" />\n <mat-hint>Aplica uma classe à área de conteúdo</mat-hint>\n </mat-form-field>\n </div>\n <div class=\"pdx-toggles\">\n <mat-slide-toggle [(ngModel)]=\"config.linear\" (ngModelChange)=\"markDirty()\">Respeitar ordem (linear)</mat-slide-toggle>\n <mat-slide-toggle [(ngModel)]=\"config.disableRipple\" (ngModelChange)=\"markDirty()\">Desativar efeitos de clique</mat-slide-toggle>\n </div>\n </div>\n </mat-tab>\n\n <mat-tab label=\"Etapas\">\n <div class=\"tab-pad\">\n <div class=\"help\">Gerencie as etapas: nomes, mensagens e conteúdo. Arraste para reordenar.</div>\n <div class=\"pdx-steps\">\n <div class=\"pdx-steps-header\">\n <div class=\"title\">Etapas ({{ config.steps.length }})</div>\n <button mat-button (click)=\"addStep()\"><mat-icon [praxisIcon]=\"'add'\"></mat-icon>Adicionar etapa</button>\n </div>\n <div cdkDropList (cdkDropListDropped)=\"drop($event)\" class=\"pdx-step-list\">\n <div class=\"pdx-step-item\" *ngFor=\"let s of config.steps; let i = index\" cdkDrag [class.active]=\"activeIndex === i\" (click)=\"setActive(i)\">\n <div class=\"drag-handle\" cdkDragHandle><mat-icon [praxisIcon]=\"'drag_indicator'\"></mat-icon></div>\n <div class=\"pdx-fields\">\n <mat-form-field appearance=\"outline\" style=\"min-width: 180px;\">\n <mat-label>Título da etapa</mat-label>\n <input matInput [(ngModel)]=\"s.label\" (ngModelChange)=\"markDirty()\" />\n <mat-hint>Como aparecerá no cabeçalho</mat-hint>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Identificador (opcional)</mat-label>\n <input matInput [(ngModel)]=\"s.id\" (ngModelChange)=\"markDirty()\" />\n <mat-hint>Útil para automações</mat-hint>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Texto alternativo (acessibilidade)</mat-label>\n <input matInput [(ngModel)]=\"s.ariaLabel\" (ngModelChange)=\"markDirty()\" />\n <mat-hint>Lido por leitores de tela</mat-hint>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>ID que descreve (opcional)</mat-label>\n <input matInput [(ngModel)]=\"s.ariaLabelledby\" (ngModelChange)=\"markDirty()\" />\n <mat-hint>ID de um elemento que descreve a etapa</mat-hint>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Ícone/estado do marcador</mat-label>\n <input matInput [(ngModel)]=\"s.state\" (ngModelChange)=\"markDirty()\" placeholder=\"Ex.: number, done, edit\" />\n <mat-hint>Controla o ícone do passo (quando aplicável)</mat-hint>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Mensagem de erro</mat-label>\n <input matInput [(ngModel)]=\"s.errorMessage\" (ngModelChange)=\"markDirty()\" />\n <mat-hint>Mostrada quando há erro na etapa</mat-hint>\n </mat-form-field>\n <div class=\"pdx-flag-group\">\n <mat-slide-toggle [(ngModel)]=\"s.optional\" (ngModelChange)=\"markDirty()\">Etapa opcional</mat-slide-toggle>\n <mat-slide-toggle [(ngModel)]=\"s.editable\" (ngModelChange)=\"markDirty()\">Permitir voltar e editar</mat-slide-toggle>\n <mat-slide-toggle [(ngModel)]=\"s.completed\" (ngModelChange)=\"markDirty()\">Marcar como concluída</mat-slide-toggle>\n <mat-slide-toggle [(ngModel)]=\"s.hasError\" (ngModelChange)=\"markDirty()\">Marcar como com erro</mat-slide-toggle>\n </div>\n </div>\n <div class=\"pdx-actions\">\n <button mat-icon-button color=\"warn\" (click)=\"removeStep(i)\" matTooltip=\"Remover\">\n <mat-icon [praxisIcon]=\"'delete'\"></mat-icon>\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"pdx-active-step\" *ngIf=\"activeStep as step; else noSteps\">\n <div class=\"hdr\">\n <div class=\"title\">Editando: {{ step.label }}</div>\n <mat-button-toggle-group [(ngModel)]=\"activeIndex\" (ngModelChange)=\"onActiveIndexChange()\" [hideSingleSelectionIndicator]=\"true\">\n <mat-button-toggle *ngFor=\"let s of config.steps; let i = index\" [value]=\"i\">{{ i + 1 }}</mat-button-toggle>\n </mat-button-toggle-group>\n </div>\n\n <div class=\"pdx-content-editor\">\n <div class=\"section\">\n <div class=\"section-title\">Formulário principal</div>\n <div class=\"section-body\">\n <ng-container *ngIf=\"step.form; else addFormBtn\">\n <mat-card appearance=\"outlined\" class=\"mini-card\">\n <mat-card-header>\n <mat-icon mat-card-avatar [praxisIcon]=\"'dynamic_form'\"></mat-icon>\n <mat-card-title>Formulário principal</mat-card-title>\n <mat-card-subtitle>{{ step.form.formId || step.id || '—' }}</mat-card-subtitle>\n </mat-card-header>\n <mat-card-actions align=\"end\">\n <button mat-button (click)=\"editMainForm()\"><mat-icon [praxisIcon]=\"'tune'\"></mat-icon> Editar</button>\n <button mat-button color=\"warn\" (click)=\"removeMainForm()\"><mat-icon [praxisIcon]=\"'delete'\"></mat-icon> Remover</button>\n </mat-card-actions>\n </mat-card>\n </ng-container>\n <ng-template #addFormBtn>\n <button mat-stroked-button color=\"primary\" (click)=\"addMainForm()\"><mat-icon [praxisIcon]=\"'add'\"></mat-icon> Adicionar formulário</button>\n </ng-template>\n </div>\n </div>\n\n <div class=\"section\">\n <div class=\"section-title\">Conteúdos e componentes</div>\n <div class=\"section-body\">\n <div class=\"cta-grid\">\n <div class=\"cta-card mat-elevation-z2\">\n <div class=\"cta-head\">\n <mat-icon [praxisIcon]=\"'dynamic_form'\"></mat-icon>\n <div class=\"cta-title\">Formulário dinâmico</div>\n </div>\n <div class=\"cta-desc\">Crie campos e validações personalizadas nesta etapa.</div>\n <div class=\"cta-actions\">\n <button mat-flat-button color=\"primary\" (click)=\"addMainForm()\">\n <mat-icon [praxisIcon]=\"'add'\"></mat-icon>\n Inserir formulário\n </button>\n </div>\n </div>\n <div class=\"cta-card mat-elevation-z2\">\n <div class=\"cta-head\">\n <mat-icon [praxisIcon]=\"'account_tree'\"></mat-icon>\n <div class=\"cta-title\">Lista em árvore</div>\n </div>\n <div class=\"cta-desc\">Exiba dados hierárquicos com seleção simples.</div>\n <div class=\"cta-actions\">\n <button mat-stroked-button (click)=\"addTreeList()\">\n <mat-icon [praxisIcon]=\"'add'\"></mat-icon>\n Inserir árvore\n </button>\n </div>\n </div>\n <div class=\"cta-card mat-elevation-z2\">\n <div class=\"cta-head\">\n <mat-icon [praxisIcon]=\"'swap_horiz'\"></mat-icon>\n <div class=\"cta-title\">Transferência de itens</div>\n </div>\n <div class=\"cta-desc\">Mover itens entre listas (ideal para múltipla seleção).</div>\n <div class=\"cta-actions\">\n <button mat-stroked-button (click)=\"addTransferListQuick()\">\n <mat-icon [praxisIcon]=\"'add'\"></mat-icon>\n Inserir transferência\n </button>\n </div>\n </div>\n </div>\n <div cdkDropList (cdkDropListDropped)=\"dropWidget($event)\" class=\"widget-list\">\n <div class=\"widget-item\" *ngFor=\"let w of (step.widgets || []); let wi = index\" cdkDrag>\n <div class=\"drag-handle\" cdkDragHandle><mat-icon [praxisIcon]=\"'drag_indicator'\"></mat-icon></div>\n <div class=\"info\">\n <div class=\"name\">{{ displayWidgetName(w) }}</div>\n <div class=\"sub\">{{ w.id }}</div>\n </div>\n <div class=\"actions\">\n <button mat-button (click)=\"editWidget(w, wi)\"><mat-icon [praxisIcon]=\"'tune'\"></mat-icon> Editar</button>\n <button mat-button color=\"warn\" (click)=\"removeWidget(wi)\"><mat-icon [praxisIcon]=\"'delete'\"></mat-icon> Remover</button>\n </div>\n </div>\n <div class=\"empty\" *ngIf=\"!step.widgets || !step.widgets.length\">Nenhum componente adicionado</div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <ng-template #noSteps>\n <div class=\"muted\">Nenhuma etapa definida.</div>\n </ng-template>\n </div>\n </mat-tab>\n\n <mat-tab label=\"Navegação\">\n <div class=\"tab-pad\">\n <div class=\"help\">Personalize os botões de avançar e voltar exibidos em cada etapa.</div>\n <div class=\"pdx-grid\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Estilo dos botões</mat-label>\n <select matNativeControl [(ngModel)]=\"navigationCfg.variant\" (ngModelChange)=\"markDirty()\">\n <option [ngValue]=\"undefined\">Padrão (elevado)</option>\n <option value=\"basic\">Texto</option>\n <option value=\"flat\">Plano</option>\n <option value=\"stroked\">Contornado</option>\n <option value=\"raised\">Elevado</option>\n </select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Cor</mat-label>\n <select matNativeControl [(ngModel)]=\"navigationCfg.color\" (ngModelChange)=\"markDirty()\">\n <option [ngValue]=\"undefined\">Padrão</option>\n <option value=\"primary\">Primária</option>\n <option value=\"accent\">Acento</option>\n <option value=\"warn\">Alerta</option>\n </select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Alinhamento</mat-label>\n <select matNativeControl [(ngModel)]=\"navigationCfg.align\" (ngModelChange)=\"markDirty()\">\n <option [ngValue]=\"undefined\">Direita</option>\n <option value=\"start\">Esquerda</option>\n <option value=\"center\">Centro</option>\n <option value=\"space-between\">Espaçado</option>\n <option value=\"end\">Direita</option>\n </select>\n </mat-form-field>\n </div>\n\n <div class=\"pdx-toggles\">\n <mat-slide-toggle [(ngModel)]=\"navigationCfg.visible\" (ngModelChange)=\"markDirty()\">Mostrar navegação padrão</mat-slide-toggle>\n </div>\n\n <div class=\"pdx-grid\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Texto do botão Voltar</mat-label>\n <input matInput [(ngModel)]=\"navigationCfg.prevLabel\" (ngModelChange)=\"markDirty()\" placeholder=\"Ex.: Voltar\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Texto do botão Próximo</mat-label>\n <input matInput [(ngModel)]=\"navigationCfg.nextLabel\" (ngModelChange)=\"markDirty()\" placeholder=\"Ex.: Próximo\" />\n </mat-form-field>\n </div>\n\n <div class=\"icons-grid\">\n <div class=\"icon-item\">\n <div class=\"icon-head\">Ícone de Voltar</div>\n <button mat-stroked-button type=\"button\" (click)=\"pickNavIcon('prevIcon')\">\n <mat-icon *ngIf=\"navigationCfg.prevIcon\" [praxisIcon]=\"navigationCfg.prevIcon\"></mat-icon>\n <ng-container *ngIf=\"!navigationCfg.prevIcon\">Escolher</ng-container>\n </button>\n </div>\n <div class=\"icon-item\">\n <div class=\"icon-head\">Ícone de Próximo</div>\n <button mat-stroked-button type=\"button\" (click)=\"pickNavIcon('nextIcon')\">\n <mat-icon *ngIf=\"navigationCfg.nextIcon\" [praxisIcon]=\"navigationCfg.nextIcon\"></mat-icon>\n <ng-container *ngIf=\"!navigationCfg.nextIcon\">Escolher</ng-container>\n </button>\n </div>\n </div>\n </div>\n </mat-tab>\n\n <mat-tab label=\"Aparência\">\n <div class=\"tab-pad\">\n <div class=\"help\">Personalize cores, tipografia e ícones. Para ajustes comuns, use os campos abaixo; para maior controle, edite os tokens. Copie o SCSS e cole no arquivo de tema.</div>\n <div class=\"quick-grid\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Altura do cabeçalho (px)</mat-label>\n <input matInput type=\"number\" [ngModel]=\"headerHeightPx\" (ngModelChange)=\"setHeaderHeightPx($event)\" placeholder=\"Ex.: 48\" />\n <mat-hint>Altura do item do cabeçalho</mat-hint>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Tamanho do texto (px)</mat-label>\n <input matInput type=\"number\" [ngModel]=\"headerLabelTextSizePx\" (ngModelChange)=\"setHeaderLabelTextSizePx($event)\" placeholder=\"Ex.: 14\" />\n <mat-hint>Tamanho do título da etapa</mat-hint>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Peso do texto</mat-label>\n <select matNativeControl [ngModel]=\"headerLabelTextWeight\" (ngModelChange)=\"setHeaderLabelTextWeight($event)\">\n <option [ngValue]=\"undefined\">Padrão</option>\n <option value=\"400\">Normal</option>\n <option value=\"500\">Médio</option>\n <option value=\"600\">Seminegrito</option>\n <option value=\"700\">Negrito</option>\n </select>\n </mat-form-field>\n </div>\n <div class=\"pdx-grid\">\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label>Classe de tema (opcional)</mat-label>\n <input matInput [(ngModel)]=\"appearance.themeClass\" (ngModelChange)=\"onAppearanceChange()\" placeholder=\"Ex.: theme-stepper-custom\" />\n <mat-hint>Aplica as cores apenas dentro desse seletor</mat-hint>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Conjunto de ícones</mat-label>\n <select matNativeControl [(ngModel)]=\"appearance.iconsSet\" (ngModelChange)=\"onAppearanceChange()\">\n <option [ngValue]=\"undefined\">Material Icons (padrão)</option>\n <option value=\"material-symbols-outlined\">Material Symbols (Outlined)</option>\n <option value=\"material-symbols-rounded\">Material Symbols (Rounded)</option>\n <option value=\"material-symbols-sharp\">Material Symbols (Sharp)</option>\n </select>\n <mat-hint>Selecione se usar ícones do Material Symbols</mat-hint>\n </mat-form-field>\n </div>\n <div class=\"icons-grid\">\n <div class=\"icon-item\">\n <div class=\"icon-head\">Ícone do número</div>\n <button mat-stroked-button type=\"button\" (click)=\"pickIcon('number')\">\n <mat-icon *ngIf=\"icons.number; else pick\" [praxisIcon]=\"icons.number\"></mat-icon>\n <ng-template #pick>Escolher</ng-template>\n </button>\n </div>\n <div class=\"icon-item\">\n <div class=\"icon-head\">Ícone concluído</div>\n <button mat-stroked-button type=\"button\" (click)=\"pickIcon('done')\">\n <mat-icon *ngIf=\"icons.done; else pick2\" [praxisIcon]=\"icons.done\"></mat-icon>\n <ng-template #pick2>Escolher</ng-template>\n </button>\n </div>\n <div class=\"icon-item\">\n <div class=\"icon-head\">Ícone edição</div>\n <button mat-stroked-button type=\"button\" (click)=\"pickIcon('edit')\">\n <mat-icon *ngIf=\"icons.edit; else pick3\" [praxisIcon]=\"icons.edit\"></mat-icon>\n <ng-template #pick3>Escolher</ng-template>\n </button>\n </div>\n <div class=\"icon-item\">\n <div class=\"icon-head\">Ícone de erro</div>\n <button mat-stroked-button type=\"button\" (click)=\"pickIcon('error')\">\n <mat-icon *ngIf=\"icons.error; else pick4\" [praxisIcon]=\"icons.error\"></mat-icon>\n <ng-template #pick4>Escolher</ng-template>\n </button>\n </div>\n </div>\n <div class=\"icons-hint\" *ngIf=\"symbolsLikelySelected.length && !appearance.iconsSet\">\n <div class=\"muted\">\n Dica: {{ symbolsLikelySelected.join(', ') }} são ícones do Material Symbols. Selecione um conjunto Symbols abaixo ou clique em\n <button mat-button color=\"primary\" type=\"button\" (click)=\"setIconsSetToSymbols()\">Usar Material Symbols (Outlined)</button>.\n </div>\n </div>\n <div class=\"tokens-grid\">\n <div class=\"token-item\" *ngFor=\"let key of stepperTokenKeys\">\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label>{{ key }}</mat-label>\n <input matInput [ngModel]=\"appearance.tokens?.[key]\" (ngModelChange)=\"onTokenChange(key, $event)\" placeholder=\"valor CSS ou var(--token)\" />\n </mat-form-field>\n </div>\n </div>\n <div class=\"pdx-appearance-actions\">\n <button mat-stroked-button color=\"primary\" type=\"button\" (click)=\"applyPreset('neutral')\">Preset: neutro</button>\n <button mat-stroked-button color=\"primary\" type=\"button\" (click)=\"applyPreset('primary')\">Preset: primário</button>\n <button mat-stroked-button color=\"primary\" type=\"button\" (click)=\"applyPreset('high-contrast')\">Preset: alto contraste</button>\n <button mat-button type=\"button\" (click)=\"clearTokens()\">Limpar tokens</button>\n </div>\n <mat-card appearance=\"outlined\" class=\"code-card\">\n <div class=\"code-head\">Snippet SCSS</div>\n <pre class=\"code\"><code>{{ scssSnippet() }}</code></pre>\n </mat-card>\n </div>\n </mat-tab>\n </mat-tab-group>\n </div>\n `,\n styles: [\n `\n .pdx-editor { display: grid; gap: 16px; }\n .pdx-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px,1fr)); gap: 12px; }\n .pdx-toggles { display:flex; gap: 12px; flex-wrap: wrap; }\n .tab-pad { padding: 12px 4px; display: grid; gap: 12px; }\n .help { color: rgba(0,0,0,.7); font-size: 13px; }\n .quick-grid { display:grid; grid-template-columns: repeat(auto-fit, minmax(200px,1fr)); gap: 12px; margin-bottom: 6px; }\n .icons-grid { display:grid; grid-template-columns: repeat(auto-fit, minmax(200px,1fr)); gap: 12px; margin: 8px 0; }\n .icon-item { display: grid; gap: 6px; align-content: start; }\n .icons-hint { margin-top: 4px; }\n .pdx-steps { display: grid; gap: 8px; }\n .pdx-steps-header { display:flex; justify-content: space-between; align-items: center; }\n .pdx-step-list { display: grid; gap: 8px; }\n .pdx-step-item { display:grid; grid-template-columns: 24px 1fr auto; gap: 8px; align-items: start; padding: 8px; border: 1px solid rgba(0,0,0,.12); border-radius: 8px; cursor: pointer; }\n .pdx-step-item.active { border-color: color-mix(in oklab, var(--md-sys-color-primary) 40%, rgba(0,0,0,.12)); box-shadow: var(--mat-elevation-transition), var(--mat-elevation-level2, 0 2px 6px rgba(0,0,0,0.12)); }\n .drag-handle { display:flex; align-items:center; color: rgba(0,0,0,.54); }\n .pdx-fields { display: grid; gap: 8px; grid-template-columns: repeat(auto-fit, minmax(160px,1fr)); }\n .pdx-flag-group { display:flex; gap: 10px; align-items:center; }\n .pdx-active-step { display: grid; gap: 12px; padding-top: 8px; border-top: 1px dashed rgba(0,0,0,.12); }\n .pdx-active-step .hdr { display:flex; gap: 12px; align-items: center; justify-content: space-between; }\n .pdx-content-editor { display: grid; gap: 16px; }\n .section { display: grid; gap: 8px; }\n .section-title { font-weight: 600; opacity: .85; }\n .mini-card { display: block; }\n .widget-list { display: grid; gap: 8px; }\n .widget-item { display:grid; grid-template-columns: 24px 1fr auto; align-items: center; gap: 8px; padding: 8px; border: 1px solid rgba(0,0,0,.12); border-radius: 8px; }\n .widget-item .info .name { font-weight: 600; }\n .widget-item .info .sub { font-size: 12px; opacity: .7; }\n .widget-item .actions { display:flex; gap: 8px; }\n .cta-row { display:flex; gap: 8px; align-items: center; }\n .spacer { flex: 1 1 auto; }\n .muted { color: rgba(0,0,0,.6); }\n .cta-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(240px,1fr)); gap: 12px; margin-bottom: 8px; }\n .cta-card { display: grid; gap: 8px; padding: 12px; border-radius: 12px; border: 1px solid var(--md-sys-color-outline-variant, rgba(0,0,0,.12)); background: var(--md-sys-color-surface); }\n .cta-card .cta-head { display: flex; align-items: center; gap: 8px; }\n .cta-card .cta-title { font-weight: 600; }\n .cta-card .cta-desc { font-size: 12px; opacity: .78; }\n .cta-card .cta-actions { display: flex; gap: 8px; align-items: center; }\n .tokens-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px,1fr)); gap: 12px; margin: 8px 0; }\n .token-item { display: contents; }\n .pdx-appearance { margin-top: 8px; display: grid; gap: 8px; }\n .pdx-appearance-actions { display:flex; gap: 8px; flex-wrap: wrap; }\n .code-card { margin-top: 8px; }\n .code-head { font-weight: 600; margin-bottom: 4px; }\n .code { white-space: pre; overflow: auto; }\n `,\n ]\n})\nexport class PraxisStepperConfigEditor implements SettingsValueProvider {\n config: StepperMetadata = { steps: [], orientation: 'horizontal', headerPosition: 'top', linear: false };\n activeIndex = 0;\n\n // SettingsValueProvider observables\n isDirty$ = new BehaviorSubject<boolean>(false);\n isValid$ = new BehaviorSubject<boolean>(true);\n isBusy$ = new BehaviorSubject<boolean>(false);\n\n private readonly settings = inject(SettingsPanelService);\n private readonly dialog = inject(MatDialog);\n private readonly iconPicker: IconPickerService = inject(IconPickerService);\n\n constructor(@Inject(SETTINGS_PANEL_DATA) data?: any) {\n let seed: StepperMetadata | string | undefined = data?.config ?? data;\n // Normalize when seed is a JSON string\n if (typeof seed === 'string') {\n try { seed = JSON.parse(seed) as StepperMetadata; } catch { seed = undefined; }\n }\n if (seed && typeof seed === 'object') {\n // shallow clone to detach references\n this.config = JSON.parse(JSON.stringify(seed)) as StepperMetadata;\n if (!Array.isArray((this.config as any).steps)) {\n (this.config as any).steps = [] as StepConfig[];\n }\n } else {\n this.config.steps = [ { id: 'step1', label: 'Novo passo' } as StepConfig ];\n this.isDirty$.next(true);\n }\n }\n\n markDirty(): void { this.isDirty$.next(true); this.validate(); }\n\n validate(): void {\n const valid = Array.isArray(this.config.steps) && this.config.steps.every(s => !!s.label);\n this.isValid$.next(valid);\n }\n\n // ------- Appearance (theming tokens) -------\n get navigationCfg(): NonNullable<StepperMetadata['navigation']> {\n const nav = (this.config.navigation ??= {} as any);\n return nav as any;\n }\n get appearance(): NonNullable<StepperMetadata['appearance']> {\n const ap = (this.config.appearance ??= {} as any);\n (ap.tokens ??= {} as any);\n return ap as any;\n }\n\n stepperTokenKeys: string[] = [\n 'container-color',\n 'line-color',\n 'header-label-text-color',\n 'header-optional-label-text-color',\n 'header-icon-foreground-color',\n 'header-icon-background-color',\n 'header-done-state-icon-background-color',\n 'header-done-state-icon-foreground-color',\n 'header-edit-state-icon-background-color',\n 'header-edit-state-icon-foreground-color',\n 'header-error-state-icon-background-color',\n 'header-error-state-icon-foreground-color',\n 'header-error-state-label-text-color',\n 'header-focus-state-layer-color',\n 'header-hover-state-layer-color',\n 'header-label-text-font',\n 'header-label-text-size',\n 'header-label-text-weight',\n 'header-selected-state-label-text-size',\n 'header-selected-state-label-text-weight',\n 'container-text-font',\n 'header-height',\n 'header-focus-state-layer-shape',\n 'header-hover-state-layer-shape',\n 'header-selected-state-icon-background-color',\n 'header-selected-state-icon-foreground-color',\n 'header-selected-state-label-text-color',\n ];\n\n onAppearanceChange(): void { this.markDirty(); }\n\n onTokenChange(key: string, value: string): void {\n const tokens = (this.appearance.tokens = this.appearance.tokens || {});\n if (!value) {\n delete (tokens as any)[key];\n } else {\n (tokens as any)[key] = value;\n }\n this.onAppearanceChange();\n }\n\n clearTokens(): void {\n if (!this.config.appearance) return;\n this.config.appearance.tokens = {} as any;\n this.onAppearanceChange();\n }\n\n applyPreset(id: 'primary' | 'neutral' | 'high-contrast'): void {\n const presets: Record<string, Record<string, string>> = {\n primary: {\n 'container-color': 'var(--md-sys-color-surface-container)',\n 'header-label-text-color': 'var(--md-sys-color-primary)',\n 'header-selected-state-icon-background-color': 'var(--md-sys-color-primary)',\n 'header-selected-state-icon-foreground-color': '#fff',\n 'line-color': 'color-mix(in oklab, var(--md-sys-color-primary) 40%, transparent)',\n },\n neutral: {\n 'container-color': 'var(--md-sys-color-surface)',\n 'header-label-text-color': 'var(--md-sys-color-on-surface)',\n 'line-color': 'var(--md-sys-color-outline-variant)',\n },\n 'high-contrast': {\n 'container-color': '#000',\n 'header-label-text-color': '#fff',\n 'header-selected-state-icon-background-color': 'var(--md-sys-color-on-primary, #ffffff)',\n 'header-selected-state-icon-foreground-color': '#000',\n 'line-color': '#fff',\n },\n };\n const preset = presets[id] || {};\n const tokens = (this.appearance.tokens = this.appearance.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.config.appearance?.tokens || {};\n const entries = Object.entries(tokens).filter(([, v]) => !!v);\n const selector = this.config.appearance?.themeClass ? `.${this.config.appearance.themeClass}` : ':root';\n const map = entries.map(([k, v]) => ` ${k}: ${v},`).join('\\n');\n return `${selector} {\\n @include mat.stepper-overrides((\\n${map}\\n ));\\n}`;\n }\n\n // ===== Quick editors for common tokens =====\n get headerHeightPx(): number | undefined {\n const raw = this.appearance.tokens?.['header-height'];\n if (!raw) return undefined;\n const m = /([0-9]+)\\s*px/.exec(raw);\n return m ? Number(m[1]) : undefined;\n }\n setHeaderHeightPx(v: number | string | null): void {\n const n = Number(v);\n if (!n) {\n delete (this.appearance.tokens as any)['header-height'];\n } else {\n (this.appearance.tokens as any)['header-height'] = `${n}px`;\n }\n this.onAppearanceChange();\n }\n\n get headerLabelTextSizePx(): number | undefined {\n const raw = this.appearance.tokens?.['header-label-text-size'];\n if (!raw) return undefined;\n const m = /([0-9]+)\\s*px/.exec(raw);\n return m ? Number(m[1]) : undefined;\n }\n setHeaderLabelTextSizePx(v: number | string | null): void {\n const n = Number(v);\n if (!n) {\n delete (this.appearance.tokens as any)['header-label-text-size'];\n } else {\n (this.appearance.tokens as any)['header-label-text-size'] = `${n}px`;\n }\n this.onAppearanceChange();\n }\n\n get headerLabelTextWeight(): string | undefined {\n return (this.appearance.tokens as any)['header-label-text-weight'];\n }\n setHeaderLabelTextWeight(v: string | undefined): void {\n if (!v) {\n delete (this.appearance.tokens as any)['header-label-text-weight'];\n } else {\n (this.appearance.tokens as any)['header-label-text-weight'] = v;\n }\n this.onAppearanceChange();\n }\n\n // ===== Icons (using IconPickerService) =====\n get icons(): NonNullable<NonNullable<StepperMetadata['appearance']>['icons']> {\n const ap = this.appearance as any;\n ap.icons ||= {};\n return ap.icons as any;\n }\n\n async pickNavIcon(field: 'prevIcon' | 'nextIcon'): Promise<void> {\n const picked = await this.iconPicker.openDialog({ });\n if (picked) {\n (this.config.navigation ||= {} as any)[field] = picked;\n this.onAppearanceChange();\n }\n }\n async pickIcon(kind: 'number' | 'done' | 'edit' | 'error'): Promise<void> {\n const picked = await this.iconPicker.openDialog({ });\n if (picked) {\n (this.icons as any)[kind] = picked;\n this.onAppearanceChange();\n }\n }\n\n // ===== Icon set suggestions =====\n private symbolsLikely(name?: string): boolean {\n if (!name) return false;\n // Heurística simples: counter_1..10 e replace_image são típicos do Material Symbols.\n if (/^counter_\\d+$/.test(name)) return true;\n if (name === 'replace_image') return true;\n return false;\n }\n get symbolsLikelySelected(): string[] {\n const names = [this.icons.number, this.icons.done, this.icons.edit, this.icons.error].filter(Boolean) as string[];\n return names.filter((n) => this.symbolsLikely(n));\n }\n setIconsSetToSymbols(): void {\n this.appearance.iconsSet = 'material-symbols-outlined';\n this.onAppearanceChange();\n }\n drop(ev: CdkDragDrop<StepConfig[]>): void {\n moveItemInArray(this.config.steps, ev.previousIndex, ev.currentIndex);\n this.markDirty();\n }\n setActive(i: number): void { this.activeIndex = i; }\n onActiveIndexChange(): void { this.activeIndex = Math.max(0, Math.min(this.activeIndex, (this.config.steps.length || 1) - 1)); }\n addStep(): void {\n const n = this.config.steps.length + 1;\n this.config.steps.push({ id: `step${n}`, label: `Passo ${n}` });\n this.markDirty();\n }\n removeStep(idx: number): void {\n this.config.steps.splice(idx, 1);\n this.markDirty();\n }\n\n // ------- Active step helpers -------\n get activeStep(): StepConfig | null { return this.config.steps?.[this.activeIndex] || null; }\n ensureWidgets(): WidgetDefinition[] { const s = this.activeStep!; if (!s.widgets) s.widgets = []; return s.widgets!; }\n displayWidgetName(w: WidgetDefinition): string { switch (w.id) {\n case 'praxis-list': return 'Lista (seleção)';\n case 'pdx-material-searchable-select': return 'Select (busca)';\n case 'praxis-files-upload': return 'Upload de arquivos';\n case 'praxis-dynamic-form': return 'Formulário';\n default: return (w.inputs as any)?.title || (w.inputs as any)?.label || 'Widget';\n } }\n\n dropWidget(ev: CdkDragDrop<WidgetDefinition[]>): void {\n const arr = this.ensureWidgets();\n moveItemInArray(arr, ev.previousIndex, ev.currentIndex);\n this.markDirty();\n }\n removeWidget(idx: number): void {\n const arr = this.ensureWidgets();\n arr.splice(idx, 1);\n this.markDirty();\n }\n\n // ------- Main form -------\n addMainForm(): void {\n const step = this.activeStep; if (!step) return;\n const ref = this.settings.open({ id: `stepper:form:${step.id || this.activeIndex}` , title: 'Configurar Formulário da Etapa', content: { component: PraxisDynamicFormConfigEditor, inputs: { formConfig: step.form?.config || { sections: [] }, formId: step.form?.formId || step.id, mode: step.form?.mode || 'create' } } });\n const apply = (val: any) => {\n const v = val || {};\n step.form = {\n config: v.formConfig || step.form?.config || { sections: [] },\n formId: v?.formId || step.form?.formId || step.id,\n mode: (v?.inputsPatch?.mode as any) || step.form?.mode || 'create',\n } as any;\n this.markDirty();\n };\n ref.applied$.subscribe(apply);\n ref.saved$.subscribe(apply);\n }\n editMainForm(): void { this.addMainForm(); }\n removeMainForm(): void { const s = this.activeStep; if (!s) return; delete s.form; this.markDirty(); }\n\n // ------- Curated widgets -------\n addListSelection(): void {\n const step = this.activeStep; if (!step) return;\n const current: any = { ...(this.ensureWidgets().find(w => w.id === 'praxis-list')?.inputs?.config || {}) };\n // Ensure minimal selection setup\n current.selection = current.selection || { mode: 'single', return: 'value' };\n const ref = this.settings.open({ id: `stepper:list:${step.id || this.activeIndex}`, title: 'Configurar Lista (seleção)', content: { component: PraxisListConfigEditor, inputs: { config: current, listId: step.id || 'list' } } });\n const apply = (val: any) => {\n const cfg = (val && (val.config || val)) || current;\n const wd: WidgetDefinition = { id: 'praxis-list', inputs: { config: cfg } };\n const arr = this.ensureWidgets();\n arr.push(wd);\n this.markDirty();\n };\n ref.applied$.subscribe(apply);\n ref.saved$.subscribe(apply);\n }\n\n addSearchableSelect(): void {\n const step = this.activeStep; if (!step) return;\n const dlg = this.dialog.open(SelectQuickConfigDialogComponent, { width: '520px', data: { } });\n dlg.afterClosed().subscribe((res: SelectQuickConfigResult | undefined) => {\n if (!res) return;\n const meta = {\n name: res.name || 'selection',\n label: res.label || 'Seleção',\n required: !!res.required,\n searchable: true,\n multiple: !!res.multiple,\n resourcePath: res.resourcePath || undefined,\n optionLabelKey: res.optionLabelKey || 'label',\n optionValueKey: res.optionValueKey || 'id',\n loadOn: 'open',\n } as any;\n const wd: WidgetDefinition = { id: 'pdx-material-searchable-select', inputs: { metadata: meta } };\n this.ensureWidgets().push(wd);\n this.markDirty();\n });\n }\n\n addFilesUpload(): void {\n const step = this.activeStep; if (!step) return;\n const ref = this.settings.open({ id: `stepper:upload:${step.id || this.activeIndex}`, title: 'Configurar Upload de Arquivos', content: { component: PraxisFilesUploadConfigEditor, inputs: {} } });\n const apply = (cfg: any) => {\n const wd: WidgetDefinition = { id: 'praxis-files-upload', inputs: { config: cfg, componentId: `${step.id || 'step'}-upload-${Date.now()}` } };\n this.ensureWidgets().push(wd);\n this.markDirty();\n };\n ref.applied$.subscribe(apply);\n ref.saved$.subscribe(apply);\n }\n\n openMoreComponents(): void {\n const dlg = this.dialog.open(ComponentPaletteDialogComponent, { width: '560px', data: { title: 'Adicionar componente à etapa', allowedWidgetIds: ['praxis-dynamic-form', 'praxis-list', 'pdx-material-searchable-select', 'praxis-files-upload'] } as any });\n dlg.afterClosed().subscribe((id: string | undefined) => {\n if (!id) return;\n switch (id) {\n case 'praxis-dynamic-form': this.addMainForm(); break;\n case 'praxis-list': this.addListSelection(); break;\n case 'pdx-material-searchable-select': this.addSearchableSelect(); break;\n case 'praxis-files-upload': this.addFilesUpload(); break;\n default:\n // Fallback: insert minimal widget with no inputs\n this.ensureWidgets().push({ id });\n this.markDirty();\n }\n });\n }\n\n // Quick CTAs\n addTreeList(): void {\n const step = this.activeStep; if (!step) return;\n const cfg: any = { mode: 'tree', selection: { mode: 'single' } };\n const wd: WidgetDefinition = { id: 'praxis-list', inputs: { config: cfg } };\n this.ensureWidgets().push(wd);\n this.markDirty();\n }\n\n addTransferListQuick(): void {\n const step = this.activeStep; if (!step) return;\n // Seed a simple form with a transfer list field\n const formConfig: any = {\n sections: [\n { rows: [ [ { name: 'items', label: 'Itens', controlType: 'TRANSFER_LIST', transferOptions: { source: [], target: [] } } ] ] }\n ]\n };\n const ref = this.settings.open({ id: `stepper:transfer:${step.id || this.activeIndex}`, title: 'Configurar Transferência de Itens', content: { component: PraxisDynamicFormConfigEditor, inputs: { formConfig, formId: step.id || 'transfer' } } });\n const apply = (val: any) => {\n const v = val || {};\n step.form = { config: v.formConfig || formConfig, formId: v?.formId || step.id, mode: (v?.inputsPatch?.mode as any) || 'create' } as any;\n this.markDirty();\n };\n ref.applied$.subscribe(apply);\n ref.saved$.subscribe(apply);\n }\n\n editWidget(w: WidgetDefinition, index: number): void {\n switch (w.id) {\n case 'praxis-dynamic-form':\n // treat as embedded form\n this.addMainForm();\n break;\n case 'praxis-list': {\n const cfg = (w.inputs as any)?.config || {};\n const step = this.activeStep; if (!step) return;\n const ref = this.settings.open({ id: `stepper:list:${step.id || this.activeIndex}`, title: 'Configurar Lista (seleção)', content: { component: PraxisListConfigEditor, inputs: { config: cfg, listId: step.id || 'list' } } });\n const apply = (val: any) => {\n const next = (val && (val.config || val)) || cfg;\n (w.inputs as any) = { ...(w.inputs || {}), config: next };\n this.markDirty();\n };\n ref.applied$.subscribe(apply);\n ref.saved$.subscribe(apply);\n break; }\n case 'pdx-material-searchable-select': {\n const meta = (w.inputs as any)?.metadata || {};\n const dlg = this.dialog.open(SelectQuickConfigDialogComponent, { width: '520px', data: { from: meta } });\n dlg.afterClosed().subscribe((res: SelectQuickConfigResult | undefined) => {\n if (!res) return;\n const next = { ...meta, ...res, searchable: true };\n (w.inputs as any) = { ...(w.inputs || {}), metadata: next };\n this.markDirty();\n });\n break; }\n case 'praxis-files-upload': {\n const cfg = (w.inputs as any)?.config || {};\n const ref = this.settings.open({ id: `stepper:upload:edit`, title: 'Configurar Upload de Arquivos', content: { component: PraxisFilesUploadConfigEditor, inputs: { ...cfg } } });\n const apply = (val: any) => { (w.inputs as any) = { ...(w.inputs || {}), config: val }; this.markDirty(); };\n ref.applied$.subscribe(apply);\n ref.saved$.subscribe(apply);\n break; }\n default:\n // No editor available\n break;\n }\n }\n\n // SettingsValueProvider\n getSettingsValue(): any { return this.config; }\n onSave(): any { return this.getSettingsValue(); }\n reset(): void {\n this.isBusy$.next(true);\n try {\n this.config = { steps: [], orientation: 'horizontal', headerPosition: 'top', linear: false };\n this.isDirty$.next(true);\n this.isValid$.next(true);\n } finally {\n this.isBusy$.next(false);\n }\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, ContentChild, EventEmitter, Input, Output, TemplateRef, computed, signal, inject } from '@angular/core';\nimport { MatStepper, MatStepperModule } from '@angular/material/stepper';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { PraxisIconDirective } from '@praxisui/core';\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { PraxisDynamicForm } from '@praxisui/dynamic-form';\nimport { SettingsPanelService } from '@praxisui/settings-panel';\nimport { PraxisStepperConfigEditor } from './praxis-stepper-config-editor';\nimport { DynamicWidgetLoaderDirective } from '@praxisui/core';\nimport type { WidgetDefinition } from '@praxisui/core';\nimport type { FormConfig, FormReadyEvent, FormValueChangeEvent } from '@praxisui/core';\nimport { EmptyStateCardComponent } from '@praxisui/core';\nimport { ThemePalette } from '@angular/material/core';\n\nexport type StepOrientation = 'horizontal' | 'vertical';\nexport type StepHeaderPosition = 'top' | 'bottom';\n\nexport interface StepConfig {\n id?: string;\n label: string;\n optional?: boolean;\n editable?: boolean;\n completed?: boolean;\n hasError?: boolean;\n stateIcon?: string;\n state?: string; // usado com <ng-template matStepperIcon=\"state\">\n errorMessage?: string;\n ariaLabel?: string;\n ariaLabelledby?: string;\n // Integração opcional com Dynamic Form por etapa\n form?: {\n resourcePath?: string;\n resourceId?: string | number;\n mode?: 'create' | 'edit' | 'view';\n config?: FormConfig;\n schemaSource?: 'resource' | 'filter';\n formId?: string;\n };\n // Futuro: stepControlKey?: string; // para integração com FormGroup externo\n // Futuro: widgets?: any[]; // children (Gridster)\n widgets?: WidgetDefinition[];\n description?: string;\n}\n\nexport interface StepperMetadata {\n orientation?: StepOrientation;\n linear?: boolean;\n headerPosition?: StepHeaderPosition;\n labelPosition?: 'bottom' | 'end';\n color?: ThemePalette;\n disableRipple?: boolean;\n animationDuration?: string;\n selectedIndex?: number;\n steps: StepConfig[];\n // Styling hooks\n density?: 'default' | 'comfortable' | 'compact';\n stepperClass?: string;\n headerClass?: string;\n contentClass?: string;\n // Appearance tokens (pass-through for theming via mat.stepper-overrides)\n appearance?: {\n themeClass?: string;\n tokens?: Record<string, string>;\n icons?: {\n number?: string;\n done?: string;\n edit?: string;\n error?: string;\n };\n iconsSet?: string; // ex.: 'material-symbols-outlined' | 'material-symbols-rounded' | 'material-symbols-sharp'\n };\n navigation?: {\n visible?: boolean;\n prevLabel?: string;\n nextLabel?: string;\n prevIcon?: string;\n nextIcon?: string;\n variant?: 'basic' | 'flat' | 'stroked' | 'raised';\n color?: ThemePalette;\n align?: 'start' | 'center' | 'end' | 'space-between';\n };\n}\n\n@Component({\n selector: 'praxis-stepper',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, MatStepperModule, MatButtonModule, MatIconModule, PraxisIconDirective, PraxisDynamicForm, DynamicWidgetLoaderDirective, EmptyStateCardComponent],\n template: `\n <ng-container *ngIf=\"steps().length > 0; else emptyState\">\n <mat-stepper\n [linear]=\"linear()\"\n [orientation]=\"orientation()\"\n [headerPosition]=\"headerPosition()\"\n [labelPosition]=\"labelPos()\"\n [disableRipple]=\"disableRipple()\"\n [color]=\"stepperColor()\"\n [animationDuration]=\"animationDuration()\"\n [selectedIndex]=\"selectedIndexComputed()\"\n (selectionChange)=\"onSelectionChange($event)\"\n (animationDone)=\"onAnimationDone()\"\n class=\"praxis-stepper\"\n [ngClass]=\"[densityClass(), _config()?.stepperClass || '']\"\n >\n <!-- Projeção de ícones customizados do header: <ng-template matStepperIcon=\"done\"> ... </ng-template> -->\n <ng-content></ng-content>\n <!-- Overrides de ícones via configuração (appearance.icons) -->\n <ng-template *ngIf=\"icons()?.number as icn\" matStepperIcon=\"number\">\n <mat-icon [praxisIcon]=\"icn\"></mat-icon>\n </ng-template>\n <ng-template *ngIf=\"icons()?.done as icn\" matStepperIcon=\"done\">\n <mat-icon [praxisIcon]=\"icn\"></mat-icon>\n </ng-template>\n <ng-template *ngIf=\"icons()?.edit as icn\" matStepperIcon=\"edit\">\n <mat-icon [praxisIcon]=\"icn\"></mat-icon>\n </ng-template>\n <ng-template *ngIf=\"icons()?.error as icn\" matStepperIcon=\"error\">\n <mat-icon [praxisIcon]=\"icn\"></mat-icon>\n </ng-template>\n <mat-step *ngFor=\"let step of steps(); let i = index; trackBy: trackStep\"\n [stepControl]=\"$any(formGroupFor(i))\"\n [id]=\"step.id || ''\"\n [aria-label]=\"step.ariaLabel || ''\"\n [aria-labelledby]=\"step.ariaLabelledby || ''\"\n [label]=\"step.label\"\n [optional]=\"step.optional || false\"\n [editable]=\"step.editable ?? true\"\n [completed]=\"computedCompleted(i, step)\"\n [hasError]=\"computedHasError(i, step)\"\n [errorMessage]=\"step.errorMessage || ''\"\n [state]=\"step.state || step.stateIcon || ''\"\n >\n <ng-template matStepLabel>\n <ng-container *ngIf=\"stepLabelTpl; else plainLabel\"\n [ngTemplateOutlet]=\"stepLabelTpl\"\n [ngTemplateOutletContext]=\"{ $implicit: step, index: i }\"\n ></ng-container>\n <ng-template #plainLabel>{{ step.label }}</ng-template>\n </ng-template>\n <div class=\"pdx-step-content\" [ngClass]=\"_config()?.contentClass || ''\">\n <praxis-dynamic-form *ngIf=\"step.form as f\"\n [resourcePath]=\"f.resourcePath\"\n [resourceId]=\"$any(f.resourceId)\"\n [mode]=\"f.mode || 'create'\"\n [config]=\"f.config || { sections: [] }\"\n [schemaSource]=\"f.schemaSource || 'resource'\"\n [formId]=\"f.formId\"\n (formReady)=\"onFormReady(i, $event)\"\n (valueChange)=\"onFormValueChange(i, $event)\"\n ></praxis-dynamic-form>\n <ng-container *ngFor=\"let wd of step.widgets || []\"\n [dynamicWidgetLoader]=\"wd\"\n [context]=\"stepperContext\"\n [strictValidation]=\"true\"\n [autoWireOutputs]=\"true\"\n (widgetEvent)=\"onChildWidgetEvent(i, wd, $event)\"></ng-container>\n <ng-container *ngIf=\"isStepEmpty(step)\">\n <praxis-empty-state-card\n [inline]=\"true\"\n icon=\"dashboard_customize\"\n title=\"Sem conteúdo nesta etapa\"\n description=\"Adicione um formulário ou widgets a esta etapa, ou abra o editor para configurar.\"\n [primaryAction]=\"{ label: 'Abrir editor', icon: 'tune', action: openEditor.bind(this) }\"\n ></praxis-empty-state-card>\n </ng-container>\n </div>\n <div class=\"pdx-step-actions\" *ngIf=\"navVisible()\" [ngClass]=\"navAlignClass()\">\n <!-- PREV button (hidden on first step) -->\n <ng-container *ngIf=\"selectedIndexComputed() > 0\">\n <ng-container [ngSwitch]=\"navVariant()\">\n <button *ngSwitchCase=\"'flat'\" mat-flat-button [color]=\"navColor()\" type=\"button\" (click)=\"onPrev()\">\n <mat-icon *ngIf=\"navPrevIcon() as ic\" [praxisIcon]=\"ic\"></mat-icon>\n {{ navPrevLabel() }}\n </button>\n <button *ngSwitchCase=\"'stroked'\" mat-stroked-button [color]=\"navColor()\" type=\"button\" (click)=\"onPrev()\">\n <mat-icon *ngIf=\"navPrevIcon() as ic\" [praxisIcon]=\"ic\"></mat-icon>\n {{ navPrevLabel() }}\n </button>\n <button *ngSwitchCase=\"'raised'\" mat-raised-button [color]=\"navColor()\" type=\"button\" (click)=\"onPrev()\">\n <mat-icon *ngIf=\"navPrevIcon() as ic\" [praxisIcon]=\"ic\"></mat-icon>\n {{ navPrevLabel() }}\n </button>\n <button *ngSwitchDefault mat-button [color]=\"navColor()\" type=\"button\" (click)=\"onPrev()\">\n <mat-icon *ngIf=\"navPrevIcon() as ic\" [praxisIcon]=\"ic\"></mat-icon>\n {{ navPrevLabel() }}\n </button>\n </ng-container>\n </ng-container>\n\n <!-- NEXT button -->\n <ng-container [ngSwitch]=\"navVariant()\">\n <button *ngSwitchCase=\"'flat'\" mat-flat-button [color]=\"navColor()\" type=\"button\" (click)=\"onNext(i)\" [disabled]=\"isNextDisabled(i)\">\n {{ navNextLabel() }}\n <mat-icon *ngIf=\"navNextIcon() as ic\" [praxisIcon]=\"ic\"></mat-icon>\n </button>\n <button *ngSwitchCase=\"'stroked'\" mat-stroked-button [color]=\"navColor()\" type=\"button\" (click)=\"onNext(i)\" [disabled]=\"isNextDisabled(i)\">\n {{ navNextLabel() }}\n <mat-icon *ngIf=\"navNextIcon() as ic\" [praxisIcon]=\"ic\"></mat-icon>\n </button>\n <button *ngSwitchCase=\"'raised'\" mat-raised-button [color]=\"navColor()\" type=\"button\" (click)=\"onNext(i)\" [disabled]=\"isNextDisabled(i)\">\n {{ navNextLabel() }}\n <mat-icon *ngIf=\"navNextIcon() as ic\" [praxisIcon]=\"ic\"></mat-icon>\n </button>\n <button *ngSwitchDefault mat-button [color]=\"navColor()\" type=\"button\" (click)=\"onNext(i)\" [disabled]=\"isNextDisabled(i)\">\n {{ navNextLabel() }}\n <mat-icon *ngIf=\"navNextIcon() as ic\" [praxisIcon]=\"ic\"></mat-icon>\n </button>\n </ng-container>\n </div>\n </mat-step>\n </mat-stepper>\n </ng-container>\n <ng-template #emptyState>\n <praxis-empty-state-card\n icon=\"view_timeline\"\n [inline]=\"true\"\n title=\"Stepper sem etapas\"\n description=\"Adicione etapas para começar. Você pode configurar formulários ou widgets em cada etapa.\"\n [primaryAction]=\"primaryCta\"\n [secondaryActions]=\"secondaryCtas\"\n ></praxis-empty-state-card>\n </ng-template>\n <button\n *ngIf=\"editModeEnabled\"\n mat-fab\n class=\"edit-fab\"\n aria-label=\"Editar stepper\"\n (click)=\"openEditor()\"\n >\n <mat-icon fontIcon=\"edit\"></mat-icon>\n </button>\n `,\n styles: [\n `\n :host { display: block; position: relative; }\n .praxis-stepper { width: 100%; }\n :host(.density-compact) .mat-step-header { min-height: 36px; }\n :host(.density-compact) .pdx-step-actions { padding-top: 4px; gap: 6px; }\n :host(.density-comfortable) .mat-step-header { min-height: 44px; }\n .pdx-step-content { padding: 8px 0; }\n .pdx-step-actions { display: flex; gap: 8px; padding-top: 8px; }\n .nav-align-start { justify-content: flex-start; }\n .nav-align-center { justify-content: center; }\n .nav-align-end { justify-content: flex-end; }\n .nav-align-space-between { justify-content: space-between; }\n .edit-fab { position: absolute; right: 12px; bottom: 12px; z-index: 2; }\n `,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class PraxisStepper {\n // Templates projetados\n @ContentChild('stepLabelTpl', { read: TemplateRef }) stepLabelTpl?: TemplateRef<any>;\n // Dados e estado\n _config = signal<StepperMetadata | null>(null);\n private _selectedIndex = signal<number>(0);\n private _formGroups = new Map<number, FormGroup>();\n private _formValidity = new Map<number, boolean>();\n\n // CTA models for empty state\n primaryCta = { label: 'Configurar Stepper', icon: 'tune', color: 'primary' as const, action: () => this.openEditor() };\n secondaryCtas = [ { label: 'Adicionar etapa inicial', icon: 'add', action: () => this.addFirstStep() } ];\n\n // API de entrada\n @Input() set config(c: StepperMetadata | string | null) {\n let next: StepperMetadata | null = null;\n if (typeof c === 'string') {\n try { next = JSON.parse(c) as StepperMetadata; } catch { next = null; }\n } else {\n next = c as StepperMetadata | null;\n }\n this._config.set(next);\n if (next?.selectedIndex != null) this._selectedIndex.set(next.selectedIndex);\n }\n @Input() set selectedIndexInput(i: number | null) {\n if (i != null) this._selectedIndex.set(i);\n }\n // Suporte a two-way binding [(selectedIndex)] como no Material\n @Input() set selectedIndex(i: number | null) {\n if (i != null) this._selectedIndex.set(i);\n }\n @Input() disableRippleInput = false;\n @Input() editModeEnabled = false;\n // Paridade com API do Material\n @Input() labelPosition?: 'bottom' | 'end';\n @Input() color?: ThemePalette;\n /**\n * Validação remota opcional por etapa. Retorne ok=false com fieldErrors/formErrors para bloquear avanço.\n */\n @Input() serverValidate?: (args: { step: StepConfig; stepIndex: number; formGroup?: FormGroup; formData?: any }) => Promise<{\n ok: boolean; fieldErrors?: Record<string, string[]>; formErrors?: string[]; errorMessage?: string;\n }>;\n\n // Emissões\n @Output() selectedIndexChange = new EventEmitter<number>();\n @Output() widgetEvent = new EventEmitter<{ stepId?: string; stepIndex?: number; sourceId: string; output?: string; payload?: any }>();\n @Input() stepperContext?: Record<string, any>;\n private readonly settings = inject(SettingsPanelService);\n @Output() animationDone = new EventEmitter<void>();\n\n // Computed getters\n steps = computed(() => this._config()?.steps || []);\n orientation = computed<StepOrientation>(() => this._config()?.orientation || 'horizontal');\n headerPosition = computed<StepHeaderPosition>(() => this._config()?.headerPosition || 'top');\n // labelPosition: default 'end' no Material\n labelPos = computed<'bottom' | 'end'>(() => this._config()?.labelPosition ?? this.labelPosition ?? 'end');\n linear = computed<boolean>(() => !!this._config()?.linear);\n disableRipple = computed<boolean>(() => this._config()?.disableRipple ?? this.disableRippleInput);\n animationDuration = computed<string>(() => this._config()?.animationDuration || '300ms');\n stepperColor = computed<ThemePalette | undefined>(() => this._config()?.color ?? this.color);\n icons = computed(() => this._config()?.appearance?.icons);\n iconsSet = computed(() => this._config()?.appearance?.iconsSet);\n // Navigation helpers\n private nav = computed(() => this._config()?.navigation || {});\n navVisible = () => this.nav()?.visible !== false; // default true\n navVariant = () => (this.nav()?.variant || 'raised') as 'basic' | 'flat' | 'stroked' | 'raised';\n navColor = () => (this.nav()?.color || 'primary') as ThemePalette;\n navPrevLabel = () => this.nav()?.prevLabel || 'Voltar';\n navNextLabel = () => this.nav()?.nextLabel || 'Próximo';\n navPrevIcon = () => this.nav()?.prevIcon;\n navNextIcon = () => this.nav()?.nextIcon;\n navAlignClass = () => {\n const a = this.nav()?.align || 'end';\n switch (a) {\n case 'start': return 'nav-align-start';\n case 'center': return 'nav-align-center';\n case 'space-between': return 'nav-align-space-between';\n case 'end':\n default: return 'nav-align-end';\n }\n };\n isNextDisabled(i: number): boolean {\n return this.linear() && this._formValidity.get(i) === false;\n }\n private clampIndex(idx: number): number {\n const len = this.steps().length;\n const max = Math.max(0, len - 1);\n if (Number.isNaN(idx)) return 0;\n return Math.min(Math.max(0, idx), max);\n }\n selectedIndexComputed = computed<number>(() => this.clampIndex(this._selectedIndex()));\n densityClass = () => {\n const d = this._config()?.density;\n if (d === 'compact') return 'density-compact';\n if (d === 'comfortable') return 'density-comfortable';\n return '';\n };\n\n // Handlers\n @Output() selectionChange = new EventEmitter<any>();\n trackStep = (_: number, s: StepConfig) => s.id || _;\n onSelectionChange(ev: any) {\n const idx = this.clampIndex(ev?.selectedIndex ?? 0);\n this._selectedIndex.set(idx);\n this.selectedIndexChange.emit(idx);\n this.selectionChange.emit(ev);\n }\n\n // API programática básica\n goTo(index: number): void {\n const clamped = this.clampIndex(index);\n this._selectedIndex.set(clamped);\n this.selectedIndexChange.emit(clamped);\n }\n next(): void {\n const curr = this._selectedIndex();\n const len = this.steps().length;\n if (curr < len - 1) this.goTo(curr + 1);\n }\n prev(): void {\n const curr = this._selectedIndex();\n if (curr > 0) this.goTo(curr - 1);\n }\n reset(): void { this.goTo(0); }\n\n // Alias para compatibilidade nominal com MatStepper\n previous(): void { this.prev(); }\n\n // Dynamic Form integration\n onFormReady(stepIndex: number, ev: FormReadyEvent) {\n this._formGroups.set(stepIndex, ev.formGroup);\n this._formValidity.set(stepIndex, ev.formGroup.valid);\n }\n onFormValueChange(stepIndex: number, ev: FormValueChangeEvent) {\n this._formValidity.set(stepIndex, ev.isValid);\n }\n formGroupFor(i: number): FormGroup | undefined {\n return this._formGroups.get(i);\n }\n computedCompleted(i: number, step: StepConfig): boolean {\n if (typeof step.completed === 'boolean') return step.completed;\n const v = this._formValidity.get(i);\n return v === true;\n }\n computedHasError(i: number, step: StepConfig): boolean {\n if (typeof step.hasError === 'boolean') return step.hasError;\n const v = this._formValidity.get(i);\n return v === false;\n }\n onChildWidgetEvent(stepIndex: number, wd: WidgetDefinition, e: { sourceId: string; output?: string; payload?: any }) {\n this.widgetEvent.emit({ stepIndex, stepId: this.steps()[stepIndex]?.id, sourceId: e.sourceId, output: e.output, payload: e.payload });\n }\n\n isStepEmpty(step: StepConfig): boolean {\n const hasForm = !!step.form;\n const hasWidgets = Array.isArray(step.widgets) && step.widgets.length > 0;\n return !hasForm && !hasWidgets;\n }\n\n openEditor(): void {\n const cfg = this._config() || { steps: [], orientation: 'horizontal', headerPosition: 'top', linear: false };\n const ref = this.settings.open({\n id: 'praxis-stepper-editor',\n title: 'Configurar Stepper',\n content: { component: PraxisStepperConfigEditor, inputs: { config: cfg } },\n });\n const apply = (value: any) => {\n const nextCfg: StepperMetadata = value?.config || value;\n if (nextCfg) {\n // Deep clone to ensure change detection and avoid mutating editor instance\n const cloned = JSON.parse(JSON.stringify(nextCfg)) as StepperMetadata;\n this._config.set(cloned);\n // Clamp selection after changes\n const sel = typeof cloned.selectedIndex === 'number' ? cloned.selectedIndex : this._selectedIndex();\n this._selectedIndex.set(this.clampIndex(sel));\n }\n };\n ref.applied$.subscribe(apply);\n ref.saved$.subscribe(apply);\n }\n\n // CTA helpers\n addFirstStep(): void {\n const current = this._config() || { steps: [], orientation: 'horizontal', headerPosition: 'top', linear: false };\n if ((current.steps || []).length > 0) return;\n const next: StepperMetadata = {\n ...current,\n steps: [\n { id: 'step1', label: 'Etapa 1', description: 'Clique em Configurar para editar esta etapa.' },\n ],\n };\n this._config.set(next);\n // Seleciona a primeira etapa\n this._selectedIndex.set(0);\n }\n\n // Navegação com validação remota opcional\n async onNext(i: number): Promise<void> {\n // Em modo linear, bloquear quando inválido\n if (this.linear() && this._formValidity.get(i) === false) {\n return;\n }\n const step = this.steps()[i];\n const fg = this._formGroups.get(i);\n const data = fg?.getRawValue();\n if (this.serverValidate) {\n const res = await this.serverValidate({ step, stepIndex: i, formGroup: fg, formData: data });\n if (!res.ok) {\n this.applyServerErrors(fg, res.fieldErrors, res.formErrors);\n // Atualizar erro visual\n step.errorMessage = res.errorMessage || (res.formErrors && res.formErrors[0]) || 'Erro de validação';\n this._formValidity.set(i, false);\n return;\n }\n }\n this.next();\n }\n onPrev(): void { this.prev(); }\n\n onAnimationDone(): void { this.animationDone.emit(); }\n\n private applyServerErrors(fg?: FormGroup, fieldErrors?: Record<string, string[]>, formErrors?: string[]): void {\n if (!fg) return;\n if (fieldErrors) {\n for (const [key, messages] of Object.entries(fieldErrors)) {\n const ctrl = fg.get(key);\n if (ctrl) {\n const prev = ctrl.errors || {};\n ctrl.setErrors({ ...prev, server: messages });\n ctrl.markAsTouched();\n }\n }\n }\n if (formErrors && formErrors.length) {\n const prev = fg.errors || {};\n fg.setErrors({ ...prev, server: formErrors });\n }\n fg.updateValueAndValidity({ emitEvent: true });\n }\n}\n","import { ComponentDocMeta, ComponentMetadataRegistry } from '@praxisui/core';\nimport { ENVIRONMENT_INITIALIZER, Provider } from '@angular/core';\nimport { PraxisStepper } from './praxis-stepper';\n\nexport const PRAXIS_STEPPER_COMPONENT_METADATA: ComponentDocMeta = {\n id: 'praxis-stepper',\n selector: 'praxis-stepper',\n component: PraxisStepper,\n friendlyName: 'Praxis Stepper',\n description: 'Stepper configurável (horizontal/vertical/linear) com passos e conteúdo dinâmico.',\n icon: 'format_list_numbered',\n inputs: [\n { name: 'config', type: 'StepperMetadata', label: 'Configuração', description: 'Configuração JSON com passos e opções' },\n { name: 'selectedIndex', type: 'number', label: '[(selectedIndex)] Índice selecionado' },\n { name: 'selectedIndexInput', type: 'number', label: 'Índice selecionado (legacy)' },\n { name: 'disableRippleInput', type: 'boolean', default: false, label: 'Desabilitar ripple' },\n { name: 'labelPosition', type: \"'bottom' | 'end'\", label: 'Posição do rótulo (horizontal)' },\n { name: 'color', type: 'ThemePalette', label: 'Cor (M2)' },\n { name: 'appearance', type: '{ themeClass?: string; tokens?: Record<string,string>; icons?: { number?: string; done?: string; edit?: string; error?: string }; iconsSet?: string }', label: 'Aparência (tokens, themeClass, ícones, conjunto)' },\n { name: 'serverValidate', type: '(args) => Promise<{ ok: boolean; fieldErrors?: Record<string,string[]>; formErrors?: string[] }>', label: 'Validação remota (opt-in)' },\n { name: 'density', type: \"'default' | 'comfortable' | 'compact'\", label: 'Densidade' },\n { name: 'stepperClass', type: 'string', label: 'Classe CSS (stepper)' },\n { name: 'headerClass', type: 'string', label: 'Classe CSS (header)' },\n { name: 'contentClass', type: 'string', label: 'Classe CSS (conteúdo)' },\n { name: 'navigation', type: \"{ visible?: boolean; prevLabel?: string; nextLabel?: string; prevIcon?: string; nextIcon?: string; variant?: 'basic'|'flat'|'stroked'|'raised'; color?: ThemePalette; align?: 'start'|'center'|'end'|'space-between' }\", label: 'Navegação (botões)'\n },\n ],\n outputs: [\n { name: 'selectionChange', type: 'any', label: 'Troca de seleção' },\n { name: 'selectedIndexChange', type: 'number', label: 'Índice selecionado (change)' },\n { name: 'animationDone', type: 'void', label: 'Animação concluída' },\n { name: 'widgetEvent', type: '{ stepId?: string; stepIndex?: number; sourceId: string; output?: string; payload?: any }', label: 'Evento interno' },\n ],\n tags: ['widget', 'container', 'stepper', 'configurable'],\n lib: '@praxisui/stepper',\n layoutHints: { recommendedCols: 8, recommendedRows: 6, minCols: 4, minRows: 4 },\n};\n\nexport function providePraxisStepperMetadata(): Provider {\n return {\n provide: ENVIRONMENT_INITIALIZER,\n multi: true,\n useFactory: (registry: ComponentMetadataRegistry) => () => {\n registry.register(PRAXIS_STEPPER_COMPONENT_METADATA);\n },\n deps: [ComponentMetadataRegistry],\n } as Provider;\n}\n","/*\n * Public API Surface of praxis-stepper\n */\n\nexport * from './lib/praxis-stepper';\nexport * from './lib/praxis-stepper.metadata';\nexport * from './lib/praxis-stepper-config-editor';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i5","i3","i4"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAsEa,gCAAgC,CAAA;AAYjC,IAAA,GAAA;AAXV,IAAA,KAAK,GAA4B;AAC/B,QAAA,KAAK,EAAE,EAAE;AACT,QAAA,IAAI,EAAE,EAAE;AACR,QAAA,YAAY,EAAE,EAAE;AAChB,QAAA,cAAc,EAAE,OAAO;AACvB,QAAA,cAAc,EAAE,IAAI;AACpB,QAAA,QAAQ,EAAE,KAAK;AACf,QAAA,QAAQ,EAAE,KAAK;KAChB;IAED,WAAA,CACU,GAA4E,EAC3D,IAAkD,EAAA;QADnE,IAAA,CAAA,GAAG,GAAH,GAAG;QAGX,IAAI,IAAI,EAAE,IAAI;AAAE,YAAA,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE;;IAG9D,MAAM,GAAA,EAAW,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;AAClC,IAAA,OAAO,GAAA,EAAW,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAnBlC,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,gCAAgC,8CAajC,eAAe,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAbd,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,gCAAgC,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mCAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA/CjC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkCT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,8LAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAnCS,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,sCAAA,EAAA,MAAA,EAAA,CAAA,IAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,8DAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,8DAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,yHAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,IAAA,EAAA,aAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,iBAAiB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,WAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,eAAA,EAAA,eAAA,EAAA,WAAA,EAAA,IAAA,EAAA,UAAA,EAAA,eAAA,EAAA,MAAA,EAAA,OAAA,EAAA,eAAA,EAAA,UAAA,EAAA,OAAA,EAAA,qBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,iOAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAgDjH,gCAAgC,EAAA,UAAA,EAAA,CAAA;kBAnD5C,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,mCAAmC,cACjC,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,kBAAkB,EAAE,cAAc,EAAE,iBAAiB,EAAE,eAAe,CAAC,EAAA,QAAA,EACnH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkCT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,8LAAA,CAAA,EAAA;;0BA0BE,MAAM;2BAAC,eAAe;;;MCuad,yBAAyB,CAAA;AACpC,IAAA,MAAM,GAAoB,EAAE,KAAK,EAAE,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE;IACxG,WAAW,GAAG,CAAC;;AAGf,IAAA,QAAQ,GAAG,IAAI,eAAe,CAAU,KAAK,CAAC;AAC9C,IAAA,QAAQ,GAAG,IAAI,eAAe,CAAU,IAAI,CAAC;AAC7C,IAAA,OAAO,GAAG,IAAI,eAAe,CAAU,KAAK,CAAC;AAE5B,IAAA,QAAQ,GAAG,MAAM,CAAC,oBAAoB,CAAC;AACvC,IAAA,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC;AAC1B,IAAA,UAAU,GAAsB,MAAM,CAAC,iBAAiB,CAAC;AAE1E,IAAA,WAAA,CAAyC,IAAU,EAAA;AACjD,QAAA,IAAI,IAAI,GAAyC,IAAI,EAAE,MAAM,IAAI,IAAI;;AAErE,QAAA,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;AAC5B,YAAA,IAAI;AAAE,gBAAA,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAoB;;AAAI,YAAA,MAAM;gBAAE,IAAI,GAAG,SAAS;;;AAE9E,QAAA,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;;AAEpC,YAAA,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAoB;AACjE,YAAA,IAAI,CAAC,KAAK,CAAC,OAAO,CAAE,IAAI,CAAC,MAAc,CAAC,KAAK,CAAC,EAAE;AAC7C,gBAAA,IAAI,CAAC,MAAc,CAAC,KAAK,GAAG,EAAkB;;;aAE5C;AACL,YAAA,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,CAAE,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAgB,CAAE;AAC1E,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;;;AAI5B,IAAA,SAAS,KAAW,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;IAE9D,QAAQ,GAAA;AACN,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AACzF,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;;;AAI3B,IAAA,IAAI,aAAa,GAAA;QACf,MAAM,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,KAAK,EAAS,CAAC;AAClD,QAAA,OAAO,GAAU;;AAEnB,IAAA,IAAI,UAAU,GAAA;QACZ,MAAM,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,KAAK,EAAS,CAAC;AACjD,QAAA,CAAC,EAAE,CAAC,MAAM,KAAK,EAAS;AACxB,QAAA,OAAO,EAAS;;AAGlB,IAAA,gBAAgB,GAAa;QAC3B,iBAAiB;QACjB,YAAY;QACZ,yBAAyB;QACzB,kCAAkC;QAClC,8BAA8B;QAC9B,8BAA8B;QAC9B,yCAAyC;QACzC,yCAAyC;QACzC,yCAAyC;QACzC,yCAAyC;QACzC,0CAA0C;QAC1C,0CAA0C;QAC1C,qCAAqC;QACrC,gCAAgC;QAChC,gCAAgC;QAChC,wBAAwB;QACxB,wBAAwB;QACxB,0BAA0B;QAC1B,uCAAuC;QACvC,yCAAyC;QACzC,qBAAqB;QACrB,eAAe;QACf,gCAAgC;QAChC,gCAAgC;QAChC,6CAA6C;QAC7C,6CAA6C;QAC7C,wCAAwC;KACzC;AAED,IAAA,kBAAkB,KAAW,IAAI,CAAC,SAAS,EAAE,CAAC;IAE9C,aAAa,CAAC,GAAW,EAAE,KAAa,EAAA;AACtC,QAAA,MAAM,MAAM,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,EAAE,CAAC;QACtE,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,OAAQ,MAAc,CAAC,GAAG,CAAC;;aACtB;AACJ,YAAA,MAAc,CAAC,GAAG,CAAC,GAAG,KAAK;;QAE9B,IAAI,CAAC,kBAAkB,EAAE;;IAG3B,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU;YAAE;QAC7B,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,GAAG,EAAS;QACzC,IAAI,CAAC,kBAAkB,EAAE;;AAG3B,IAAA,WAAW,CAAC,EAA2C,EAAA;AACrD,QAAA,MAAM,OAAO,GAA2C;AACtD,YAAA,OAAO,EAAE;AACP,gBAAA,iBAAiB,EAAE,uCAAuC;AAC1D,gBAAA,yBAAyB,EAAE,6BAA6B;AACxD,gBAAA,6CAA6C,EAAE,6BAA6B;AAC5E,gBAAA,6CAA6C,EAAE,MAAM;AACrD,gBAAA,YAAY,EAAE,mEAAmE;AAClF,aAAA;AACD,YAAA,OAAO,EAAE;AACP,gBAAA,iBAAiB,EAAE,6BAA6B;AAChD,gBAAA,yBAAyB,EAAE,gCAAgC;AAC3D,gBAAA,YAAY,EAAE,qCAAqC;AACpD,aAAA;AACD,YAAA,eAAe,EAAE;AACf,gBAAA,iBAAiB,EAAE,MAAM;AACzB,gBAAA,yBAAyB,EAAE,MAAM;AACjC,gBAAA,6CAA6C,EAAE,yCAAyC;AACxF,gBAAA,6CAA6C,EAAE,MAAM;AACrD,gBAAA,YAAY,EAAE,MAAM;AACrB,aAAA;SACF;QACD,MAAM,MAAM,GAAG,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE;AAChC,QAAA,MAAM,MAAM,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,EAAE,CAAC;AACtE,QAAA,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;AAC1C,YAAA,MAAc,CAAC,CAAC,CAAC,GAAG,CAAC;;QAExB,IAAI,CAAC,kBAAkB,EAAE;;IAG3B,WAAW,GAAA;QACT,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,IAAI,EAAE;QACnD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC7D,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,CAAA,CAAE,GAAG,OAAO;QACvG,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAA,EAAA,EAAK,CAAC,CAAA,EAAA,EAAK,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;AAC/D,QAAA,OAAO,CAAA,EAAG,QAAQ,CAAA,wCAAA,EAA2C,GAAG,YAAY;;;AAI9E,IAAA,IAAI,cAAc,GAAA;QAChB,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,eAAe,CAAC;AACrD,QAAA,IAAI,CAAC,GAAG;AAAE,YAAA,OAAO,SAAS;QAC1B,MAAM,CAAC,GAAG,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC;AACnC,QAAA,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS;;AAErC,IAAA,iBAAiB,CAAC,CAAyB,EAAA;AACzC,QAAA,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;QACnB,IAAI,CAAC,CAAC,EAAE;YACN,OAAQ,IAAI,CAAC,UAAU,CAAC,MAAc,CAAC,eAAe,CAAC;;aAClD;YACJ,IAAI,CAAC,UAAU,CAAC,MAAc,CAAC,eAAe,CAAC,GAAG,CAAA,EAAG,CAAC,CAAA,EAAA,CAAI;;QAE7D,IAAI,CAAC,kBAAkB,EAAE;;AAG3B,IAAA,IAAI,qBAAqB,GAAA;QACvB,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,wBAAwB,CAAC;AAC9D,QAAA,IAAI,CAAC,GAAG;AAAE,YAAA,OAAO,SAAS;QAC1B,MAAM,CAAC,GAAG,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC;AACnC,QAAA,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS;;AAErC,IAAA,wBAAwB,CAAC,CAAyB,EAAA;AAChD,QAAA,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;QACnB,IAAI,CAAC,CAAC,EAAE;YACN,OAAQ,IAAI,CAAC,UAAU,CAAC,MAAc,CAAC,wBAAwB,CAAC;;aAC3D;YACJ,IAAI,CAAC,UAAU,CAAC,MAAc,CAAC,wBAAwB,CAAC,GAAG,CAAA,EAAG,CAAC,CAAA,EAAA,CAAI;;QAEtE,IAAI,CAAC,kBAAkB,EAAE;;AAG3B,IAAA,IAAI,qBAAqB,GAAA;QACvB,OAAQ,IAAI,CAAC,UAAU,CAAC,MAAc,CAAC,0BAA0B,CAAC;;AAEpE,IAAA,wBAAwB,CAAC,CAAqB,EAAA;QAC5C,IAAI,CAAC,CAAC,EAAE;YACN,OAAQ,IAAI,CAAC,UAAU,CAAC,MAAc,CAAC,0BAA0B,CAAC;;aAC7D;YACJ,IAAI,CAAC,UAAU,CAAC,MAAc,CAAC,0BAA0B,CAAC,GAAG,CAAC;;QAEjE,IAAI,CAAC,kBAAkB,EAAE;;;AAI3B,IAAA,IAAI,KAAK,GAAA;AACP,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,UAAiB;AACjC,QAAA,EAAE,CAAC,KAAK,KAAK,EAAE;QACf,OAAO,EAAE,CAAC,KAAY;;IAGxB,MAAM,WAAW,CAAC,KAA8B,EAAA;QAC9C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAG,CAAC;QACpD,IAAI,MAAM,EAAE;AACV,YAAA,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,KAAK,EAAS,EAAE,KAAK,CAAC,GAAG,MAAM;YACtD,IAAI,CAAC,kBAAkB,EAAE;;;IAG7B,MAAM,QAAQ,CAAC,IAA0C,EAAA;QACvD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAG,CAAC;QACpD,IAAI,MAAM,EAAE;AACT,YAAA,IAAI,CAAC,KAAa,CAAC,IAAI,CAAC,GAAG,MAAM;YAClC,IAAI,CAAC,kBAAkB,EAAE;;;;AAKrB,IAAA,aAAa,CAAC,IAAa,EAAA;AACjC,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,OAAO,KAAK;;AAEvB,QAAA,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;AAAE,YAAA,OAAO,IAAI;QAC3C,IAAI,IAAI,KAAK,eAAe;AAAE,YAAA,OAAO,IAAI;AACzC,QAAA,OAAO,KAAK;;AAEd,IAAA,IAAI,qBAAqB,GAAA;AACvB,QAAA,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAa;AACjH,QAAA,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;;IAEnD,oBAAoB,GAAA;AAClB,QAAA,IAAI,CAAC,UAAU,CAAC,QAAQ,GAAG,2BAA2B;QACtD,IAAI,CAAC,kBAAkB,EAAE;;AAE3B,IAAA,IAAI,CAAC,EAA6B,EAAA;AAChC,QAAA,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,EAAE,EAAE,CAAC,YAAY,CAAC;QACrE,IAAI,CAAC,SAAS,EAAE;;IAElB,SAAS,CAAC,CAAS,EAAA,EAAU,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;AAClD,IAAA,mBAAmB,KAAW,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9H,OAAO,GAAA;QACL,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;QACtC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,CAAA,CAAE,EAAE,KAAK,EAAE,SAAS,CAAC,CAAA,CAAE,EAAE,CAAC;QAC/D,IAAI,CAAC,SAAS,EAAE;;AAElB,IAAA,UAAU,CAAC,GAAW,EAAA;QACpB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;QAChC,IAAI,CAAC,SAAS,EAAE;;;AAIlB,IAAA,IAAI,UAAU,GAAA,EAAwB,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC;AAC3F,IAAA,aAAa,GAAA,EAAyB,MAAM,CAAC,GAAG,IAAI,CAAC,UAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO;AAAE,QAAA,CAAC,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,OAAQ,CAAC;AACpH,IAAA,iBAAiB,CAAC,CAAmB,EAAA;AAAY,QAAA,QAAQ,CAAC,CAAC,EAAE;AAC3D,YAAA,KAAK,aAAa,EAAE,OAAO,iBAAiB;AAC5C,YAAA,KAAK,gCAAgC,EAAE,OAAO,gBAAgB;AAC9D,YAAA,KAAK,qBAAqB,EAAE,OAAO,oBAAoB;AACvD,YAAA,KAAK,qBAAqB,EAAE,OAAO,YAAY;AAC/C,YAAA,SAAS,OAAQ,CAAC,CAAC,MAAc,EAAE,KAAK,IAAK,CAAC,CAAC,MAAc,EAAE,KAAK,IAAI,QAAQ;;;AAGlF,IAAA,UAAU,CAAC,EAAmC,EAAA;AAC5C,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,EAAE;QAChC,eAAe,CAAC,GAAG,EAAE,EAAE,CAAC,aAAa,EAAE,EAAE,CAAC,YAAY,CAAC;QACvD,IAAI,CAAC,SAAS,EAAE;;AAElB,IAAA,YAAY,CAAC,GAAW,EAAA;AACtB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,EAAE;AAChC,QAAA,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;QAClB,IAAI,CAAC,SAAS,EAAE;;;IAIlB,WAAW,GAAA;AACT,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU;AAAE,QAAA,IAAI,CAAC,IAAI;YAAE;AACzC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAA,aAAA,EAAgB,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,WAAW,EAAE,EAAG,KAAK,EAAE,gCAAgC,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,6BAA6B,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,IAAI,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,QAAQ,EAAE,EAAE,EAAE,CAAC;AAC9T,QAAA,MAAM,KAAK,GAAG,CAAC,GAAQ,KAAI;AACzB,YAAA,MAAM,CAAC,GAAG,GAAG,IAAI,EAAE;YACnB,IAAI,CAAC,IAAI,GAAG;AACV,gBAAA,MAAM,EAAE,CAAC,CAAC,UAAU,IAAI,IAAI,CAAC,IAAI,EAAE,MAAM,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE;AAC7D,gBAAA,MAAM,EAAE,CAAC,EAAE,MAAM,IAAI,IAAI,CAAC,IAAI,EAAE,MAAM,IAAI,IAAI,CAAC,EAAE;AACjD,gBAAA,IAAI,EAAG,CAAC,EAAE,WAAW,EAAE,IAAY,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,QAAQ;aAC5D;YACR,IAAI,CAAC,SAAS,EAAE;AAClB,SAAC;AACD,QAAA,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC;AAC7B,QAAA,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC;;AAE7B,IAAA,YAAY,KAAW,IAAI,CAAC,WAAW,EAAE,CAAC;IAC1C,cAAc,GAAA,EAAW,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC;AAAE,QAAA,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;;IAGpG,gBAAgB,GAAA;AACd,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU;AAAE,QAAA,IAAI,CAAC,IAAI;YAAE;AACzC,QAAA,MAAM,OAAO,GAAQ,EAAE,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,aAAa,CAAC,EAAE,MAAM,EAAE,MAAM,IAAI,EAAE,CAAC,EAAE;;AAE1G,QAAA,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE;QAC5E,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,gBAAgB,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,WAAW,CAAA,CAAE,EAAE,KAAK,EAAE,4BAA4B,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,sBAAsB,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,IAAI,MAAM,EAAE,EAAE,EAAE,CAAC;AAClO,QAAA,MAAM,KAAK,GAAG,CAAC,GAAQ,KAAI;AACzB,YAAA,MAAM,GAAG,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,KAAK,OAAO;AACnD,YAAA,MAAM,EAAE,GAAqB,EAAE,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;AAC3E,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,EAAE;AAChC,YAAA,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACZ,IAAI,CAAC,SAAS,EAAE;AAClB,SAAC;AACD,QAAA,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC;AAC7B,QAAA,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC;;IAG7B,mBAAmB,GAAA;AACjB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU;AAAE,QAAA,IAAI,CAAC,IAAI;YAAE;QACzC,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gCAAgC,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAG,EAAE,CAAC;QAC7F,GAAG,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,CAAC,GAAwC,KAAI;AACvE,YAAA,IAAI,CAAC,GAAG;gBAAE;AACV,YAAA,MAAM,IAAI,GAAG;AACX,gBAAA,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,WAAW;AAC7B,gBAAA,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,SAAS;AAC7B,gBAAA,QAAQ,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ;AACxB,gBAAA,UAAU,EAAE,IAAI;AAChB,gBAAA,QAAQ,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ;AACxB,gBAAA,YAAY,EAAE,GAAG,CAAC,YAAY,IAAI,SAAS;AAC3C,gBAAA,cAAc,EAAE,GAAG,CAAC,cAAc,IAAI,OAAO;AAC7C,gBAAA,cAAc,EAAE,GAAG,CAAC,cAAc,IAAI,IAAI;AAC1C,gBAAA,MAAM,EAAE,MAAM;aACR;AACR,YAAA,MAAM,EAAE,GAAqB,EAAE,EAAE,EAAE,gCAAgC,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE;YACjG,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,IAAI,CAAC,SAAS,EAAE;AAClB,SAAC,CAAC;;IAGJ,cAAc,GAAA;AACZ,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU;AAAE,QAAA,IAAI,CAAC,IAAI;YAAE;AACzC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAA,eAAA,EAAkB,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,WAAW,CAAA,CAAE,EAAE,KAAK,EAAE,+BAA+B,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,6BAA6B,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC;AAClM,QAAA,MAAM,KAAK,GAAG,CAAC,GAAQ,KAAI;AACzB,YAAA,MAAM,EAAE,GAAqB,EAAE,EAAE,EAAE,qBAAqB,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,CAAA,EAAG,IAAI,CAAC,EAAE,IAAI,MAAM,CAAA,QAAA,EAAW,IAAI,CAAC,GAAG,EAAE,CAAA,CAAE,EAAE,EAAE;YAC7I,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,IAAI,CAAC,SAAS,EAAE;AAClB,SAAC;AACD,QAAA,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC;AAC7B,QAAA,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC;;IAG7B,kBAAkB,GAAA;AAChB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,+BAA+B,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,8BAA8B,EAAE,gBAAgB,EAAE,CAAC,qBAAqB,EAAE,aAAa,EAAE,gCAAgC,EAAE,qBAAqB,CAAC,EAAS,EAAE,CAAC;QAC5P,GAAG,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,CAAC,EAAsB,KAAI;AACrD,YAAA,IAAI,CAAC,EAAE;gBAAE;YACT,QAAQ,EAAE;AACR,gBAAA,KAAK,qBAAqB;oBAAE,IAAI,CAAC,WAAW,EAAE;oBAAE;AAChD,gBAAA,KAAK,aAAa;oBAAE,IAAI,CAAC,gBAAgB,EAAE;oBAAE;AAC7C,gBAAA,KAAK,gCAAgC;oBAAE,IAAI,CAAC,mBAAmB,EAAE;oBAAE;AACnE,gBAAA,KAAK,qBAAqB;oBAAE,IAAI,CAAC,cAAc,EAAE;oBAAE;AACnD,gBAAA;;oBAEE,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC;oBACjC,IAAI,CAAC,SAAS,EAAE;;AAEtB,SAAC,CAAC;;;IAIJ,WAAW,GAAA;AACT,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU;AAAE,QAAA,IAAI,CAAC,IAAI;YAAE;AACzC,QAAA,MAAM,GAAG,GAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;AAChE,QAAA,MAAM,EAAE,GAAqB,EAAE,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;QAC3E,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7B,IAAI,CAAC,SAAS,EAAE;;IAGlB,oBAAoB,GAAA;AAClB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU;AAAE,QAAA,IAAI,CAAC,IAAI;YAAE;;AAEzC,QAAA,MAAM,UAAU,GAAQ;AACtB,YAAA,QAAQ,EAAE;AACR,gBAAA,EAAE,IAAI,EAAE,CAAE,CAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,eAAe,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAE,CAAE;AAC7H;SACF;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,oBAAoB,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,WAAW,CAAA,CAAE,EAAE,KAAK,EAAE,mCAAmC,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,6BAA6B,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,IAAI,UAAU,EAAE,EAAE,EAAE,CAAC;AACnP,QAAA,MAAM,KAAK,GAAG,CAAC,GAAQ,KAAI;AACzB,YAAA,MAAM,CAAC,GAAG,GAAG,IAAI,EAAE;AACnB,YAAA,IAAI,CAAC,IAAI,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC,UAAU,IAAI,UAAU,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,IAAI,IAAI,CAAC,EAAE,EAAE,IAAI,EAAG,CAAC,EAAE,WAAW,EAAE,IAAY,IAAI,QAAQ,EAAS;YACxI,IAAI,CAAC,SAAS,EAAE;AAClB,SAAC;AACD,QAAA,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC;AAC7B,QAAA,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC;;IAG7B,UAAU,CAAC,CAAmB,EAAE,KAAa,EAAA;AAC3C,QAAA,QAAQ,CAAC,CAAC,EAAE;AACV,YAAA,KAAK,qBAAqB;;gBAExB,IAAI,CAAC,WAAW,EAAE;gBAClB;YACF,KAAK,aAAa,EAAE;gBAClB,MAAM,GAAG,GAAI,CAAC,CAAC,MAAc,EAAE,MAAM,IAAI,EAAE;AAC3C,gBAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU;AAAE,gBAAA,IAAI,CAAC,IAAI;oBAAE;gBACzC,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,gBAAgB,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,WAAW,CAAA,CAAE,EAAE,KAAK,EAAE,4BAA4B,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,sBAAsB,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,IAAI,MAAM,EAAE,EAAE,EAAE,CAAC;AAC9N,gBAAA,MAAM,KAAK,GAAG,CAAC,GAAQ,KAAI;AACzB,oBAAA,MAAM,IAAI,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,KAAK,GAAG;AAC/C,oBAAA,CAAC,CAAC,MAAc,GAAG,EAAE,IAAI,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE;oBACzD,IAAI,CAAC,SAAS,EAAE;AAClB,iBAAC;AACD,gBAAA,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC;AAC7B,gBAAA,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC;gBAC3B;;YACF,KAAK,gCAAgC,EAAE;gBACrC,MAAM,IAAI,GAAI,CAAC,CAAC,MAAc,EAAE,QAAQ,IAAI,EAAE;gBAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gCAAgC,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;gBACxG,GAAG,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,CAAC,GAAwC,KAAI;AACvE,oBAAA,IAAI,CAAC,GAAG;wBAAE;AACV,oBAAA,MAAM,IAAI,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE;AACjD,oBAAA,CAAC,CAAC,MAAc,GAAG,EAAE,IAAI,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;oBAC3D,IAAI,CAAC,SAAS,EAAE;AAClB,iBAAC,CAAC;gBACF;;YACF,KAAK,qBAAqB,EAAE;gBAC1B,MAAM,GAAG,GAAI,CAAC,CAAC,MAAc,EAAE,MAAM,IAAI,EAAE;AAC3C,gBAAA,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAA,mBAAA,CAAqB,EAAE,KAAK,EAAE,+BAA+B,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,6BAA6B,EAAE,MAAM,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,CAAC;AAChL,gBAAA,MAAM,KAAK,GAAG,CAAC,GAAQ,KAAI,EAAI,CAAC,CAAC,MAAc,GAAG,EAAE,IAAI,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,EAAE;AAC3G,gBAAA,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC;AAC7B,gBAAA,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC;gBAC3B;;AACF,YAAA;;gBAEE;;;;AAKN,IAAA,gBAAgB,KAAU,OAAO,IAAI,CAAC,MAAM,CAAC;IAC7C,MAAM,GAAA,EAAU,OAAO,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAC/C,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;AACvB,QAAA,IAAI;YACF,IAAI,CAAC,MAAM,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE;AAC5F,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;AACxB,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;;gBAChB;AACR,YAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;;;AAtajB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,yBAAyB,kBAahB,mBAAmB,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAb5B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,8BAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA3c1B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyZT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,yyFAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAzaC,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,iGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,0BAAA,EAAA,QAAA,EAAA,6GAAA,EAAA,MAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACX,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,IAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAClB,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,yHAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,IAAA,EAAA,aAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACb,mBAAmB,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACnB,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,iOAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,sFAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,oBAAoB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,eAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,OAAA,EAAA,UAAA,EAAA,eAAA,EAAA,UAAA,EAAA,SAAA,EAAA,UAAA,EAAA,qBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,cAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACpB,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,WAAA,EAAA,QAAA,EAAA,8BAAA,EAAA,MAAA,EAAA,CAAA,wBAAA,EAAA,iBAAA,EAAA,wBAAA,EAAA,IAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,4BAAA,EAAA,2BAAA,EAAA,0BAAA,EAAA,+BAAA,EAAA,2BAAA,EAAA,6BAAA,EAAA,sBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,oBAAA,EAAA,oBAAA,EAAA,mBAAA,EAAA,mBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,yBAAA,EAAA,iBAAA,EAAA,0BAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,cAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,cAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,uBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAChB,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,YAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,cAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,aAAA,EAAA,QAAA,EAAA,oCAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,aAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2DAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,YAAA,EAAA,QAAA,EAAA,kDAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,qBAAqB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,MAAA,EAAA,UAAA,EAAA,OAAA,EAAA,UAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,8BAAA,EAAA,gCAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,QAAA,CAAA,EAAA,QAAA,EAAA,CAAA,sBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,eAAA,EAAA,YAAA,EAAA,SAAA,EAAA,UAAA,EAAA,qBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,CAAA,EAAA,QAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACrB,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,MAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,OAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,WAAA,EAAA,IAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,WAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,oBAAA,EAAA,kBAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,qBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,mBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FA6cJ,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBA/drC,SAAS;+BACE,8BAA8B,EAAA,UAAA,EAC5B,IAAI,EAAA,OAAA,EACP;wBACP,YAAY;wBACZ,WAAW;wBACX,kBAAkB;wBAClB,cAAc;wBACd,aAAa;wBACb,mBAAmB;wBACnB,eAAe;wBACf,oBAAoB;wBACpB,cAAc;wBACd,gBAAgB;wBAChB,cAAc;wBACd,aAAa;wBACb,qBAAqB;wBACrB,eAAe;wBACf,aAAa;qBACd,EAAA,QAAA,EACS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyZT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,yyFAAA,CAAA,EAAA;;0BA+DY,MAAM;2BAAC,mBAAmB;;;MC5Q5B,aAAa,CAAA;;AAE6B,IAAA,YAAY;;AAEjE,IAAA,OAAO,GAAG,MAAM,CAAyB,IAAI,mDAAC;AACtC,IAAA,cAAc,GAAG,MAAM,CAAS,CAAC,0DAAC;AAClC,IAAA,WAAW,GAAG,IAAI,GAAG,EAAqB;AAC1C,IAAA,aAAa,GAAG,IAAI,GAAG,EAAmB;;IAGlD,UAAU,GAAG,EAAE,KAAK,EAAE,oBAAoB,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAkB,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC,UAAU,EAAE,EAAE;IACtH,aAAa,GAAG,CAAE,EAAE,KAAK,EAAE,yBAAyB,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC,YAAY,EAAE,EAAE,CAAE;;IAGxG,IAAa,MAAM,CAAC,CAAkC,EAAA;QACpD,IAAI,IAAI,GAA2B,IAAI;AACvC,QAAA,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE;AACzB,YAAA,IAAI;AAAE,gBAAA,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAoB;;AAAI,YAAA,MAAM;gBAAE,IAAI,GAAG,IAAI;;;aAC/D;YACL,IAAI,GAAG,CAA2B;;AAEpC,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACtB,QAAA,IAAI,IAAI,EAAE,aAAa,IAAI,IAAI;YAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC;;IAE9E,IAAa,kBAAkB,CAAC,CAAgB,EAAA;QAC9C,IAAI,CAAC,IAAI,IAAI;AAAE,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;;;IAG3C,IAAa,aAAa,CAAC,CAAgB,EAAA;QACzC,IAAI,CAAC,IAAI,IAAI;AAAE,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;;IAElC,kBAAkB,GAAG,KAAK;IAC1B,eAAe,GAAG,KAAK;;AAEvB,IAAA,aAAa;AACb,IAAA,KAAK;AACd;;AAEG;AACM,IAAA,cAAc;;AAKb,IAAA,mBAAmB,GAAG,IAAI,YAAY,EAAU;AAChD,IAAA,WAAW,GAAG,IAAI,YAAY,EAA6F;AAC5H,IAAA,cAAc;AACN,IAAA,QAAQ,GAAG,MAAM,CAAC,oBAAoB,CAAC;AAC9C,IAAA,aAAa,GAAG,IAAI,YAAY,EAAQ;;AAGlD,IAAA,KAAK,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,IAAI,EAAE,iDAAC;AACnD,IAAA,WAAW,GAAG,QAAQ,CAAkB,MAAM,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,IAAI,YAAY,uDAAC;AAC1F,IAAA,cAAc,GAAG,QAAQ,CAAqB,MAAM,IAAI,CAAC,OAAO,EAAE,EAAE,cAAc,IAAI,KAAK,0DAAC;;AAE5F,IAAA,QAAQ,GAAG,QAAQ,CAAmB,MAAM,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,IAAI,IAAI,CAAC,aAAa,IAAI,KAAK,oDAAC;AACzG,IAAA,MAAM,GAAG,QAAQ,CAAU,MAAM,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,kDAAC;AAC1D,IAAA,aAAa,GAAG,QAAQ,CAAU,MAAM,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,IAAI,IAAI,CAAC,kBAAkB,yDAAC;AACjG,IAAA,iBAAiB,GAAG,QAAQ,CAAS,MAAM,IAAI,CAAC,OAAO,EAAE,EAAE,iBAAiB,IAAI,OAAO,6DAAC;AACxF,IAAA,YAAY,GAAG,QAAQ,CAA2B,MAAM,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,IAAI,IAAI,CAAC,KAAK,wDAAC;AAC5F,IAAA,KAAK,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,KAAK,iDAAC;AACzD,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,QAAQ,oDAAC;;AAEvD,IAAA,GAAG,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,IAAI,EAAE,+CAAC;AAC9D,IAAA,UAAU,GAAG,MAAM,IAAI,CAAC,GAAG,EAAE,EAAE,OAAO,KAAK,KAAK,CAAC;AACjD,IAAA,UAAU,GAAG,OAAO,IAAI,CAAC,GAAG,EAAE,EAAE,OAAO,IAAI,QAAQ,CAA4C;AAC/F,IAAA,QAAQ,GAAG,OAAO,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,IAAI,SAAS,CAAiB;AACjE,IAAA,YAAY,GAAG,MAAM,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,IAAI,QAAQ;AACtD,IAAA,YAAY,GAAG,MAAM,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,IAAI,SAAS;IACvD,WAAW,GAAG,MAAM,IAAI,CAAC,GAAG,EAAE,EAAE,QAAQ;IACxC,WAAW,GAAG,MAAM,IAAI,CAAC,GAAG,EAAE,EAAE,QAAQ;IACxC,aAAa,GAAG,MAAK;QACnB,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,IAAI,KAAK;QACpC,QAAQ,CAAC;AACP,YAAA,KAAK,OAAO,EAAE,OAAO,iBAAiB;AACtC,YAAA,KAAK,QAAQ,EAAE,OAAO,kBAAkB;AACxC,YAAA,KAAK,eAAe,EAAE,OAAO,yBAAyB;AACtD,YAAA,KAAK,KAAK;AACV,YAAA,SAAS,OAAO,eAAe;;AAEnC,KAAC;AACD,IAAA,cAAc,CAAC,CAAS,EAAA;AACtB,QAAA,OAAO,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,KAAK;;AAErD,IAAA,UAAU,CAAC,GAAW,EAAA;QAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,MAAM;AAC/B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC;AAChC,QAAA,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC;AAAE,YAAA,OAAO,CAAC;AAC/B,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC;;AAExC,IAAA,qBAAqB,GAAG,QAAQ,CAAS,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,iEAAC;IACtF,YAAY,GAAG,MAAK;QAClB,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO;QACjC,IAAI,CAAC,KAAK,SAAS;AAAE,YAAA,OAAO,iBAAiB;QAC7C,IAAI,CAAC,KAAK,aAAa;AAAE,YAAA,OAAO,qBAAqB;AACrD,QAAA,OAAO,EAAE;AACX,KAAC;;AAGS,IAAA,eAAe,GAAG,IAAI,YAAY,EAAO;AACnD,IAAA,SAAS,GAAG,CAAC,CAAS,EAAE,CAAa,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;AACnD,IAAA,iBAAiB,CAAC,EAAO,EAAA;AACvB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,aAAa,IAAI,CAAC,CAAC;AACnD,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC;AAC5B,QAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC;AAClC,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;;;AAI/B,IAAA,IAAI,CAAC,KAAa,EAAA;QAChB,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;AACtC,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC;AAChC,QAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC;;IAExC,IAAI,GAAA;AACF,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE;QAClC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,MAAM;AAC/B,QAAA,IAAI,IAAI,GAAG,GAAG,GAAG,CAAC;AAAE,YAAA,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;;IAEzC,IAAI,GAAA;AACF,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE;QAClC,IAAI,IAAI,GAAG,CAAC;AAAE,YAAA,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;;IAEnC,KAAK,GAAA,EAAW,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;;AAG7B,IAAA,QAAQ,KAAW,IAAI,CAAC,IAAI,EAAE,CAAC;;IAG/B,WAAW,CAAC,SAAiB,EAAE,EAAkB,EAAA;QAC/C,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC;AAC7C,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC;;IAEvD,iBAAiB,CAAC,SAAiB,EAAE,EAAwB,EAAA;QAC3D,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,OAAO,CAAC;;AAE/C,IAAA,YAAY,CAAC,CAAS,EAAA;QACpB,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;;IAEhC,iBAAiB,CAAC,CAAS,EAAE,IAAgB,EAAA;AAC3C,QAAA,IAAI,OAAO,IAAI,CAAC,SAAS,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC,SAAS;QAC9D,MAAM,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;QACnC,OAAO,CAAC,KAAK,IAAI;;IAEnB,gBAAgB,CAAC,CAAS,EAAE,IAAgB,EAAA;AAC1C,QAAA,IAAI,OAAO,IAAI,CAAC,QAAQ,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC,QAAQ;QAC5D,MAAM,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;QACnC,OAAO,CAAC,KAAK,KAAK;;AAEpB,IAAA,kBAAkB,CAAC,SAAiB,EAAE,EAAoB,EAAE,CAAuD,EAAA;AACjH,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;;AAGvI,IAAA,WAAW,CAAC,IAAgB,EAAA;AAC1B,QAAA,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI;AAC3B,QAAA,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;AACzE,QAAA,OAAO,CAAC,OAAO,IAAI,CAAC,UAAU;;IAGhC,UAAU,GAAA;QACR,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE;AAC5G,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;AAC7B,YAAA,EAAE,EAAE,uBAAuB;AAC3B,YAAA,KAAK,EAAE,oBAAoB;AAC3B,YAAA,OAAO,EAAE,EAAE,SAAS,EAAE,yBAAyB,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;AAC3E,SAAA,CAAC;AACF,QAAA,MAAM,KAAK,GAAG,CAAC,KAAU,KAAI;AAC3B,YAAA,MAAM,OAAO,GAAoB,KAAK,EAAE,MAAM,IAAI,KAAK;YACvD,IAAI,OAAO,EAAE;;AAEX,gBAAA,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAoB;AACrE,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;;gBAExB,MAAM,GAAG,GAAG,OAAO,MAAM,CAAC,aAAa,KAAK,QAAQ,GAAG,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC,cAAc,EAAE;AACnG,gBAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;;AAEjD,SAAC;AACD,QAAA,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC;AAC7B,QAAA,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC;;;IAI7B,YAAY,GAAA;QACV,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE;QAChH,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,EAAE,MAAM,GAAG,CAAC;YAAE;AACtC,QAAA,MAAM,IAAI,GAAoB;AAC5B,YAAA,GAAG,OAAO;AACV,YAAA,KAAK,EAAE;gBACL,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,8CAA8C,EAAE;AAC/F,aAAA;SACF;AACD,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;;AAEtB,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;;;IAI5B,MAAM,MAAM,CAAC,CAAS,EAAA;;AAEpB,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE;YACxD;;QAEF,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC5B,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;AAClC,QAAA,MAAM,IAAI,GAAG,EAAE,EAAE,WAAW,EAAE;AAC9B,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;YACvB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAC5F,YAAA,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE;AACX,gBAAA,IAAI,CAAC,iBAAiB,CAAC,EAAE,EAAE,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,UAAU,CAAC;;gBAE3D,IAAI,CAAC,YAAY,GAAG,GAAG,CAAC,YAAY,KAAK,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,mBAAmB;gBACpG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC;gBAChC;;;QAGJ,IAAI,CAAC,IAAI,EAAE;;AAEb,IAAA,MAAM,KAAW,IAAI,CAAC,IAAI,EAAE,CAAC;IAE7B,eAAe,GAAA,EAAW,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;AAE5C,IAAA,iBAAiB,CAAC,EAAc,EAAE,WAAsC,EAAE,UAAqB,EAAA;AACrG,QAAA,IAAI,CAAC,EAAE;YAAE;QACT,IAAI,WAAW,EAAE;AACf,YAAA,KAAK,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE;gBACzD,MAAM,IAAI,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC;gBACxB,IAAI,IAAI,EAAE;AACR,oBAAA,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,IAAI,EAAE;AAC9B,oBAAA,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;oBAC7C,IAAI,CAAC,aAAa,EAAE;;;;AAI1B,QAAA,IAAI,UAAU,IAAI,UAAU,CAAC,MAAM,EAAE;AACnC,YAAA,MAAM,IAAI,GAAG,EAAE,CAAC,MAAM,IAAI,EAAE;AAC5B,YAAA,EAAE,CAAC,SAAS,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;;QAE/C,EAAE,CAAC,sBAAsB,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;;uGA7OrC,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAb,aAAa,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,KAAA,EAAA,OAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,EAAA,OAAA,EAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,WAAA,EAAA,aAAA,EAAA,aAAA,EAAA,eAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,cAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,cAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,IAAA,EAEc,WAAW,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EApKvC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+IT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,qkBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAhJS,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAD,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,gBAAgB,+oBAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,iOAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,wDAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,mBAAmB,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,iBAAiB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,cAAA,EAAA,YAAA,EAAA,MAAA,EAAA,QAAA,EAAA,cAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,QAAA,EAAA,YAAA,EAAA,OAAA,EAAA,6BAAA,EAAA,oBAAA,EAAA,8BAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,oBAAA,EAAA,wBAAA,EAAA,eAAA,EAAA,iBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,YAAA,EAAA,WAAA,EAAA,cAAA,EAAA,WAAA,EAAA,aAAA,EAAA,eAAA,EAAA,qBAAA,EAAA,uBAAA,EAAA,cAAA,EAAA,oBAAA,EAAA,oBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,4BAA4B,+KAAE,uBAAuB,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,OAAA,EAAA,aAAA,EAAA,eAAA,EAAA,kBAAA,EAAA,QAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAmKjL,aAAa,EAAA,UAAA,EAAA,CAAA;kBAtKzB,SAAS;+BACE,gBAAgB,EAAA,UAAA,EACd,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,eAAe,EAAE,aAAa,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,4BAA4B,EAAE,uBAAuB,CAAC,EAAA,QAAA,EACnL;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+IT,EAAA,eAAA,EAiBgB,uBAAuB,CAAC,MAAM,EAAA,MAAA,EAAA,CAAA,qkBAAA,CAAA,EAAA;8BAIM,YAAY,EAAA,CAAA;sBAAhE,YAAY;AAAC,gBAAA,IAAA,EAAA,CAAA,cAAc,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE;gBAYtC,MAAM,EAAA,CAAA;sBAAlB;gBAUY,kBAAkB,EAAA,CAAA;sBAA9B;gBAIY,aAAa,EAAA,CAAA;sBAAzB;gBAGQ,kBAAkB,EAAA,CAAA;sBAA1B;gBACQ,eAAe,EAAA,CAAA;sBAAvB;gBAEQ,aAAa,EAAA,CAAA;sBAArB;gBACQ,KAAK,EAAA,CAAA;sBAAb;gBAIQ,cAAc,EAAA,CAAA;sBAAtB;gBAKS,mBAAmB,EAAA,CAAA;sBAA5B;gBACS,WAAW,EAAA,CAAA;sBAApB;gBACQ,cAAc,EAAA,CAAA;sBAAtB;gBAES,aAAa,EAAA,CAAA;sBAAtB;gBAmDS,eAAe,EAAA,CAAA;sBAAxB;;;AC1VI,MAAM,iCAAiC,GAAqB;AACjE,IAAA,EAAE,EAAE,gBAAgB;AACpB,IAAA,QAAQ,EAAE,gBAAgB;AAC1B,IAAA,SAAS,EAAE,aAAa;AACxB,IAAA,YAAY,EAAE,gBAAgB;AAC9B,IAAA,WAAW,EAAE,mFAAmF;AAChG,IAAA,IAAI,EAAE,sBAAsB;AAC5B,IAAA,MAAM,EAAE;AACN,QAAA,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,uCAAuC,EAAE;QACxH,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,sCAAsC,EAAE;QACxF,EAAE,IAAI,EAAE,oBAAoB,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,6BAA6B,EAAE;AACpF,QAAA,EAAE,IAAI,EAAE,oBAAoB,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,oBAAoB,EAAE;QAC5F,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,kBAAkB,EAAE,KAAK,EAAE,gCAAgC,EAAE;QAC5F,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,UAAU,EAAE;QAC1D,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,uJAAuJ,EAAE,KAAK,EAAE,kDAAkD,EAAE;QAChP,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,kGAAkG,EAAE,KAAK,EAAE,2BAA2B,EAAE;QACxK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,uCAAuC,EAAE,KAAK,EAAE,WAAW,EAAE;QACtF,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,sBAAsB,EAAE;QACvE,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,qBAAqB,EAAE;QACrE,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,uBAAuB,EAAE;QACxE,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,wNAAwN,EAAE,KAAK,EAAE;AAC5P,SAAA;AACF,KAAA;AACD,IAAA,OAAO,EAAE;QACP,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,kBAAkB,EAAE;QACnE,EAAE,IAAI,EAAE,qBAAqB,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,6BAA6B,EAAE;QACrF,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,oBAAoB,EAAE;QACpE,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,2FAA2F,EAAE,KAAK,EAAE,gBAAgB,EAAE;AACpJ,KAAA;IACD,IAAI,EAAE,CAAC,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,cAAc,CAAC;AACxD,IAAA,GAAG,EAAE,mBAAmB;AACxB,IAAA,WAAW,EAAE,EAAE,eAAe,EAAE,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE;;SAGjE,4BAA4B,GAAA;IAC1C,OAAO;AACL,QAAA,OAAO,EAAE,uBAAuB;AAChC,QAAA,KAAK,EAAE,IAAI;AACX,QAAA,UAAU,EAAE,CAAC,QAAmC,KAAK,MAAK;AACxD,YAAA,QAAQ,CAAC,QAAQ,CAAC,iCAAiC,CAAC;SACrD;QACD,IAAI,EAAE,CAAC,yBAAyB,CAAC;KACtB;AACf;;AC/CA;;AAEG;;ACFH;;AAEG;;;;"}
|
package/index.d.ts
ADDED
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
import * as _angular_core from '@angular/core';
|
|
2
|
+
import { TemplateRef, EventEmitter, Provider } from '@angular/core';
|
|
3
|
+
import { FormGroup } from '@angular/forms';
|
|
4
|
+
import { FormConfig, WidgetDefinition, FormReadyEvent, FormValueChangeEvent, ComponentDocMeta } from '@praxisui/core';
|
|
5
|
+
import { ThemePalette } from '@angular/material/core';
|
|
6
|
+
import { CdkDragDrop } from '@angular/cdk/drag-drop';
|
|
7
|
+
import { BehaviorSubject } from 'rxjs';
|
|
8
|
+
import { SettingsValueProvider } from '@praxisui/settings-panel';
|
|
9
|
+
|
|
10
|
+
type StepOrientation = 'horizontal' | 'vertical';
|
|
11
|
+
type StepHeaderPosition = 'top' | 'bottom';
|
|
12
|
+
interface StepConfig {
|
|
13
|
+
id?: string;
|
|
14
|
+
label: string;
|
|
15
|
+
optional?: boolean;
|
|
16
|
+
editable?: boolean;
|
|
17
|
+
completed?: boolean;
|
|
18
|
+
hasError?: boolean;
|
|
19
|
+
stateIcon?: string;
|
|
20
|
+
state?: string;
|
|
21
|
+
errorMessage?: string;
|
|
22
|
+
ariaLabel?: string;
|
|
23
|
+
ariaLabelledby?: string;
|
|
24
|
+
form?: {
|
|
25
|
+
resourcePath?: string;
|
|
26
|
+
resourceId?: string | number;
|
|
27
|
+
mode?: 'create' | 'edit' | 'view';
|
|
28
|
+
config?: FormConfig;
|
|
29
|
+
schemaSource?: 'resource' | 'filter';
|
|
30
|
+
formId?: string;
|
|
31
|
+
};
|
|
32
|
+
widgets?: WidgetDefinition[];
|
|
33
|
+
description?: string;
|
|
34
|
+
}
|
|
35
|
+
interface StepperMetadata {
|
|
36
|
+
orientation?: StepOrientation;
|
|
37
|
+
linear?: boolean;
|
|
38
|
+
headerPosition?: StepHeaderPosition;
|
|
39
|
+
labelPosition?: 'bottom' | 'end';
|
|
40
|
+
color?: ThemePalette;
|
|
41
|
+
disableRipple?: boolean;
|
|
42
|
+
animationDuration?: string;
|
|
43
|
+
selectedIndex?: number;
|
|
44
|
+
steps: StepConfig[];
|
|
45
|
+
density?: 'default' | 'comfortable' | 'compact';
|
|
46
|
+
stepperClass?: string;
|
|
47
|
+
headerClass?: string;
|
|
48
|
+
contentClass?: string;
|
|
49
|
+
appearance?: {
|
|
50
|
+
themeClass?: string;
|
|
51
|
+
tokens?: Record<string, string>;
|
|
52
|
+
icons?: {
|
|
53
|
+
number?: string;
|
|
54
|
+
done?: string;
|
|
55
|
+
edit?: string;
|
|
56
|
+
error?: string;
|
|
57
|
+
};
|
|
58
|
+
iconsSet?: string;
|
|
59
|
+
};
|
|
60
|
+
navigation?: {
|
|
61
|
+
visible?: boolean;
|
|
62
|
+
prevLabel?: string;
|
|
63
|
+
nextLabel?: string;
|
|
64
|
+
prevIcon?: string;
|
|
65
|
+
nextIcon?: string;
|
|
66
|
+
variant?: 'basic' | 'flat' | 'stroked' | 'raised';
|
|
67
|
+
color?: ThemePalette;
|
|
68
|
+
align?: 'start' | 'center' | 'end' | 'space-between';
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
declare class PraxisStepper {
|
|
72
|
+
stepLabelTpl?: TemplateRef<any>;
|
|
73
|
+
_config: _angular_core.WritableSignal<StepperMetadata | null>;
|
|
74
|
+
private _selectedIndex;
|
|
75
|
+
private _formGroups;
|
|
76
|
+
private _formValidity;
|
|
77
|
+
primaryCta: {
|
|
78
|
+
label: string;
|
|
79
|
+
icon: string;
|
|
80
|
+
color: "primary";
|
|
81
|
+
action: () => void;
|
|
82
|
+
};
|
|
83
|
+
secondaryCtas: {
|
|
84
|
+
label: string;
|
|
85
|
+
icon: string;
|
|
86
|
+
action: () => void;
|
|
87
|
+
}[];
|
|
88
|
+
set config(c: StepperMetadata | string | null);
|
|
89
|
+
set selectedIndexInput(i: number | null);
|
|
90
|
+
set selectedIndex(i: number | null);
|
|
91
|
+
disableRippleInput: boolean;
|
|
92
|
+
editModeEnabled: boolean;
|
|
93
|
+
labelPosition?: 'bottom' | 'end';
|
|
94
|
+
color?: ThemePalette;
|
|
95
|
+
/**
|
|
96
|
+
* Validação remota opcional por etapa. Retorne ok=false com fieldErrors/formErrors para bloquear avanço.
|
|
97
|
+
*/
|
|
98
|
+
serverValidate?: (args: {
|
|
99
|
+
step: StepConfig;
|
|
100
|
+
stepIndex: number;
|
|
101
|
+
formGroup?: FormGroup;
|
|
102
|
+
formData?: any;
|
|
103
|
+
}) => Promise<{
|
|
104
|
+
ok: boolean;
|
|
105
|
+
fieldErrors?: Record<string, string[]>;
|
|
106
|
+
formErrors?: string[];
|
|
107
|
+
errorMessage?: string;
|
|
108
|
+
}>;
|
|
109
|
+
selectedIndexChange: EventEmitter<number>;
|
|
110
|
+
widgetEvent: EventEmitter<{
|
|
111
|
+
stepId?: string;
|
|
112
|
+
stepIndex?: number;
|
|
113
|
+
sourceId: string;
|
|
114
|
+
output?: string;
|
|
115
|
+
payload?: any;
|
|
116
|
+
}>;
|
|
117
|
+
stepperContext?: Record<string, any>;
|
|
118
|
+
private readonly settings;
|
|
119
|
+
animationDone: EventEmitter<void>;
|
|
120
|
+
steps: _angular_core.Signal<StepConfig[]>;
|
|
121
|
+
orientation: _angular_core.Signal<StepOrientation>;
|
|
122
|
+
headerPosition: _angular_core.Signal<StepHeaderPosition>;
|
|
123
|
+
labelPos: _angular_core.Signal<"bottom" | "end">;
|
|
124
|
+
linear: _angular_core.Signal<boolean>;
|
|
125
|
+
disableRipple: _angular_core.Signal<boolean>;
|
|
126
|
+
animationDuration: _angular_core.Signal<string>;
|
|
127
|
+
stepperColor: _angular_core.Signal<ThemePalette>;
|
|
128
|
+
icons: _angular_core.Signal<{
|
|
129
|
+
number?: string;
|
|
130
|
+
done?: string;
|
|
131
|
+
edit?: string;
|
|
132
|
+
error?: string;
|
|
133
|
+
} | undefined>;
|
|
134
|
+
iconsSet: _angular_core.Signal<string | undefined>;
|
|
135
|
+
private nav;
|
|
136
|
+
navVisible: () => boolean;
|
|
137
|
+
navVariant: () => "basic" | "flat" | "stroked" | "raised";
|
|
138
|
+
navColor: () => ThemePalette;
|
|
139
|
+
navPrevLabel: () => string;
|
|
140
|
+
navNextLabel: () => string;
|
|
141
|
+
navPrevIcon: () => string | undefined;
|
|
142
|
+
navNextIcon: () => string | undefined;
|
|
143
|
+
navAlignClass: () => "nav-align-start" | "nav-align-center" | "nav-align-space-between" | "nav-align-end";
|
|
144
|
+
isNextDisabled(i: number): boolean;
|
|
145
|
+
private clampIndex;
|
|
146
|
+
selectedIndexComputed: _angular_core.Signal<number>;
|
|
147
|
+
densityClass: () => "" | "density-compact" | "density-comfortable";
|
|
148
|
+
selectionChange: EventEmitter<any>;
|
|
149
|
+
trackStep: (_: number, s: StepConfig) => string | number;
|
|
150
|
+
onSelectionChange(ev: any): void;
|
|
151
|
+
goTo(index: number): void;
|
|
152
|
+
next(): void;
|
|
153
|
+
prev(): void;
|
|
154
|
+
reset(): void;
|
|
155
|
+
previous(): void;
|
|
156
|
+
onFormReady(stepIndex: number, ev: FormReadyEvent): void;
|
|
157
|
+
onFormValueChange(stepIndex: number, ev: FormValueChangeEvent): void;
|
|
158
|
+
formGroupFor(i: number): FormGroup | undefined;
|
|
159
|
+
computedCompleted(i: number, step: StepConfig): boolean;
|
|
160
|
+
computedHasError(i: number, step: StepConfig): boolean;
|
|
161
|
+
onChildWidgetEvent(stepIndex: number, wd: WidgetDefinition, e: {
|
|
162
|
+
sourceId: string;
|
|
163
|
+
output?: string;
|
|
164
|
+
payload?: any;
|
|
165
|
+
}): void;
|
|
166
|
+
isStepEmpty(step: StepConfig): boolean;
|
|
167
|
+
openEditor(): void;
|
|
168
|
+
addFirstStep(): void;
|
|
169
|
+
onNext(i: number): Promise<void>;
|
|
170
|
+
onPrev(): void;
|
|
171
|
+
onAnimationDone(): void;
|
|
172
|
+
private applyServerErrors;
|
|
173
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<PraxisStepper, never>;
|
|
174
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<PraxisStepper, "praxis-stepper", never, { "config": { "alias": "config"; "required": false; }; "selectedIndexInput": { "alias": "selectedIndexInput"; "required": false; }; "selectedIndex": { "alias": "selectedIndex"; "required": false; }; "disableRippleInput": { "alias": "disableRippleInput"; "required": false; }; "editModeEnabled": { "alias": "editModeEnabled"; "required": false; }; "labelPosition": { "alias": "labelPosition"; "required": false; }; "color": { "alias": "color"; "required": false; }; "serverValidate": { "alias": "serverValidate"; "required": false; }; "stepperContext": { "alias": "stepperContext"; "required": false; }; }, { "selectedIndexChange": "selectedIndexChange"; "widgetEvent": "widgetEvent"; "animationDone": "animationDone"; "selectionChange": "selectionChange"; }, ["stepLabelTpl"], ["*"], true, never>;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
declare const PRAXIS_STEPPER_COMPONENT_METADATA: ComponentDocMeta;
|
|
178
|
+
declare function providePraxisStepperMetadata(): Provider;
|
|
179
|
+
|
|
180
|
+
declare class PraxisStepperConfigEditor implements SettingsValueProvider {
|
|
181
|
+
config: StepperMetadata;
|
|
182
|
+
activeIndex: number;
|
|
183
|
+
isDirty$: BehaviorSubject<boolean>;
|
|
184
|
+
isValid$: BehaviorSubject<boolean>;
|
|
185
|
+
isBusy$: BehaviorSubject<boolean>;
|
|
186
|
+
private readonly settings;
|
|
187
|
+
private readonly dialog;
|
|
188
|
+
private readonly iconPicker;
|
|
189
|
+
constructor(data?: any);
|
|
190
|
+
markDirty(): void;
|
|
191
|
+
validate(): void;
|
|
192
|
+
get navigationCfg(): NonNullable<StepperMetadata['navigation']>;
|
|
193
|
+
get appearance(): NonNullable<StepperMetadata['appearance']>;
|
|
194
|
+
stepperTokenKeys: string[];
|
|
195
|
+
onAppearanceChange(): void;
|
|
196
|
+
onTokenChange(key: string, value: string): void;
|
|
197
|
+
clearTokens(): void;
|
|
198
|
+
applyPreset(id: 'primary' | 'neutral' | 'high-contrast'): void;
|
|
199
|
+
scssSnippet(): string;
|
|
200
|
+
get headerHeightPx(): number | undefined;
|
|
201
|
+
setHeaderHeightPx(v: number | string | null): void;
|
|
202
|
+
get headerLabelTextSizePx(): number | undefined;
|
|
203
|
+
setHeaderLabelTextSizePx(v: number | string | null): void;
|
|
204
|
+
get headerLabelTextWeight(): string | undefined;
|
|
205
|
+
setHeaderLabelTextWeight(v: string | undefined): void;
|
|
206
|
+
get icons(): NonNullable<NonNullable<StepperMetadata['appearance']>['icons']>;
|
|
207
|
+
pickNavIcon(field: 'prevIcon' | 'nextIcon'): Promise<void>;
|
|
208
|
+
pickIcon(kind: 'number' | 'done' | 'edit' | 'error'): Promise<void>;
|
|
209
|
+
private symbolsLikely;
|
|
210
|
+
get symbolsLikelySelected(): string[];
|
|
211
|
+
setIconsSetToSymbols(): void;
|
|
212
|
+
drop(ev: CdkDragDrop<StepConfig[]>): void;
|
|
213
|
+
setActive(i: number): void;
|
|
214
|
+
onActiveIndexChange(): void;
|
|
215
|
+
addStep(): void;
|
|
216
|
+
removeStep(idx: number): void;
|
|
217
|
+
get activeStep(): StepConfig | null;
|
|
218
|
+
ensureWidgets(): WidgetDefinition[];
|
|
219
|
+
displayWidgetName(w: WidgetDefinition): string;
|
|
220
|
+
dropWidget(ev: CdkDragDrop<WidgetDefinition[]>): void;
|
|
221
|
+
removeWidget(idx: number): void;
|
|
222
|
+
addMainForm(): void;
|
|
223
|
+
editMainForm(): void;
|
|
224
|
+
removeMainForm(): void;
|
|
225
|
+
addListSelection(): void;
|
|
226
|
+
addSearchableSelect(): void;
|
|
227
|
+
addFilesUpload(): void;
|
|
228
|
+
openMoreComponents(): void;
|
|
229
|
+
addTreeList(): void;
|
|
230
|
+
addTransferListQuick(): void;
|
|
231
|
+
editWidget(w: WidgetDefinition, index: number): void;
|
|
232
|
+
getSettingsValue(): any;
|
|
233
|
+
onSave(): any;
|
|
234
|
+
reset(): void;
|
|
235
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<PraxisStepperConfigEditor, never>;
|
|
236
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<PraxisStepperConfigEditor, "praxis-stepper-config-editor", never, {}, {}, never, never, true, never>;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
export { PRAXIS_STEPPER_COMPONENT_METADATA, PraxisStepper, PraxisStepperConfigEditor, providePraxisStepperMetadata };
|
|
240
|
+
export type { StepConfig, StepHeaderPosition, StepOrientation, StepperMetadata };
|
package/package.json
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@praxisui/stepper",
|
|
3
|
+
"version": "1.0.0-beta.17",
|
|
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": "^1.0.0-beta.17",
|
|
10
|
+
"@praxisui/dynamic-form": "^1.0.0-beta.17",
|
|
11
|
+
"@praxisui/settings-panel": "^1.0.0-beta.17",
|
|
12
|
+
"@praxisui/list": "^1.0.0-beta.17",
|
|
13
|
+
"@praxisui/files-upload": "^1.0.0-beta.17",
|
|
14
|
+
"@praxisui/page-builder": "^1.0.0-beta.17"
|
|
15
|
+
},
|
|
16
|
+
"dependencies": {
|
|
17
|
+
"tslib": "^2.3.0"
|
|
18
|
+
},
|
|
19
|
+
"license": "Apache-2.0",
|
|
20
|
+
"publishConfig": {
|
|
21
|
+
"access": "public"
|
|
22
|
+
},
|
|
23
|
+
"repository": {
|
|
24
|
+
"type": "git",
|
|
25
|
+
"url": "https://github.com/codexrodrigues/praxis-ui-angular"
|
|
26
|
+
},
|
|
27
|
+
"homepage": "https://github.com/codexrodrigues/praxis-ui-angular#readme",
|
|
28
|
+
"bugs": {
|
|
29
|
+
"url": "https://github.com/codexrodrigues/praxis-ui-angular/issues"
|
|
30
|
+
},
|
|
31
|
+
"sideEffects": false,
|
|
32
|
+
"module": "fesm2022/praxisui-stepper.mjs",
|
|
33
|
+
"typings": "index.d.ts",
|
|
34
|
+
"exports": {
|
|
35
|
+
"./package.json": {
|
|
36
|
+
"default": "./package.json"
|
|
37
|
+
},
|
|
38
|
+
".": {
|
|
39
|
+
"types": "./index.d.ts",
|
|
40
|
+
"default": "./fesm2022/praxisui-stepper.mjs"
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|