@praxisui/ai 8.0.0-beta.84 → 8.0.0-beta.86

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.
@@ -6818,7 +6818,7 @@ class PraxisAiAssistantComponent {
6818
6818
  return 'Erro ao comunicar com a IA. Tente novamente.';
6819
6819
  }
6820
6820
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisAiAssistantComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6821
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: PraxisAiAssistantComponent, isStandalone: true, selector: "praxis-ai-assistant", inputs: { adapter: "adapter", riskPolicy: "riskPolicy", allowManualPatchEdit: "allowManualPatchEdit", hasBackdrop: "hasBackdrop" }, viewQueries: [{ propertyName: "overlayOrigin", first: true, predicate: CdkOverlayOrigin, descendants: true }, { propertyName: "triggerButton", first: true, predicate: ["triggerBtn"], descendants: true, read: ElementRef }, { propertyName: "inputElement", first: true, predicate: ["inputEl"], descendants: true }], ngImport: i0, template: "<!-- Trigger Button -->\n<button\n mat-icon-button\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n #triggerBtn\n (click)=\"open()\"\n [disabled]=\"isOpen\"\n class=\"ai-trigger-btn\"\n matTooltip=\"Assistente de Configura\u00E7\u00E3o\"\n aria-label=\"Abrir Assistente IA\">\n <mat-icon>auto_awesome</mat-icon>\n</button>\n\n<!-- Overlay Template -->\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"isOpen\"\n [cdkConnectedOverlayHasBackdrop]=\"hasBackdrop\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayPush]=\"true\"\n [cdkConnectedOverlayViewportMargin]=\"12\"\n cdkConnectedOverlayPanelClass=\"ai-assistant-overlay-pane\"\n cdkConnectedOverlayBackdropClass=\"ai-assistant-backdrop\"\n (backdropClick)=\"close()\"\n (overlayOutsideClick)=\"close()\"\n (detach)=\"close()\">\n\n <div\n class=\"ai-assistant-panel\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Assistente de Configura\u00E7\u00E3o\"\n [attr.aria-busy]=\"isBusyState() ? 'true' : null\"\n [cdkTrapFocus]=\"hasBackdrop\"\n [cdkTrapFocusAutoCapture]=\"hasBackdrop\"\n (keydown)=\"onKeydown($event)\"\n >\n\n <!-- HEADER -->\n <div class=\"assistant-header\">\n <div class=\"assistant-header__left\">\n <mat-icon class=\"magic-icon\">auto_awesome</mat-icon>\n <div class=\"assistant-title-group\">\n <div class=\"assistant-title\">Assistente de Configura\u00E7\u00E3o</div>\n <div class=\"assistant-subtitle\">Copiloto contextual para ajustes guiados</div>\n <div class=\"assistant-header-chips\">\n <span\n class=\"mode-chip\"\n [class.mock]=\"mockMode\"\n [matTooltip]=\"mockMode ? 'Sem chave de API: respostas de demonstra\u00E7\u00E3o' : 'Conectado ao assistente configurado'\"\n >\n {{ mockMode ? 'Mock' : 'Conectado' }}\n </span>\n <span\n class=\"policy-chip\"\n [class.strict]=\"isStrictRiskPolicy()\"\n [matTooltip]=\"getRiskPolicyTooltip()\"\n >\n {{ getRiskPolicyLabel() }}\n </span>\n </div>\n </div>\n </div>\n <div class=\"assistant-header__right\">\n <button\n mat-icon-button\n type=\"button\"\n class=\"assistant-close-btn\"\n (click)=\"close()\"\n aria-label=\"Fechar assistente\"\n matTooltip=\"Fechar assistente\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </div>\n </div>\n <div\n class=\"assistant-status\"\n [class.processing]=\"isBusyState()\"\n [class.pending]=\"state === 'clarification'\"\n [class.warning]=\"state === 'error'\"\n [class.success]=\"state === 'review' || state === 'success'\"\n [class.compact]=\"!shouldShowSystemStatusDetail()\"\n role=\"status\"\n [attr.aria-live]=\"getSystemStatusAriaLive()\"\n aria-atomic=\"true\"\n >\n <span class=\"assistant-status-dot\" aria-hidden=\"true\"></span>\n <div class=\"assistant-status-content\">\n <div class=\"assistant-status-label\">\n <span class=\"assistant-status-label-prefix\">Status:</span>\n <span>{{ getSystemStatusLabel() }}</span>\n @if (shouldShowSnapshotFallbackBadge()) {\n <span class=\"assistant-status-mode\">Snapshot</span>\n }\n </div>\n @if (shouldShowSystemStatusDetail()) {\n <div class=\"assistant-status-detail\">{{ getSystemStatusDetail() }}</div>\n }\n </div>\n </div>\n @if (shouldShowTaskFlow()) {\n <div class=\"assistant-flow\" role=\"list\" aria-label=\"Fluxo da proposta\">\n @for (step of flowSteps; track step) {\n <div\n class=\"flow-step\"\n role=\"listitem\"\n [class.active]=\"getFlowStepState(step.step) === 'active'\"\n [class.done]=\"getFlowStepState(step.step) === 'done'\"\n >\n <span class=\"flow-step-index\">{{ step.step }}</span>\n <span class=\"flow-step-content\">\n <span class=\"flow-step-label\">{{ step.label }}</span>\n <span class=\"flow-step-detail\">{{ getFlowStepDetail(step.step) }}</span>\n </span>\n </div>\n }\n </div>\n }\n <div class=\"assistant-nav\">\n <div\n class=\"assistant-tabs\"\n role=\"tablist\"\n aria-label=\"Se\u00E7\u00F5es do assistente\"\n (keydown)=\"onTabsKeydown($event)\"\n >\n @if (isTaskMode()) {\n <button\n class=\"assistant-tab\"\n type=\"button\"\n id=\"assistant-tab-task\"\n role=\"tab\"\n aria-label=\"Proposta atual\"\n [attr.aria-selected]=\"isActiveTab('task')\"\n aria-controls=\"assistant-panel-task\"\n [attr.tabindex]=\"isActiveTab('task') ? 0 : -1\"\n [class.active]=\"isActiveTab('task')\"\n (click)=\"setActiveTab('task')\"\n >\n Proposta\n @if (hasPendingClarification() && !isActiveTab('task')) {\n <span class=\"assistant-tab-badge\">1</span>\n }\n </button>\n }\n <button\n class=\"assistant-tab\"\n type=\"button\"\n id=\"assistant-tab-chat\"\n role=\"tab\"\n aria-label=\"Hist\u00F3rico\"\n [attr.aria-selected]=\"isActiveTab('chat')\"\n aria-controls=\"assistant-panel-chat\"\n [attr.tabindex]=\"isActiveTab('chat') ? 0 : -1\"\n [class.active]=\"isActiveTab('chat')\"\n (click)=\"setActiveTab('chat')\"\n >\n Hist\u00F3rico\n </button>\n <button\n class=\"assistant-tab\"\n type=\"button\"\n id=\"assistant-tab-suggestions\"\n role=\"tab\"\n aria-label=\"Sugest\u00F5es de melhoria\"\n [attr.aria-selected]=\"isActiveTab('suggestions')\"\n aria-controls=\"assistant-panel-suggestions\"\n [attr.tabindex]=\"isActiveTab('suggestions') ? 0 : -1\"\n [class.active]=\"isActiveTab('suggestions')\"\n (click)=\"setActiveTab('suggestions')\"\n >\n Sugest\u00F5es\n </button>\n </div>\n </div>\n\n <!-- BODY: Dynamic Content based on State -->\n <div class=\"assistant-body\">\n @if (shouldShowThoughtCard()) {\n <div class=\"assistant-thought assistant-section\">\n <div class=\"assistant-thought-meta\">\n <mat-icon>psychology</mat-icon>\n <span>{{ getThoughtTimingLabel() }}</span>\n </div>\n <div class=\"assistant-thought-summary\">{{ getThoughtSummary() }}</div>\n <div class=\"assistant-thought-plan\">\n <div class=\"assistant-thought-plan-title\">{{ getThoughtPlanTitle() }}</div>\n <div class=\"assistant-thought-plan-actions\">\n <button\n mat-stroked-button\n type=\"button\"\n class=\"thought-action-details\"\n (click)=\"openThoughtDetails()\"\n [attr.aria-label]=\"getThoughtDetailsLabel()\"\n [matTooltip]=\"getThoughtDetailsTooltip()\"\n >\n {{ getThoughtDetailsLabel() }}\n </button>\n @if (shouldShowThoughtPreviewAction()) {\n <button\n mat-flat-button\n color=\"primary\"\n type=\"button\"\n class=\"thought-action-preview\"\n (click)=\"openThoughtPreview()\"\n [matTooltip]=\"getThoughtPreviewTooltip()\"\n >\n Pr\u00E9via\n </button>\n }\n </div>\n <div class=\"assistant-thought-plan-hint\">{{ getThoughtActionHint() }}</div>\n @if (getThoughtChecklist(); as thoughtChecklist) {\n @if (thoughtChecklist.length) {\n <div class=\"assistant-thought-checklist\">\n @for (item of thoughtChecklist; track item) {\n <div class=\"assistant-thought-checklist-item\">\n <mat-icon>radio_button_unchecked</mat-icon>\n <span>{{ item }}</span>\n </div>\n }\n </div>\n }\n @if (isBusyState() && !thoughtChecklist.length) {\n <div class=\"assistant-thought-shimmer\">\n <div class=\"shimmer-line shimmer-line-1\"></div>\n <div class=\"shimmer-line shimmer-line-2\"></div>\n <div class=\"shimmer-line shimmer-line-3\"></div>\n </div>\n }\n }\n </div>\n </div>\n }\n @if (processingInfoVisible) {\n <div class=\"processing-banner\">\n <mat-spinner diameter=\"16\"></mat-spinner>\n <span>{{ aiExplanation || 'Analisando solicita\u00E7\u00E3o e preparando proposta...' }}</span>\n <button mat-button type=\"button\" class=\"processing-retry\" (click)=\"retryProcessing()\">Tentar novamente</button>\n </div>\n }\n @if (historyContext && isActiveTab('chat')) {\n <div\n class=\"assistant-history assistant-section\"\n id=\"assistant-panel-chat\"\n role=\"tabpanel\"\n aria-labelledby=\"assistant-tab-chat\"\n >\n <div class=\"section-header\">\n <div class=\"section-heading\">\n <div class=\"section-title\">Hist\u00F3rico</div>\n <div class=\"section-subtitle\">Sess\u00F5es recentes, pedidos reaproveit\u00E1veis e desfazer r\u00E1pido.</div>\n </div>\n <div class=\"history-actions\" role=\"group\" aria-label=\"A\u00E7\u00F5es do hist\u00F3rico\">\n <button\n mat-stroked-button\n type=\"button\"\n class=\"history-action-btn\"\n (click)=\"historyExpanded = !historyExpanded\"\n [matTooltip]=\"historyExpanded ? 'Recolher hist\u00F3rico' : 'Expandir hist\u00F3rico'\"\n [attr.aria-label]=\"historyExpanded ? 'Recolher hist\u00F3rico' : 'Expandir hist\u00F3rico'\"\n [disabled]=\"!historyWarnings.length && !historySessions.length && !activeHistoryMessages.length\"\n >\n <mat-icon>{{ historyExpanded ? 'expand_less' : 'expand_more' }}</mat-icon>\n <span>{{ historyExpanded ? 'Recolher' : 'Expandir' }}</span>\n </button>\n <button\n mat-stroked-button\n type=\"button\"\n class=\"history-action-btn\"\n (click)=\"startNewSession()\"\n matTooltip=\"Nova conversa\"\n aria-label=\"Nova conversa\"\n [disabled]=\"isBusyState()\"\n >\n <mat-icon>add_comment</mat-icon>\n <span>Nova conversa</span>\n </button>\n <button\n mat-stroked-button\n type=\"button\"\n (click)=\"clearHistory()\"\n matTooltip=\"Limpar hist\u00F3rico local\"\n aria-label=\"Limpar hist\u00F3rico local\"\n class=\"history-action-btn history-action-btn--danger\"\n [disabled]=\"!historySessions.length\"\n >\n <mat-icon>delete_outline</mat-icon>\n <span>Limpar</span>\n </button>\n </div>\n </div>\n @if (historyUndoDeleteSession) {\n <div class=\"history-undo\">\n <span>Sess\u00E3o removida.</span>\n <button mat-button type=\"button\" (click)=\"undoRemoveHistorySession()\">\n Desfazer\n </button>\n </div>\n }\n @if (historyExpanded && historyWarnings.length) {\n <div class=\"history-warnings\">\n <mat-icon>info</mat-icon>\n <div class=\"history-warnings-list\">\n @for (warning of historyWarnings; track warning) {\n <div>{{ warning }}</div>\n }\n <div class=\"history-warnings-hint\">\n Configure headers via API_CONFIG_STORAGE_OPTIONS no host.\n </div>\n </div>\n </div>\n }\n @if (historyExpanded && historySessions.length) {\n <div class=\"history-sessions\">\n @for (session of historySessions; track session) {\n <div\n class=\"history-session\"\n role=\"button\"\n tabindex=\"0\"\n (click)=\"selectHistorySession(session.id)\"\n (keydown)=\"onHistorySessionCardKeydown($event, session.id)\"\n [class.active]=\"session.id === activeHistorySession?.id\"\n [matTooltip]=\"getHistorySessionTooltip(session)\"\n [matTooltipDisabled]=\"!session.componentType && !session.componentId\"\n >\n <div class=\"history-session-main\">\n <span class=\"history-session-title\">{{ session.title }}</span>\n <div class=\"history-session-main-right\">\n <span class=\"history-session-time\">{{ session.updatedAt | date:'short' }}</span>\n <div class=\"history-session-tools\">\n <button\n mat-icon-button\n type=\"button\"\n class=\"history-session-tool\"\n (click)=\"reuseHistorySessionPrompt(session.id, $event)\"\n matTooltip=\"Reusar \u00FAltimo pedido\"\n aria-label=\"Reusar \u00FAltimo pedido\"\n >\n <mat-icon>edit_note</mat-icon>\n </button>\n <button\n mat-icon-button\n type=\"button\"\n class=\"history-session-tool history-session-tool--danger\"\n (click)=\"removeHistorySession(session.id, $event)\"\n matTooltip=\"Excluir sess\u00E3o\"\n aria-label=\"Excluir sess\u00E3o\"\n >\n <mat-icon>delete_outline</mat-icon>\n </button>\n </div>\n </div>\n </div>\n <div class=\"history-session-meta\">\n @if (session.componentType) {\n <span class=\"history-chip\">{{ session.componentType }}</span>\n }\n @if (session.componentId) {\n <span class=\"history-chip\">{{ session.componentId }}</span>\n }\n </div>\n </div>\n }\n </div>\n }\n @if (historyExpanded && !historySessions.length) {\n <div class=\"history-empty\">\n Nenhuma sess\u00E3o salva ainda.\n </div>\n }\n @if (historyExpanded && activeHistoryMessages.length) {\n <div class=\"history-messages\">\n @if (activeHistoryTotalMessages > activeHistoryMessages.length) {\n <div\n class=\"history-messages-hint\"\n >\n Mostrando \u00FAltimas {{ activeHistoryMessages.length }} de {{ activeHistoryTotalMessages }} mensagens.\n </div>\n }\n @for (msg of activeHistoryMessages; track msg) {\n <div\n class=\"history-message\"\n [class.user]=\"msg.role === 'user'\"\n [class.assistant]=\"msg.role === 'assistant'\"\n >\n <div class=\"history-message-header\">\n <span class=\"history-message-role\">{{ msg.role === 'user' ? 'Voc\u00EA' : 'Assistente' }}</span>\n <span class=\"history-message-time\">{{ msg.createdAt | date:'shortTime' }}</span>\n @if (msg.context?.usedRag) {\n <span\n class=\"history-rag\"\n matTooltip=\"Resposta baseada em contexto recuperado (RAG)\"\n >RAG</span>\n }\n </div>\n <div class=\"history-message-text\">{{ msg.text }}</div>\n </div>\n }\n </div>\n }\n @if (historyExpanded && historySessions.length && !activeHistoryMessages.length) {\n <div class=\"history-empty history-empty--panel\">\n Selecione uma sess\u00E3o para visualizar as mensagens.\n </div>\n }\n @if (historyExpanded) {\n <div class=\"history-helper\">\n O hist\u00F3rico \u00E9 local ao usu\u00E1rio e ao componente atual.\n </div>\n }\n </div>\n }\n\n @if (loadingSuggestions && isActiveTab('suggestions')) {\n <div\n class=\"loading-suggestions assistant-section\"\n id=\"assistant-panel-suggestions\"\n role=\"tabpanel\"\n aria-labelledby=\"assistant-tab-suggestions\"\n >\n <mat-spinner diameter=\"20\"></mat-spinner>\n <span>Carregando sugest\u00F5es de melhoria...</span>\n </div>\n }\n\n <!-- STATE: LISTENING (Suggestions) -->\n @if (state === 'listening' && isActiveTab('suggestions')) {\n <div\n class=\"suggestions-area assistant-section\"\n id=\"assistant-panel-suggestions\"\n role=\"tabpanel\"\n aria-labelledby=\"assistant-tab-suggestions\"\n >\n <div class=\"section-header\">\n <div class=\"section-title\">Sugest\u00F5es de melhoria</div>\n <div class=\"suggestions-actions\">\n <button mat-icon-button type=\"button\" (click)=\"refreshSuggestions()\" [disabled]=\"loadingSuggestions\" matTooltip=\"Atualizar sugest\u00F5es\">\n <mat-icon>refresh</mat-icon>\n </button>\n </div>\n </div>\n @if (!loadingSuggestions) {\n <div class=\"suggestions-hero\">\n <div class=\"suggestions-hero__label\">Contexto ativo</div>\n <div class=\"suggestions-hero__title\">{{ adapter.componentName || 'Componente atual' }}</div>\n <div class=\"suggestions-hero__detail\">{{ getSystemStatusDetail() }}</div>\n </div>\n }\n @if (suggestionsWarnings.length) {\n <div class=\"warnings-area\">\n <mat-icon class=\"warnings-icon\">warning_amber</mat-icon>\n <div class=\"warnings-content\">\n <div class=\"warnings-title\">Avisos</div>\n <div class=\"warnings-list\">\n @for (warning of suggestionsWarnings; track warning) {\n <div>{{ warning }}</div>\n }\n </div>\n </div>\n </div>\n }\n @if (!loadingSuggestions && (richSuggestions.length || hasDismissedSuggestions())) {\n <div class=\"suggestions-content\">\n @if (hasDismissedSuggestions()) {\n <div class=\"suggestions-filter\">\n <span>{{ getDismissedSuggestionCount() }} oculta(s)</span>\n <button mat-button type=\"button\" (click)=\"restoreDismissedSuggestions()\">\n Restaurar\n </button>\n </div>\n }\n @if (getVisibleSuggestions().length) {\n <div class=\"suggestions-list\">\n @for (sug of getVisibleSuggestions(); track sug) {\n <div\n class=\"suggestion-item\"\n role=\"button\"\n tabindex=\"0\"\n [attr.aria-label]=\"'Selecionar sugest\u00E3o: ' + sug.label\"\n (click)=\"selectSuggestion(sug)\"\n (keydown)=\"onSuggestionCardKeydown($event, sug)\"\n >\n <div class=\"suggestion-copy\">\n <div class=\"suggestion-main\">\n @if (sug.icon) {\n <mat-icon class=\"suggestion-icon\">{{ sug.icon }}</mat-icon>\n }\n <span class=\"suggestion-label\">{{ sug.label }}</span>\n @if (sug.group) {\n <span class=\"suggestion-group\">{{ sug.group }}</span>\n }\n </div>\n @if (sug.description) {\n <div class=\"suggestion-desc\">{{ sug.description }}</div>\n }\n </div>\n <div class=\"suggestion-actions\">\n <span class=\"suggestion-arrow\" aria-hidden=\"true\">\n <mat-icon>chevron_right</mat-icon>\n </span>\n <button\n mat-icon-button\n type=\"button\"\n class=\"suggestion-action-btn\"\n (click)=\"prepareSuggestionPrompt(sug, $event)\"\n matTooltip=\"Refinar pedido\"\n aria-label=\"Refinar pedido\"\n >\n <mat-icon>edit</mat-icon>\n </button>\n <button\n mat-icon-button\n type=\"button\"\n class=\"suggestion-action-btn suggestion-action-btn--danger\"\n (click)=\"dismissSuggestion(sug, $event)\"\n matTooltip=\"Ocultar sugest\u00E3o\"\n aria-label=\"Ocultar sugest\u00E3o\"\n >\n <mat-icon>visibility_off</mat-icon>\n </button>\n </div>\n </div>\n }\n </div>\n } @else {\n <div class=\"suggestions-empty suggestions-empty--inline\">\n Todas as sugest\u00F5es foram ocultadas.\n </div>\n }\n </div>\n }\n @if (!loadingSuggestions && !richSuggestions.length) {\n <div class=\"suggestions-empty\">\n Nenhuma sugest\u00E3o dispon\u00EDvel no momento.\n </div>\n }\n @if (!loadingSuggestions && !richSuggestions.length) {\n <div class=\"suggestions-helper\">\n Selecione uma sugest\u00E3o acima ou descreva uma altera\u00E7\u00E3o no campo inferior.\n </div>\n }\n </div>\n }\n\n <!-- STATE: CLARIFICATION (Two-Step Flow) -->\n @if (state === 'clarification' && isActiveTab('task')) {\n <div\n class=\"clarification-area assistant-card\"\n id=\"assistant-panel-task\"\n role=\"tabpanel\"\n aria-labelledby=\"assistant-tab-task\"\n >\n @if (!shouldShowThoughtCard()) {\n <div class=\"task-header\">\n <div class=\"task-title\">{{ getTaskTitle() }}</div>\n <div class=\"task-subtitle\">{{ getTaskSubtitle() }}</div>\n @if (clarificationOptions.length > 1 && getTaskSelectionSummary(); as selectionSummary) {\n <div class=\"task-meta\">\n <span class=\"task-meta-label\">Selecionado:</span>\n <span class=\"task-meta-value\">{{ selectionSummary }}</span>\n </div>\n }\n @if (shouldShowTaskSteps()) {\n <div class=\"task-steps\">\n <span class=\"task-step active\">1 Dados</span>\n <span class=\"task-step\">2 Layout</span>\n <span class=\"task-step\">3 Revis\u00E3o</span>\n </div>\n }\n </div>\n }\n @if (clarificationResponseType === 'context') {\n <div class=\"context-only\">\n <mat-spinner diameter=\"24\"></mat-spinner>\n <div class=\"context-only-hint\">Buscando contexto adicional...</div>\n </div>\n }\n <ng-template #clarificationOptionContent let-opt let-index=\"index\" let-compact=\"compact\">\n @if (!compact) {\n <div class=\"clarification-decision-head\">\n <span class=\"clarification-decision-index\">{{ index + 1 }}</span>\n <span class=\"clarification-decision-type\">{{ getClarificationOptionKindLabel(opt) }}</span>\n <span class=\"spacer\"></span>\n @if (isClarificationSelected(opt)) {\n <span class=\"clarification-decision-state\">Selecionado</span>\n }\n </div>\n }\n @switch (getClarificationOptionLayout(opt)) {\n @case ('endpoint') {\n <div class=\"clarification-card\">\n <div class=\"clarification-card-header\">\n <mat-icon class=\"endpoint-icon\">{{ getEndpointIcon(opt) }}</mat-icon>\n @if (getEndpointMethod(opt); as method) {\n <span class=\"endpoint-method\" [attr.data-method]=\"method\">{{ method }}</span>\n }\n <span class=\"endpoint-label\">{{ opt.label }}</span>\n <span class=\"spacer\"></span>\n <mat-icon class=\"select-indicator\">\n {{ isClarificationSelected(opt) ? 'check_circle' : 'radio_button_unchecked' }}\n </mat-icon>\n </div>\n <div class=\"clarification-card-body\">\n @if (getEndpointPath(opt); as path) {\n <div class=\"endpoint-path\">{{ path }}</div>\n }\n @if (opt.contextHints?.description) {\n <div\n class=\"endpoint-description\"\n [matTooltip]=\"getDescriptionTooltip(opt)\"\n [matTooltipDisabled]=\"!shouldShowDescriptionTooltip(opt)\"\n >\n {{ opt.contextHints?.description }}\n </div>\n }\n </div>\n </div>\n }\n @case ('color') {\n <div class=\"clarification-color\">\n <span\n class=\"color-swatch\"\n [style.background]=\"getSafeHexColor(opt) || 'var(--md-sys-color-surface-container-highest)'\"\n ></span>\n <div class=\"color-meta\">\n <span class=\"color-label\">{{ opt.label }}</span>\n @if (opt.contextHints?.hexColor) {\n <span class=\"color-value\">{{ opt.contextHints?.hexColor }}</span>\n }\n </div>\n </div>\n }\n @case ('description') {\n <div class=\"clarification-description\">\n <span class=\"clarification-label\">{{ opt.label }}</span>\n @if (opt.contextHints?.description) {\n <span\n class=\"clarification-subtitle\"\n [matTooltip]=\"getDescriptionTooltip(opt)\"\n [matTooltipDisabled]=\"!shouldShowDescriptionTooltip(opt)\"\n >\n {{ opt.contextHints?.description }}\n </span>\n }\n </div>\n }\n @default {\n <span class=\"clarification-plain-label\">{{ opt.label }}</span>\n }\n }\n </ng-template>\n @if (warnings.length) {\n <div class=\"warnings-area\">\n <mat-icon class=\"warnings-icon\">warning_amber</mat-icon>\n <div class=\"warnings-content\">\n <div class=\"warnings-title\">Avisos</div>\n <div class=\"warnings-list\">\n @for (warning of warnings; track warning) {\n <div>{{ warning }}</div>\n }\n </div>\n </div>\n </div>\n }\n @if (clarificationQuestions.length) {\n <div\n class=\"clarification-questions\"\n [class.attention-highlight]=\"highlightClarificationDetails && !clarificationOptions.length\"\n >\n @for (question of clarificationQuestions; track question; let i = $index) {\n <div class=\"clarification-question\">\n <div class=\"clarification-question-label\">{{ question }}</div>\n <input\n type=\"text\"\n [(ngModel)]=\"clarificationAnswers[i]\"\n [placeholder]=\"'Resposta ' + (i + 1)\"\n autocomplete=\"off\">\n </div>\n }\n </div>\n }\n @if (clarificationOptions.length) {\n <div\n class=\"clarification-options-block\"\n [class.attention-highlight]=\"highlightClarificationDetails\"\n >\n <div class=\"clarification-options-title\">\n {{ clarificationOptions.length === 1 ? 'Decis\u00E3o sugerida' : 'Decis\u00F5es sugeridas' }}\n </div>\n @if (clarificationOptions.length === 1) {\n <div class=\"clarification-options-hint\">\n Etapa 2 de 4: confirme a melhor op\u00E7\u00E3o para continuar.\n </div>\n }\n @if (clarificationOptions.length > 1) {\n <div class=\"clarification-options-hint\">\n Etapa 2 de 4: selecione a alternativa mais aderente para gerar a proposta.\n </div>\n }\n @if (clarificationResponseType === 'confirm') {\n <div\n class=\"clarification-buttons\"\n [class.list]=\"clarificationPresentation === 'list'\"\n >\n @for (opt of clarificationOptions; track opt; let i = $index) {\n <button\n mat-button\n type=\"button\"\n (click)=\"onClarificationOptionClick(opt)\"\n class=\"clarification-option\"\n [class.selected]=\"isClarificationSelected(opt)\"\n [matTooltip]=\"getClarificationTooltip(opt)\"\n [matTooltipDisabled]=\"!shouldShowClarificationTooltip(opt) || isEndpointOption(opt)\"\n >\n <ng-container *ngTemplateOutlet=\"clarificationOptionContent; context: { $implicit: opt, index: i, compact: false }\"></ng-container>\n </button>\n }\n </div>\n }\n @if (clarificationSelectionMode === 'multiple') {\n <div\n class=\"clarification-buttons\"\n [class.list]=\"clarificationPresentation === 'list'\"\n >\n @for (opt of clarificationOptions; track opt; let i = $index) {\n <button\n mat-button\n type=\"button\"\n (click)=\"onClarificationOptionClick(opt)\"\n [class.selected]=\"isClarificationSelected(opt)\"\n class=\"clarification-option\"\n [matTooltip]=\"getClarificationTooltip(opt)\"\n [matTooltipDisabled]=\"!shouldShowClarificationTooltip(opt) || isEndpointOption(opt)\"\n >\n <ng-container *ngTemplateOutlet=\"clarificationOptionContent; context: { $implicit: opt, index: i, compact: false }\"></ng-container>\n </button>\n }\n </div>\n }\n @if (clarificationResponseType !== 'confirm' && clarificationSelectionMode === 'single' && clarificationPresentation !== 'chips') {\n <div\n class=\"clarification-buttons\"\n [class.list]=\"clarificationPresentation === 'list'\"\n >\n @for (opt of clarificationOptions; track opt; let i = $index) {\n <button\n mat-button\n type=\"button\"\n (click)=\"onClarificationOptionClick(opt)\"\n class=\"clarification-option\"\n [class.selected]=\"isClarificationSelected(opt)\"\n [matTooltip]=\"getClarificationTooltip(opt)\"\n [matTooltipDisabled]=\"!shouldShowClarificationTooltip(opt) || isEndpointOption(opt)\"\n >\n <ng-container *ngTemplateOutlet=\"clarificationOptionContent; context: { $implicit: opt, index: i, compact: false }\"></ng-container>\n </button>\n }\n </div>\n }\n @if (clarificationResponseType !== 'confirm' && clarificationSelectionMode === 'single' && clarificationPresentation === 'chips') {\n <div\n class=\"clarification-chips\"\n >\n @for (opt of clarificationOptions; track opt; let i = $index) {\n @if (isEndpointOption(opt)) {\n <button\n mat-button\n type=\"button\"\n class=\"clarification-option clarification-card-button\"\n (click)=\"onClarificationOptionClick(opt)\"\n [class.selected]=\"isClarificationSelected(opt)\"\n [matTooltip]=\"getClarificationTooltip(opt)\"\n [matTooltipDisabled]=\"!shouldShowClarificationTooltip(opt) || isEndpointOption(opt)\"\n >\n <ng-container *ngTemplateOutlet=\"clarificationOptionContent; context: { $implicit: opt, index: i, compact: false }\"></ng-container>\n </button>\n } @else {\n <mat-chip\n (click)=\"onClarificationOptionClick(opt)\"\n [matTooltip]=\"getClarificationTooltip(opt)\"\n [matTooltipDisabled]=\"!shouldShowClarificationTooltip(opt)\"\n class=\"clarification-chip\"\n >\n <ng-container *ngTemplateOutlet=\"clarificationOptionContent; context: { $implicit: opt, index: i, compact: true }\"></ng-container>\n </mat-chip>\n }\n }\n </div>\n }\n </div>\n }\n @if (clarificationAllowCustom && clarificationResponseType !== 'context') {\n <div\n class=\"clarification-manual-toggle\"\n >\n <span class=\"clarification-manual-label\">N\u00E3o encontrou o recurso?</span>\n <button mat-button type=\"button\" (click)=\"toggleManualInput()\">\n {{ showManualInput ? 'Ocultar resposta manual' : 'Responder manualmente' }}\n </button>\n </div>\n }\n @if (clarificationAllowCustom && showManualInput && clarificationResponseType !== 'context') {\n <div\n class=\"clarification-free\"\n >\n <input\n type=\"text\"\n [(ngModel)]=\"clarificationFreeText\"\n placeholder=\"Digite sua resposta\u2026\"\n autocomplete=\"off\"\n (keydown.enter)=\"confirmTaskAction()\"\n />\n </div>\n }\n @if (clarificationAllowCustom && showManualInput && clarificationResponseType !== 'context') {\n <div\n class=\"clarification-free-hint\"\n >\n Pressione Enter para enviar.\n </div>\n }\n </div>\n }\n\n <!-- STATE: REVIEW (Diff/Explanation) -->\n @if (state === 'review' && isActiveTab('task')) {\n <div\n class=\"review-area assistant-card\"\n id=\"assistant-panel-task\"\n role=\"tabpanel\"\n aria-labelledby=\"assistant-tab-task\"\n >\n @if (!shouldShowThoughtCard()) {\n <div class=\"task-header\">\n <div class=\"task-title\">{{ getTaskTitle() }}</div>\n <div class=\"task-subtitle\">{{ getTaskSubtitle() }}</div>\n @if (clarificationOptions.length > 1 && getTaskSelectionSummary(); as selectionSummary) {\n <div class=\"task-meta\">\n <span class=\"task-meta-label\">Selecionado:</span>\n <span class=\"task-meta-value\">{{ selectionSummary }}</span>\n </div>\n }\n @if (shouldShowTaskSteps()) {\n <div class=\"task-steps\">\n <span class=\"task-step\">1 Dados</span>\n <span class=\"task-step\">2 Layout</span>\n <span class=\"task-step active\">3 Revis\u00E3o</span>\n </div>\n }\n </div>\n }\n @if (warnings.length) {\n <div class=\"warnings-area\">\n <mat-icon class=\"warnings-icon\">warning_amber</mat-icon>\n <div class=\"warnings-content\">\n <div class=\"warnings-title\">Avisos</div>\n <div class=\"warnings-list\">\n @for (warning of warnings; track warning) {\n <div>{{ warning }}</div>\n }\n </div>\n </div>\n </div>\n }\n <div class=\"review-trust\">\n <span class=\"trust-chip\" [matTooltip]=\"getScopeTooltip()\">{{ getScopeLabel() }}</span>\n <span class=\"trust-chip\" [matTooltip]=\"getConfidenceTooltip()\">{{ getConfidenceLabel() }}</span>\n <span class=\"trust-chip risk-chip\" [class.medium]=\"getReviewRiskLevel() === 'm\u00E9dio'\" [class.high]=\"getReviewRiskLevel() === 'alto'\">\n Risco {{ getReviewRiskLevel() }}\n </span>\n </div>\n <div class=\"review-summary\" [class.attention-highlight]=\"highlightReviewDetails\">\n <div class=\"review-summary-title\">Resumo da proposta</div>\n <div class=\"review-summary-line\">{{ getReviewSummary() }}</div>\n </div>\n <div class=\"review-diff\">\n <div class=\"review-diff-title\">Pr\u00E9via de mudan\u00E7as</div>\n @if (pendingDiff.length) {\n <div class=\"review-diff-summary\">\n @for (line of getDiffSummaryLines(); track line) {\n <div class=\"review-diff-line\">{{ line }}</div>\n }\n @if (pendingDiff.length > 3) {\n <div class=\"review-diff-more\">\u2026 +{{ pendingDiff.length - 3 }} mudan\u00E7as</div>\n }\n </div>\n <button mat-stroked-button type=\"button\" class=\"review-diff-toggle\" (click)=\"toggleFullDiff()\">\n {{ getDiffToggleLabel() }}\n </button>\n } @else {\n <div class=\"review-diff-empty\">\n N\u00E3o foi poss\u00EDvel gerar um diff estruturado. Revise o resumo e aplique com cautela.\n </div>\n }\n @if (showFullDiff && pendingDiff.length) {\n <div class=\"review-diff-full\">\n @for (diff of pendingDiff; track diff) {\n <div class=\"review-diff-block\">\n <div class=\"review-diff-path\">{{ diff.path }}</div>\n <div class=\"review-diff-label\">Antes:</div>\n <pre>{{ diff.before | json }}</pre>\n <div class=\"review-diff-label\">Depois:</div>\n <pre>{{ diff.after | json }}</pre>\n </div>\n }\n </div>\n }\n </div>\n @if (aiExplanation.trim()) {\n <div class=\"ai-explanation\">\n {{ aiExplanation }}\n </div>\n }\n </div>\n }\n\n <!-- STATE: ERROR -->\n @if (state === 'error' && (isActiveTab('task') || (!isTaskMode() && isActiveTab('suggestions')))) {\n <div\n class=\"error-area assistant-card\"\n [attr.id]=\"isTaskMode() ? 'assistant-panel-task' : 'assistant-panel-suggestions'\"\n role=\"tabpanel\"\n [attr.aria-labelledby]=\"isTaskMode() ? 'assistant-tab-task' : 'assistant-tab-suggestions'\"\n >\n <div class=\"error-msg\">\n <mat-icon color=\"warn\">error_outline</mat-icon>\n <span>{{ errorMsg }}</span>\n </div>\n @if (warnings.length) {\n <div class=\"warnings-area\">\n <mat-icon class=\"warnings-icon\">warning_amber</mat-icon>\n <div class=\"warnings-content\">\n <div class=\"warnings-title\">Avisos</div>\n <div class=\"warnings-list\">\n @for (warning of warnings; track warning) {\n <div>{{ warning }}</div>\n }\n </div>\n </div>\n </div>\n }\n @if (shouldShowApplyDetails()) {\n <div class=\"apply-details\">\n <div class=\"apply-details-header\">\n <div class=\"apply-details-title\">Detalhes da aplica\u00E7\u00E3o</div>\n @if (allowManualPatchEdit) {\n <div class=\"apply-details-actions\">\n <button mat-button type=\"button\" (click)=\"togglePatchPathEditor()\" [disabled]=\"!pendingPatch\">\n {{ patchPathEditorExpanded ? 'Ocultar paths' : 'Editar por path' }}\n </button>\n <button mat-button type=\"button\" (click)=\"togglePatchEditor()\" [disabled]=\"!pendingPatch\">\n {{ patchEditorExpanded ? 'Ocultar editor' : 'Editar patch' }}\n </button>\n </div>\n }\n </div>\n @if (lastApplyAt) {\n <div class=\"apply-details-meta\">\n \u00DAltima tentativa: {{ lastApplyAt | date:'short' }}\n </div>\n }\n @if (getApplyPaths().length) {\n <div class=\"apply-paths\">\n @for (path of getApplyPaths(); track path) {\n <span class=\"apply-path-chip\">{{ path }}</span>\n }\n </div>\n }\n @if (applyWarnings.length) {\n <div class=\"apply-warnings\">\n <div class=\"apply-warnings-title\">Avisos da aplica\u00E7\u00E3o</div>\n <div class=\"apply-warnings-list\">\n @for (warning of applyWarnings; track warning) {\n <div>{{ warning }}</div>\n }\n </div>\n </div>\n }\n @if (allowManualPatchEdit && patchPathEditorExpanded) {\n <div class=\"patch-path-editor\">\n <div class=\"patch-editor-label\">Editar por path</div>\n <div class=\"patch-editor-hint\">Texto simples vira string; para for\u00E7ar texto em true/false/n\u00FAmero, use aspas.</div>\n @if (!getEditablePatchPathEdits().length) {\n <div class=\"patch-path-editor-empty\">\n Nenhum path edit\u00E1vel dispon\u00EDvel para este patch.\n </div>\n }\n @if (getEditablePatchPathEdits().length) {\n <div class=\"patch-path-rows\">\n @for (edit of getEditablePatchPathEdits(); track edit; let i = $index) {\n <div class=\"patch-path-row\">\n <div class=\"patch-path-label\">{{ edit.path }}</div>\n <input\n type=\"text\"\n [(ngModel)]=\"patchPathEdits[i].valueText\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n />\n @if (patchPathEdits[i].error) {\n <div class=\"patch-editor-error\">{{ patchPathEdits[i].error }}</div>\n }\n </div>\n }\n </div>\n }\n @if (patchPathEditorError) {\n <div class=\"patch-editor-error\">{{ patchPathEditorError }}</div>\n }\n <div class=\"patch-editor-actions\">\n <button mat-button type=\"button\" (click)=\"resetPatchPathEdits()\">\n Restaurar valores\n </button>\n <button mat-button type=\"button\" (click)=\"applyPathEditsToPatch()\">\n Aplicar no patch\n </button>\n <button mat-flat-button color=\"primary\" type=\"button\" (click)=\"reapplyPathEdits()\">\n Reaplicar por path\n </button>\n </div>\n </div>\n }\n @if (allowManualPatchEdit && patchEditorExpanded) {\n <div class=\"patch-editor\">\n <label class=\"patch-editor-label\">Patch JSON</label>\n <textarea\n [(ngModel)]=\"patchEditorText\"\n spellcheck=\"false\"\n ></textarea>\n @if (patchEditorError) {\n <div class=\"patch-editor-error\">{{ patchEditorError }}</div>\n }\n <div class=\"patch-editor-actions\">\n <button mat-button type=\"button\" (click)=\"resetPatchEditor()\">\n Restaurar original\n </button>\n <button mat-flat-button color=\"primary\" type=\"button\" (click)=\"reapplyEditedPatch()\">\n Reaplicar patch\n </button>\n </div>\n </div>\n }\n </div>\n }\n <div class=\"review-actions\">\n <button mat-button (click)=\"close()\">Fechar</button>\n <button mat-stroked-button (click)=\"retry()\">Tentar Novamente</button>\n </div>\n </div>\n }\n\n <!-- STATE: SUCCESS -->\n @if (state === 'success' && (isActiveTab('task') || (!isTaskMode() && isActiveTab('suggestions')))) {\n <div\n class=\"success-area assistant-card\"\n [attr.id]=\"isTaskMode() ? 'assistant-panel-task' : 'assistant-panel-suggestions'\"\n role=\"tabpanel\"\n [attr.aria-labelledby]=\"isTaskMode() ? 'assistant-tab-task' : 'assistant-tab-suggestions'\"\n >\n <div class=\"success-msg\">\n <mat-icon class=\"success-icon\">check_circle</mat-icon>\n <span>{{ aiExplanation || 'Configura\u00E7\u00E3o atualizada.' }}</span>\n </div>\n @if (warnings.length) {\n <div class=\"warnings-area\">\n <mat-icon class=\"warnings-icon\">warning_amber</mat-icon>\n <div class=\"warnings-content\">\n <div class=\"warnings-title\">Avisos</div>\n <div class=\"warnings-list\">\n @for (warning of warnings; track warning) {\n <div>{{ warning }}</div>\n }\n </div>\n </div>\n </div>\n }\n @if (shouldShowApplyDetails()) {\n <div class=\"apply-details\">\n <div class=\"apply-details-header\">\n <div class=\"apply-details-title\">Detalhes da aplica\u00E7\u00E3o</div>\n @if (allowManualPatchEdit) {\n <div class=\"apply-details-actions\">\n <button mat-button type=\"button\" (click)=\"togglePatchPathEditor()\" [disabled]=\"!pendingPatch\">\n {{ patchPathEditorExpanded ? 'Ocultar paths' : 'Editar por path' }}\n </button>\n <button mat-button type=\"button\" (click)=\"togglePatchEditor()\" [disabled]=\"!pendingPatch\">\n {{ patchEditorExpanded ? 'Ocultar editor' : 'Editar e reaplicar' }}\n </button>\n </div>\n }\n </div>\n @if (lastApplyAt) {\n <div class=\"apply-details-meta\">\n Aplicado em {{ lastApplyAt | date:'short' }}\n </div>\n }\n @if (getApplyPaths().length) {\n <div class=\"apply-paths\">\n @for (path of getApplyPaths(); track path) {\n <span class=\"apply-path-chip\">{{ path }}</span>\n }\n </div>\n }\n @if (applyWarnings.length) {\n <div class=\"apply-warnings\">\n <div class=\"apply-warnings-title\">Avisos da aplica\u00E7\u00E3o</div>\n <div class=\"apply-warnings-list\">\n @for (warning of applyWarnings; track warning) {\n <div>{{ warning }}</div>\n }\n </div>\n </div>\n }\n @if (allowManualPatchEdit && patchPathEditorExpanded) {\n <div class=\"patch-path-editor\">\n <div class=\"patch-editor-label\">Editar por path</div>\n <div class=\"patch-editor-hint\">Texto simples vira string; para for\u00E7ar texto em true/false/n\u00FAmero, use aspas.</div>\n @if (!getEditablePatchPathEdits().length) {\n <div class=\"patch-path-editor-empty\">\n Nenhum path edit\u00E1vel dispon\u00EDvel para este patch.\n </div>\n }\n @if (getEditablePatchPathEdits().length) {\n <div class=\"patch-path-rows\">\n @for (edit of getEditablePatchPathEdits(); track edit; let i = $index) {\n <div class=\"patch-path-row\">\n <div class=\"patch-path-label\">{{ edit.path }}</div>\n <input\n type=\"text\"\n [(ngModel)]=\"patchPathEdits[i].valueText\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n />\n @if (patchPathEdits[i].error) {\n <div class=\"patch-editor-error\">{{ patchPathEdits[i].error }}</div>\n }\n </div>\n }\n </div>\n }\n @if (patchPathEditorError) {\n <div class=\"patch-editor-error\">{{ patchPathEditorError }}</div>\n }\n <div class=\"patch-editor-actions\">\n <button mat-button type=\"button\" (click)=\"resetPatchPathEdits()\">\n Restaurar valores\n </button>\n <button mat-button type=\"button\" (click)=\"applyPathEditsToPatch()\">\n Aplicar no patch\n </button>\n <button mat-flat-button color=\"primary\" type=\"button\" (click)=\"reapplyPathEdits()\">\n Reaplicar por path\n </button>\n </div>\n </div>\n }\n @if (allowManualPatchEdit && patchEditorExpanded) {\n <div class=\"patch-editor\">\n <label class=\"patch-editor-label\">Patch JSON</label>\n <textarea\n [(ngModel)]=\"patchEditorText\"\n spellcheck=\"false\"\n ></textarea>\n @if (patchEditorError) {\n <div class=\"patch-editor-error\">{{ patchEditorError }}</div>\n }\n <div class=\"patch-editor-actions\">\n <button mat-button type=\"button\" (click)=\"resetPatchEditor()\">\n Restaurar original\n </button>\n <button mat-flat-button color=\"primary\" type=\"button\" (click)=\"reapplyEditedPatch()\">\n Reaplicar patch\n </button>\n </div>\n </div>\n }\n </div>\n }\n <button mat-button color=\"warn\" (click)=\"undoLastChange()\">\n <mat-icon>undo</mat-icon> Desfazer\n </button>\n </div>\n }\n\n </div>\n\n <div class=\"assistant-footer\">\n @if (!isTaskMode()) {\n <button\n mat-icon-button\n type=\"button\"\n class=\"composer-leading composer-leading-btn\"\n [matMenuTriggerFor]=\"assistantQuickMenu\"\n aria-label=\"Abrir a\u00E7\u00F5es r\u00E1pidas\"\n matTooltip=\"A\u00E7\u00F5es r\u00E1pidas\"\n >\n <mat-icon>add</mat-icon>\n </button>\n <input\n #inputEl\n type=\"text\"\n [(ngModel)]=\"userPrompt\"\n [disabled]=\"state === 'processing' || state === 'applying'\"\n placeholder=\"Descreva a altera\u00E7\u00E3o que deseja aplicar\u2026\"\n autocomplete=\"off\"\n />\n <div class=\"send-actions\">\n @if (state === 'listening') {\n <button\n mat-icon-button\n class=\"send-btn\"\n (click)=\"submitPrompt()\"\n [disabled]=\"!userPrompt.trim()\"\n [class.ready]=\"!!userPrompt.trim()\"\n >\n <mat-icon>arrow_upward</mat-icon>\n </button>\n }\n @if (state === 'processing' || state === 'applying') {\n <mat-spinner diameter=\"20\"></mat-spinner>\n }\n </div>\n } @else {\n <div class=\"task-footer\">\n <div class=\"task-footer-left\">\n <button mat-button type=\"button\" (click)=\"handleTaskSecondary()\">{{ getTaskCancelLabel() }}</button>\n @if (state === 'review') {\n <button\n mat-stroked-button\n type=\"button\"\n (click)=\"retry()\"\n >\n {{ getTaskSecondaryLabel() }}\n </button>\n }\n </div>\n <div class=\"task-footer-right\">\n <button\n class=\"task-primary-btn\"\n mat-flat-button\n color=\"primary\"\n type=\"button\"\n (click)=\"confirmTaskAction()\"\n [disabled]=\"isTaskPrimaryDisabled()\"\n >\n {{ getTaskPrimaryLabel() }}\n </button>\n @if (state === 'processing' || state === 'applying') {\n <mat-spinner diameter=\"20\"></mat-spinner>\n }\n </div>\n </div>\n }\n </div>\n\n <mat-menu #assistantQuickMenu=\"matMenu\" panelClass=\"assistant-quick-menu-panel\">\n <button mat-menu-item type=\"button\" (click)=\"setActiveTab('chat')\">\n <mat-icon>history</mat-icon>\n <span>Hist\u00F3rico</span>\n </button>\n <button mat-menu-item type=\"button\" (click)=\"setActiveTab('suggestions')\">\n <mat-icon>lightbulb</mat-icon>\n <span>Sugest\u00F5es</span>\n </button>\n <button mat-menu-item type=\"button\" (click)=\"startNewSession()\">\n <mat-icon>add_comment</mat-icon>\n <span>Nova conversa</span>\n </button>\n <button mat-menu-item type=\"button\" (click)=\"refreshSuggestions()\" [disabled]=\"loadingSuggestions\">\n <mat-icon>refresh</mat-icon>\n <span>Atualizar sugest\u00F5es</span>\n </button>\n <button\n mat-menu-item\n type=\"button\"\n (click)=\"restoreDismissedSuggestions()\"\n [disabled]=\"!hasDismissedSuggestions()\"\n >\n <mat-icon>visibility</mat-icon>\n <span>Restaurar sugest\u00F5es ocultas</span>\n </button>\n <button\n mat-menu-item\n type=\"button\"\n class=\"assistant-quick-menu-danger\"\n (click)=\"clearHistory()\"\n [disabled]=\"!historySessions.length\"\n >\n <mat-icon>delete_outline</mat-icon>\n <span>Limpar hist\u00F3rico local</span>\n </button>\n </mat-menu>\n </div>\n\n</ng-template>\n", styles: ["@keyframes assistantPremiumEnter{0%{opacity:0;transform:translate(14px) scale(.99)}to{opacity:1;transform:translate(0) scale(1)}}:host ::ng-deep .ai-assistant-backdrop{background:color-mix(in srgb,var(--md-sys-color-scrim, var(--md-sys-color-shadow, var(--md-sys-color-on-surface))) 42%,transparent);-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}::ng-deep .ai-assistant-overlay-pane{max-width:calc(100vw - 24px);max-height:calc(100vh - 24px)}.ai-assistant-panel{box-sizing:border-box;width:min(604px,100vw - 18px);min-height:min(620px,100vh - 18px);max-height:min(820px,100vh - 18px);display:flex;flex-direction:column;overflow:hidden;color:var(--md-sys-color-on-surface);border-left:1px solid color-mix(in srgb,var(--md-sys-color-primary) 24%,var(--md-sys-color-outline-variant));border-top:1px solid color-mix(in srgb,var(--md-sys-color-primary) 18%,var(--md-sys-color-outline-variant));border-bottom:1px solid color-mix(in srgb,var(--md-sys-color-primary) 18%,var(--md-sys-color-outline-variant));box-shadow:0 18px 48px color-mix(in srgb,var(--md-sys-color-shadow, var(--md-sys-color-on-surface)) 42%,transparent),inset 0 1px color-mix(in srgb,var(--md-sys-color-on-surface) 10%,transparent);background:radial-gradient(circle at 14% 8%,color-mix(in srgb,var(--md-sys-color-primary-container) 38%,transparent) 0%,transparent 44%),linear-gradient(165deg,color-mix(in srgb,var(--md-sys-color-surface-container-highest) 88%,var(--md-sys-color-surface)),var(--md-sys-color-surface));animation:assistantPremiumEnter .24s cubic-bezier(.22,1,.36,1)}.assistant-header{position:relative;display:flex;align-items:flex-start;justify-content:space-between;gap:12px;padding:12px 16px 10px;border-bottom:1px solid color-mix(in srgb,var(--md-sys-color-primary) 18%,var(--md-sys-color-outline-variant));background:linear-gradient(130deg,color-mix(in srgb,var(--md-sys-color-primary-container) 28%,transparent) 0%,transparent 52%),var(--md-sys-color-surface-container-low)}.assistant-header:after{content:\"\";position:absolute;left:16px;right:16px;bottom:-1px;height:1px;background:linear-gradient(90deg,color-mix(in srgb,var(--md-sys-color-primary) 55%,transparent),transparent);pointer-events:none}.assistant-header .assistant-header__left{min-width:0;display:flex;align-items:flex-start;gap:12px}.assistant-header .magic-icon{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;width:30px;height:30px;font-size:18px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 30%,transparent);box-shadow:0 4px 12px color-mix(in srgb,var(--md-sys-color-primary) 26%,transparent)}.assistant-header .assistant-title-group{min-width:0;display:flex;flex-direction:column;gap:4px}.assistant-header .assistant-title{font-size:15px;font-weight:700;letter-spacing:.01em;overflow-wrap:anywhere}.assistant-header .assistant-subtitle{display:block;font-size:11px;line-height:1.25;color:color-mix(in srgb,var(--md-sys-color-on-surface) 70%,var(--md-sys-color-on-surface-variant));overflow-wrap:anywhere}.assistant-header-chips{display:inline-flex;align-items:center;flex-wrap:wrap;gap:6px}.assistant-header .mode-chip{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;border-radius:999px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 28%,var(--md-sys-color-outline-variant));background:color-mix(in srgb,var(--md-sys-color-primary-container) 64%,var(--md-sys-color-surface-container));color:color-mix(in srgb,var(--md-sys-color-on-primary-container) 85%,var(--md-sys-color-on-surface));font-size:10px;font-weight:700;letter-spacing:.04em;text-transform:uppercase}.assistant-header .mode-chip:before{content:\"\";width:6px;height:6px;border-radius:999px;background:currentColor;box-shadow:0 0 0 3px color-mix(in srgb,currentColor 16%,transparent)}.assistant-header .mode-chip.mock{border-color:color-mix(in srgb,var(--md-sys-color-error) 34%,var(--md-sys-color-outline-variant));background:color-mix(in srgb,var(--md-sys-color-error-container) 72%,var(--md-sys-color-surface-container));color:color-mix(in srgb,var(--md-sys-color-on-error-container) 85%,var(--md-sys-color-error))}.assistant-header .policy-chip{padding:2px 8px;border-radius:999px;border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant) 84%,transparent);background:var(--md-sys-color-surface-container-high);font-size:10px;letter-spacing:.02em;font-weight:600}.assistant-header .policy-chip.strict{border-color:color-mix(in srgb,var(--md-sys-color-primary) 42%,var(--md-sys-color-outline-variant));background:color-mix(in srgb,var(--md-sys-color-primary-container) 56%,var(--md-sys-color-surface-container-high))}.assistant-status{display:flex;align-items:flex-start;gap:10px;padding:10px 16px;border-bottom:1px solid color-mix(in srgb,var(--md-sys-color-primary) 18%,var(--md-sys-color-outline-variant));border-radius:0;background:linear-gradient(160deg,color-mix(in srgb,var(--md-sys-color-primary-container) 24%,transparent),transparent 48%),var(--md-sys-color-surface-container-low)}.assistant-status-dot{width:8px;height:8px;margin-top:6px;border-radius:999px;flex:0 0 auto;background:var(--md-sys-color-primary);box-shadow:0 0 0 4px color-mix(in srgb,var(--md-sys-color-primary) 16%,transparent)}.assistant-status.warning .assistant-status-dot{background:var(--md-sys-color-error);box-shadow:0 0 0 4px color-mix(in srgb,var(--md-sys-color-error) 16%,transparent)}.assistant-status.success .assistant-status-dot{background:color-mix(in srgb,var(--md-sys-color-primary) 74%,var(--md-sys-color-tertiary, var(--md-sys-color-primary)))}.assistant-status-content{min-width:0;display:flex;flex-direction:column;gap:2px}.assistant-status-label{display:flex;align-items:center;flex-wrap:wrap;gap:4px;font-size:12px;font-weight:700;line-height:1.35}.assistant-status-detail{font-size:11px;line-height:1.4;color:var(--md-sys-color-on-surface-variant);overflow-wrap:anywhere}.assistant-status-mode{padding:1px 6px;border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-primary-container) 72%,transparent);color:var(--md-sys-color-on-primary-container);font-size:10px;font-weight:700}.assistant-nav{padding:8px 16px 0}.assistant-nav .assistant-tabs{display:flex;align-items:center;gap:4px;border-radius:12px;padding:5px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 24%,var(--md-sys-color-outline-variant));border-color:color-mix(in srgb,var(--md-sys-color-primary) 24%,var(--md-sys-color-outline-variant));background:linear-gradient(155deg,color-mix(in srgb,var(--md-sys-color-primary-container) 14%,transparent),transparent 58%),var(--md-sys-color-surface-container-low)}.assistant-nav .assistant-tab{appearance:none;min-width:0;min-height:30px;border:0;border-radius:8px;padding:0 10px;background:transparent;color:var(--md-sys-color-on-surface-variant);cursor:pointer;display:inline-flex;align-items:center;justify-content:center;flex:1 1 0;font-size:11px;font-weight:700;letter-spacing:.01em}.assistant-nav .assistant-tab.active{background:var(--md-sys-color-surface-container-highest);color:var(--md-sys-color-on-surface);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--md-sys-color-primary) 34%,transparent),0 6px 12px color-mix(in srgb,var(--md-sys-color-primary) 18%,transparent)}.assistant-section,.assistant-card{border-radius:14px;border-color:color-mix(in srgb,var(--md-sys-color-primary) 20%,var(--md-sys-color-outline-variant));background:linear-gradient(160deg,color-mix(in srgb,var(--md-sys-color-primary-container) 16%,transparent),transparent 50%),var(--md-sys-color-surface-container-lowest);box-shadow:0 6px 18px color-mix(in srgb,var(--md-sys-color-shadow, var(--md-sys-color-on-surface)) 12%,transparent),inset 0 1px color-mix(in srgb,var(--md-sys-color-on-surface) 7%,transparent)}.suggestions-hero{margin:2px 0 4px;padding:10px 12px;border-radius:12px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 24%,var(--md-sys-color-outline-variant));background:linear-gradient(120deg,color-mix(in srgb,var(--md-sys-color-primary-container) 34%,transparent) 0%,transparent 52%),var(--md-sys-color-surface-container-low)}.suggestions-hero__label{font-size:10px;letter-spacing:.08em;text-transform:uppercase;font-weight:700;color:var(--md-sys-color-on-surface-variant);opacity:.88}.suggestions-hero__title{margin-top:2px;font-size:13px;font-weight:700;color:var(--md-sys-color-on-surface)}.suggestions-hero__detail{margin-top:4px;font-size:12px;line-height:1.4;color:color-mix(in srgb,var(--md-sys-color-on-surface) 78%,var(--md-sys-color-on-surface-variant))}.suggestions-content .suggestion-item{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:12px;padding:12px;border-radius:12px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 18%,var(--md-sys-color-outline-variant));border-color:color-mix(in srgb,var(--md-sys-color-primary) 18%,var(--md-sys-color-outline-variant));background:linear-gradient(140deg,color-mix(in srgb,var(--md-sys-color-primary-container) 16%,transparent),transparent 56%),var(--md-sys-color-surface-container-lowest);transition:transform .2s cubic-bezier(.25,.8,.25,1),border-color .2s ease,box-shadow .2s ease}.suggestions-list{display:flex;flex-direction:column;gap:10px}.suggestion-copy{min-width:0;display:grid;gap:4px}.suggestion-main{min-width:0;display:flex;align-items:center;flex-wrap:wrap;gap:8px}.suggestion-icon{width:18px;height:18px;font-size:18px;flex:0 0 auto;color:var(--md-sys-color-primary)}.suggestion-label{min-width:0;font-size:13px;font-weight:700;line-height:1.35;overflow-wrap:anywhere}.suggestion-group{padding:2px 6px;border-radius:999px;background:var(--md-sys-color-surface-container-high);color:var(--md-sys-color-on-surface-variant);font-size:10px;font-weight:700;line-height:1.2}.suggestion-desc{font-size:12px;line-height:1.35;color:var(--md-sys-color-on-surface-variant);overflow-wrap:anywhere}.suggestion-actions{display:inline-flex;align-items:center;justify-content:flex-end;gap:4px}.suggestion-action-btn,.suggestion-arrow{width:32px;height:32px;display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;color:var(--md-sys-color-on-surface-variant)}.suggestions-content .suggestion-item:hover,.suggestions-content .suggestion-item:focus-visible{border-color:color-mix(in srgb,var(--md-sys-color-primary) 58%,var(--md-sys-color-outline-variant));box-shadow:0 8px 18px color-mix(in srgb,var(--md-sys-color-primary) 18%,transparent),inset 0 0 0 1px color-mix(in srgb,var(--md-sys-color-primary) 28%,transparent);transform:translateY(-2px) scale(1.01)}.assistant-footer{display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:8px;padding:10px 16px;border-top-color:color-mix(in srgb,var(--md-sys-color-primary) 20%,var(--md-sys-color-outline-variant));background:linear-gradient(180deg,color-mix(in srgb,var(--md-sys-color-primary-container) 16%,transparent),transparent 56%),var(--md-sys-color-surface-container-low)}.assistant-footer .task-footer{grid-column:1/-1}.composer-leading{width:30px;height:30px;display:inline-flex;align-items:center;justify-content:center;border-radius:999px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 30%,var(--md-sys-color-outline-variant));background:color-mix(in srgb,var(--md-sys-color-primary-container) 70%,var(--md-sys-color-surface-container-low));color:var(--md-sys-color-primary);box-shadow:0 4px 10px color-mix(in srgb,var(--md-sys-color-primary) 16%,transparent)}.composer-leading mat-icon{width:16px;height:16px;font-size:16px}.assistant-footer input{box-sizing:border-box;width:100%;min-width:0;height:34px;border:1px solid;border-radius:8px;padding:0 12px;color:var(--md-sys-color-on-surface);border-color:color-mix(in srgb,var(--md-sys-color-primary) 24%,var(--md-sys-color-outline-variant));background:var(--md-sys-color-surface);box-shadow:inset 0 1px 2px color-mix(in srgb,var(--md-sys-color-shadow, var(--md-sys-color-on-surface)) 12%,transparent)}.send-actions{min-width:36px;display:inline-flex;align-items:center;justify-content:center}.assistant-footer .send-btn{--mdc-icon-button-icon-size: 20px;--mdc-icon-button-state-layer-size: 36px;--mat-icon-button-state-layer-size: 36px;width:36px;height:36px;padding:8px;line-height:1;display:inline-flex;align-items:center;justify-content:center;border-color:color-mix(in srgb,var(--md-sys-color-primary) 24%,var(--md-sys-color-outline-variant));background:var(--md-sys-color-surface)}.assistant-footer .send-btn mat-icon{width:20px;height:20px;margin:0;font-size:20px;line-height:20px;display:inline-flex;align-items:center;justify-content:center}.assistant-footer .send-btn.ready{background:linear-gradient(135deg,color-mix(in srgb,var(--md-sys-color-primary-container) 84%,var(--md-sys-color-primary)),var(--md-sys-color-primary));color:var(--md-sys-color-on-primary);box-shadow:0 8px 18px color-mix(in srgb,var(--md-sys-color-primary) 30%,transparent)}.task-primary-btn{border-radius:12px;box-shadow:0 8px 18px color-mix(in srgb,var(--md-sys-color-primary) 24%,transparent)}@media(max-width:959px){.assistant-header{padding:12px 12px 10px}.assistant-section,.assistant-card{margin:4px 12px 10px}.assistant-header:after{left:12px;right:12px}.assistant-header .assistant-title{font-size:14px}.assistant-header .assistant-subtitle{font-size:10px}.assistant-footer{grid-template-columns:minmax(0,1fr) auto}.composer-leading{display:none}}.assistant-thought{margin-top:0;gap:10px;border-color:color-mix(in srgb,var(--md-sys-color-primary) 26%,var(--md-sys-color-outline-variant));background:linear-gradient(145deg,color-mix(in srgb,var(--md-sys-color-primary-container) 28%,transparent),transparent 58%),var(--md-sys-color-surface-container-low)}.assistant-thought-meta{display:inline-flex;align-items:center;gap:6px;font-size:11px;color:var(--md-sys-color-on-surface-variant)}.assistant-thought-meta mat-icon{width:15px;height:15px;font-size:15px;color:var(--md-sys-color-primary)}.assistant-thought-summary{font-size:13px;line-height:1.45;color:var(--md-sys-color-on-surface)}.assistant-thought-plan{border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 32%,var(--md-sys-color-outline-variant));border-radius:12px;padding:10px;background:var(--md-sys-color-surface-container-lowest);display:flex;flex-direction:column;gap:8px}.assistant-thought-plan-title{font-size:13px;font-weight:700;color:var(--md-sys-color-on-surface)}.assistant-thought-plan-actions{display:grid;grid-template-columns:repeat(auto-fit,minmax(0,1fr));gap:8px}.assistant-thought-plan-actions .mdc-button{min-width:0}.assistant-thought-plan-hint{font-size:11px;color:var(--md-sys-color-on-surface-variant);line-height:1.35}.assistant-thought-checklist{display:flex;flex-direction:column;gap:5px}.assistant-thought-checklist-item{display:inline-flex;align-items:center;gap:6px;font-size:12px;color:var(--md-sys-color-on-surface-variant)}.assistant-thought-checklist-item mat-icon{width:14px;height:14px;font-size:14px}.assistant-thought-shimmer{display:flex;flex-direction:column;gap:8px;margin-top:4px}.assistant-thought-shimmer .shimmer-line{height:12px;border-radius:4px;position:relative;overflow:hidden;background:var(--md-sys-color-surface-container-highest)}.assistant-thought-shimmer .shimmer-line:after{content:\"\";position:absolute;inset:0;transform:translate(-100%);background:linear-gradient(90deg,transparent,color-mix(in srgb,var(--md-sys-color-primary) 8%,transparent),transparent);animation:assistantShimmerEffect 1.5s infinite}.assistant-thought-shimmer .shimmer-line-1{width:85%}.assistant-thought-shimmer .shimmer-line-2{width:92%}.assistant-thought-shimmer .shimmer-line-3{width:64%}@keyframes assistantShimmerEffect{to{transform:translate(100%)}}.assistant-flow{grid-template-columns:1fr;gap:6px}.flow-step{display:flex;align-items:flex-start;gap:8px;text-align:left;padding:7px 8px;border-radius:10px}.flow-step-index{width:18px;height:18px;border-radius:999px;display:inline-flex;align-items:center;justify-content:center;font-size:10px;font-weight:700;border:1px solid var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface-container-highest);color:var(--md-sys-color-on-surface);flex:0 0 auto}.flow-step-content{min-width:0;display:flex;flex-direction:column;gap:1px}.flow-step-label{font-size:11px;font-weight:700;color:var(--md-sys-color-on-surface)}.flow-step-detail{font-size:11px;color:var(--md-sys-color-on-surface-variant);line-height:1.3}.flow-step.active .flow-step-index{border-color:color-mix(in srgb,var(--md-sys-color-primary) 60%,var(--md-sys-color-outline-variant));background:color-mix(in srgb,var(--md-sys-color-primary-container) 85%,var(--md-sys-color-surface-container-highest));color:var(--md-sys-color-on-primary-container)}.flow-step.done .flow-step-index{border-color:transparent;background:color-mix(in srgb,var(--md-sys-color-primary) 18%,var(--md-sys-color-surface-container-highest))}.task-timeline{margin-top:4px;display:grid;gap:6px}.task-timeline-item{display:flex;align-items:flex-start;gap:8px;border:1px solid var(--md-sys-color-outline-variant);border-radius:10px;padding:6px 8px;background:var(--md-sys-color-surface-container-low);opacity:.76}.task-timeline-item.active{opacity:1;border-color:color-mix(in srgb,var(--md-sys-color-primary) 40%,var(--md-sys-color-outline-variant));background:color-mix(in srgb,var(--md-sys-color-primary-container) 34%,var(--md-sys-color-surface-container-low))}.task-timeline-item.done{opacity:.9;border-color:color-mix(in srgb,var(--md-sys-color-primary) 24%,var(--md-sys-color-outline-variant))}.task-timeline-dot{width:18px;height:18px;border-radius:999px;display:inline-flex;align-items:center;justify-content:center;font-size:10px;font-weight:700;border:1px solid var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface-container-highest);color:var(--md-sys-color-on-surface);flex:0 0 auto}.task-timeline-copy{min-width:0;display:flex;flex-direction:column;gap:1px}.task-timeline-title{font-size:11px;font-weight:700;color:var(--md-sys-color-on-surface)}.task-timeline-detail{font-size:11px;line-height:1.3;color:var(--md-sys-color-on-surface-variant)}.clarification-decision-head{display:inline-flex;align-items:center;width:100%;gap:6px;padding:8px 12px 0;box-sizing:border-box}.clarification-decision-index{width:18px;height:18px;border-radius:999px;display:inline-flex;align-items:center;justify-content:center;font-size:10px;font-weight:700;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 35%,var(--md-sys-color-outline-variant));color:var(--md-sys-color-primary);background:color-mix(in srgb,var(--md-sys-color-primary-container) 68%,transparent)}.clarification-decision-type{font-size:10px;letter-spacing:.08em;text-transform:uppercase;color:var(--md-sys-color-on-surface-variant);opacity:.92}.clarification-decision-state{font-size:10px;font-weight:700;color:var(--md-sys-color-primary)}.clarification-option{border-color:color-mix(in srgb,var(--md-sys-color-primary) 20%,var(--md-sys-color-outline-variant));background:linear-gradient(145deg,color-mix(in srgb,var(--md-sys-color-primary-container) 16%,transparent),transparent 55%),var(--md-sys-color-surface-container-low)}.clarification-option.selected{border-color:color-mix(in srgb,var(--md-sys-color-primary) 56%,var(--md-sys-color-outline-variant));background:linear-gradient(145deg,color-mix(in srgb,var(--md-sys-color-primary-container) 44%,transparent),transparent 62%),var(--md-sys-color-surface-container);box-shadow:0 8px 16px color-mix(in srgb,var(--md-sys-color-primary) 18%,transparent)}.clarification-options-block{overflow:visible;padding-right:4px}@media(max-width:959px){.assistant-thought-plan-actions{grid-template-columns:1fr}}.ai-assistant-panel{width:min(604px,100vw - 18px)}.assistant-section,.assistant-card{margin:0;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 20%,var(--md-sys-color-outline-variant))}.assistant-section{min-height:0;padding:14px 16px;overflow:visible}.assistant-card{min-height:0;padding:14px 16px 16px;overflow:visible}.suggestions-area,.assistant-history,.loading-suggestions{overflow-y:auto;overflow-x:hidden}.section-header{min-width:0;display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:10px}.section-title{min-width:0;font-size:14px;font-weight:700;line-height:1.35;overflow-wrap:anywhere}.suggestions-actions{flex:0 0 auto;display:inline-flex;align-items:center}.review-area,.error-area,.success-area,.clarification-area{padding:0;overflow-y:auto;overflow-x:hidden;scrollbar-gutter:auto}.review-trust{margin:2px 0 4px}.trust-chip{max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.warnings-area,.review-summary,.review-diff,.apply-details,.clarification-options-block,.clarification-manual-toggle{width:100%;max-width:100%;min-width:0}.review-diff{padding:12px 14px}.review-diff-full{padding:10px;overflow-x:auto}.review-diff-block{min-width:0}.review-diff-block pre{overflow-wrap:anywhere;word-break:break-word}.clarification-options-block{padding:4px 2px 10px}.clarification-option{line-height:normal}:host ::ng-deep .clarification-option .mdc-button__label{line-height:1.35!important}.clarification-plain-label{padding:6px 12px 12px;font-size:14px;line-height:1.35}.clarification-manual-toggle{margin-top:10px;padding:10px 2px 0;flex-wrap:wrap;row-gap:6px}.suggestions-content .suggestion-actions{gap:6px}.suggestions-content .suggestion-arrow,.suggestions-content .suggestion-action-btn mat-icon,.suggestions-content .suggestion-arrow mat-icon{display:inline-flex;align-items:center;justify-content:center}:host ::ng-deep .assistant-quick-menu-panel{min-width:244px;max-width:min(90vw,320px);border-radius:14px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 26%,var(--md-sys-color-outline-variant));background:var(--md-sys-color-surface-container-high);box-shadow:0 12px 28px color-mix(in srgb,var(--md-sys-color-shadow, var(--md-sys-color-on-surface)) 32%,transparent),inset 0 1px color-mix(in srgb,var(--md-sys-color-on-surface) 6%,transparent);overflow:hidden;padding:6px}:host ::ng-deep .assistant-quick-menu-panel .mat-mdc-menu-item{min-height:36px;border-radius:10px;color:var(--md-sys-color-on-surface);font-size:12px;font-weight:500;margin:1px 0}:host ::ng-deep .assistant-quick-menu-panel .mat-mdc-menu-item .mat-icon{color:color-mix(in srgb,var(--md-sys-color-on-surface) 82%,var(--md-sys-color-on-surface-variant))}:host ::ng-deep .assistant-quick-menu-panel .mat-mdc-menu-item:hover:not([disabled]){background:color-mix(in srgb,var(--md-sys-color-primary-container) 45%,transparent)}:host ::ng-deep .assistant-quick-menu-panel .mat-mdc-menu-item:focus-visible{outline:2px solid var(--md-sys-color-primary);outline-offset:-2px}:host ::ng-deep .assistant-quick-menu-panel .assistant-quick-menu-danger{color:var(--md-sys-color-error)}:host ::ng-deep .assistant-quick-menu-panel .assistant-quick-menu-danger .mat-icon{color:var(--md-sys-color-error)}@media(max-width:959px){::ng-deep .ai-assistant-overlay-pane{top:12px!important;left:12px!important;width:calc(100vw - 24px)!important;height:calc(100vh - 24px)!important;max-width:calc(100vw - 24px);max-height:calc(100vh - 24px);transform:none!important}.ai-assistant-panel{width:calc(100vw - 48px);min-height:min(620px,100vh - 48px);max-height:calc(100vh - 48px)}.assistant-section,.assistant-card{margin:0}.assistant-card,.assistant-section{padding:12px}}.ai-trigger-btn{--mdc-icon-button-state-layer-size: 36px;width:36px;height:36px;border-radius:8px;background:color-mix(in srgb,var(--md-sys-color-primary) 9%,transparent);border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 22%,transparent);color:var(--md-sys-color-primary);opacity:1}.ai-trigger-btn:hover:not(:disabled){background:color-mix(in srgb,var(--md-sys-color-primary) 16%,transparent);border-color:color-mix(in srgb,var(--md-sys-color-primary) 36%,transparent);color:var(--md-sys-color-on-primary-container)}.ai-trigger-btn:focus-visible,.assistant-close-btn:focus-visible,.assistant-tab:focus-visible{outline:2px solid var(--md-sys-color-primary);outline-offset:2px}.assistant-close-btn{width:28px;height:28px;color:var(--md-sys-color-on-surface-variant)}.assistant-close-btn:hover:not(:disabled){background:var(--md-sys-color-surface-container-high);color:var(--md-sys-color-on-surface)}.assistant-body{padding:12px 16px;overflow:hidden;min-height:0;flex:1;display:flex;flex-direction:column;gap:12px}.assistant-body>*{min-height:0}@media(max-width:959px){.assistant-nav{padding:8px 12px 0}.assistant-body,.assistant-footer{padding:10px 12px}.suggestions-content .suggestion-item{grid-template-columns:1fr;align-items:start}.suggestion-actions{justify-content:flex-start}}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i4.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation", "cdkConnectedOverlayUsePopover", "cdkConnectedOverlayMatchWidth", "cdkConnectedOverlay"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i4.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "ngmodule", type: A11yModule }, { kind: "directive", type: i5.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "ngmodule", type: MatDialogModule }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i1.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i7.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i8.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatChipsModule }, { kind: "component", type: i15.MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["role", "id", "aria-label", "aria-description", "value", "color", "removable", "highlighted", "disableRipple", "disabled"], outputs: ["removed", "destroyed"], exportAs: ["matChip"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i10.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i10.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i10.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: DatePipe, name: "date" }, { kind: "pipe", type: JsonPipe, name: "json" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
6821
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: PraxisAiAssistantComponent, isStandalone: true, selector: "praxis-ai-assistant", inputs: { adapter: "adapter", riskPolicy: "riskPolicy", allowManualPatchEdit: "allowManualPatchEdit", hasBackdrop: "hasBackdrop" }, viewQueries: [{ propertyName: "overlayOrigin", first: true, predicate: CdkOverlayOrigin, descendants: true }, { propertyName: "triggerButton", first: true, predicate: ["triggerBtn"], descendants: true, read: ElementRef }, { propertyName: "inputElement", first: true, predicate: ["inputEl"], descendants: true }], ngImport: i0, template: "<!-- Trigger Button -->\n<button\n mat-icon-button\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n #triggerBtn\n (click)=\"open()\"\n [disabled]=\"isOpen\"\n class=\"ai-trigger-btn\"\n matTooltip=\"Assistente de Configura\u00E7\u00E3o\"\n aria-label=\"Abrir Assistente IA\">\n <mat-icon>auto_awesome</mat-icon>\n</button>\n\n<!-- Overlay Template -->\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"isOpen\"\n [cdkConnectedOverlayHasBackdrop]=\"hasBackdrop\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayPush]=\"true\"\n [cdkConnectedOverlayViewportMargin]=\"12\"\n cdkConnectedOverlayPanelClass=\"ai-assistant-overlay-pane\"\n cdkConnectedOverlayBackdropClass=\"ai-assistant-backdrop\"\n (backdropClick)=\"close()\"\n (overlayOutsideClick)=\"close()\"\n (detach)=\"close()\">\n\n <div\n class=\"ai-assistant-panel\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Assistente de Configura\u00E7\u00E3o\"\n [attr.aria-busy]=\"isBusyState() ? 'true' : null\"\n [cdkTrapFocus]=\"hasBackdrop\"\n [cdkTrapFocusAutoCapture]=\"hasBackdrop\"\n (keydown)=\"onKeydown($event)\"\n >\n\n <!-- HEADER -->\n <div class=\"assistant-header\">\n <div class=\"assistant-header__left\">\n <mat-icon class=\"magic-icon\">auto_awesome</mat-icon>\n <div class=\"assistant-title-group\">\n <div class=\"assistant-title\">Assistente de Configura\u00E7\u00E3o</div>\n <div class=\"assistant-subtitle\">Copiloto contextual para ajustes guiados</div>\n <div class=\"assistant-header-chips\">\n <span\n class=\"mode-chip\"\n [class.mock]=\"mockMode\"\n [matTooltip]=\"mockMode ? 'Sem chave de API: respostas de demonstra\u00E7\u00E3o' : 'Conectado ao assistente configurado'\"\n >\n {{ mockMode ? 'Mock' : 'Conectado' }}\n </span>\n <span\n class=\"policy-chip\"\n [class.strict]=\"isStrictRiskPolicy()\"\n [matTooltip]=\"getRiskPolicyTooltip()\"\n >\n {{ getRiskPolicyLabel() }}\n </span>\n </div>\n </div>\n </div>\n <div class=\"assistant-header__right\">\n <button\n mat-icon-button\n type=\"button\"\n class=\"assistant-close-btn\"\n (click)=\"close()\"\n aria-label=\"Fechar assistente\"\n matTooltip=\"Fechar assistente\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </div>\n </div>\n <div\n class=\"assistant-status\"\n [class.processing]=\"isBusyState()\"\n [class.pending]=\"state === 'clarification'\"\n [class.warning]=\"state === 'error'\"\n [class.success]=\"state === 'review' || state === 'success'\"\n [class.compact]=\"!shouldShowSystemStatusDetail()\"\n role=\"status\"\n [attr.aria-live]=\"getSystemStatusAriaLive()\"\n aria-atomic=\"true\"\n >\n <span class=\"assistant-status-dot\" aria-hidden=\"true\"></span>\n <div class=\"assistant-status-content\">\n <div class=\"assistant-status-label\">\n <span class=\"assistant-status-label-prefix\">Status:</span>\n <span>{{ getSystemStatusLabel() }}</span>\n @if (shouldShowSnapshotFallbackBadge()) {\n <span class=\"assistant-status-mode\">Snapshot</span>\n }\n </div>\n @if (shouldShowSystemStatusDetail()) {\n <div class=\"assistant-status-detail\">{{ getSystemStatusDetail() }}</div>\n }\n </div>\n </div>\n @if (shouldShowTaskFlow()) {\n <div class=\"assistant-flow\" role=\"list\" aria-label=\"Fluxo da proposta\">\n @for (step of flowSteps; track step) {\n <div\n class=\"flow-step\"\n role=\"listitem\"\n [class.active]=\"getFlowStepState(step.step) === 'active'\"\n [class.done]=\"getFlowStepState(step.step) === 'done'\"\n >\n <span class=\"flow-step-index\">{{ step.step }}</span>\n <span class=\"flow-step-content\">\n <span class=\"flow-step-label\">{{ step.label }}</span>\n <span class=\"flow-step-detail\">{{ getFlowStepDetail(step.step) }}</span>\n </span>\n </div>\n }\n </div>\n }\n <div class=\"assistant-nav\">\n <div\n class=\"assistant-tabs\"\n role=\"tablist\"\n aria-label=\"Se\u00E7\u00F5es do assistente\"\n (keydown)=\"onTabsKeydown($event)\"\n >\n @if (isTaskMode()) {\n <button\n class=\"assistant-tab\"\n type=\"button\"\n id=\"assistant-tab-task\"\n role=\"tab\"\n aria-label=\"Proposta atual\"\n [attr.aria-selected]=\"isActiveTab('task')\"\n aria-controls=\"assistant-panel-task\"\n [attr.tabindex]=\"isActiveTab('task') ? 0 : -1\"\n [class.active]=\"isActiveTab('task')\"\n (click)=\"setActiveTab('task')\"\n >\n Proposta\n @if (hasPendingClarification() && !isActiveTab('task')) {\n <span class=\"assistant-tab-badge\">1</span>\n }\n </button>\n }\n <button\n class=\"assistant-tab\"\n type=\"button\"\n id=\"assistant-tab-chat\"\n role=\"tab\"\n aria-label=\"Hist\u00F3rico\"\n [attr.aria-selected]=\"isActiveTab('chat')\"\n aria-controls=\"assistant-panel-chat\"\n [attr.tabindex]=\"isActiveTab('chat') ? 0 : -1\"\n [class.active]=\"isActiveTab('chat')\"\n (click)=\"setActiveTab('chat')\"\n >\n Hist\u00F3rico\n </button>\n <button\n class=\"assistant-tab\"\n type=\"button\"\n id=\"assistant-tab-suggestions\"\n role=\"tab\"\n aria-label=\"Sugest\u00F5es de melhoria\"\n [attr.aria-selected]=\"isActiveTab('suggestions')\"\n aria-controls=\"assistant-panel-suggestions\"\n [attr.tabindex]=\"isActiveTab('suggestions') ? 0 : -1\"\n [class.active]=\"isActiveTab('suggestions')\"\n (click)=\"setActiveTab('suggestions')\"\n >\n Sugest\u00F5es\n </button>\n </div>\n </div>\n\n <!-- BODY: Dynamic Content based on State -->\n <div class=\"assistant-body\">\n @if (shouldShowThoughtCard()) {\n <div class=\"assistant-thought assistant-section\">\n <div class=\"assistant-thought-meta\">\n <mat-icon>psychology</mat-icon>\n <span>{{ getThoughtTimingLabel() }}</span>\n </div>\n <div class=\"assistant-thought-summary\">{{ getThoughtSummary() }}</div>\n <div class=\"assistant-thought-plan\">\n <div class=\"assistant-thought-plan-title\">{{ getThoughtPlanTitle() }}</div>\n <div class=\"assistant-thought-plan-actions\">\n <button\n mat-stroked-button\n type=\"button\"\n class=\"thought-action-details\"\n (click)=\"openThoughtDetails()\"\n [attr.aria-label]=\"getThoughtDetailsLabel()\"\n [matTooltip]=\"getThoughtDetailsTooltip()\"\n >\n {{ getThoughtDetailsLabel() }}\n </button>\n @if (shouldShowThoughtPreviewAction()) {\n <button\n mat-flat-button\n color=\"primary\"\n type=\"button\"\n class=\"thought-action-preview\"\n (click)=\"openThoughtPreview()\"\n [matTooltip]=\"getThoughtPreviewTooltip()\"\n >\n Pr\u00E9via\n </button>\n }\n </div>\n <div class=\"assistant-thought-plan-hint\">{{ getThoughtActionHint() }}</div>\n @if (getThoughtChecklist(); as thoughtChecklist) {\n @if (thoughtChecklist.length) {\n <div class=\"assistant-thought-checklist\">\n @for (item of thoughtChecklist; track item) {\n <div class=\"assistant-thought-checklist-item\">\n <mat-icon>radio_button_unchecked</mat-icon>\n <span>{{ item }}</span>\n </div>\n }\n </div>\n }\n @if (isBusyState() && !thoughtChecklist.length) {\n <div class=\"assistant-thought-shimmer\">\n <div class=\"shimmer-line shimmer-line-1\"></div>\n <div class=\"shimmer-line shimmer-line-2\"></div>\n <div class=\"shimmer-line shimmer-line-3\"></div>\n </div>\n }\n }\n </div>\n </div>\n }\n @if (processingInfoVisible) {\n <div class=\"processing-banner\">\n <mat-spinner diameter=\"16\"></mat-spinner>\n <span>{{ aiExplanation || 'Analisando solicita\u00E7\u00E3o e preparando proposta...' }}</span>\n <button mat-button type=\"button\" class=\"processing-retry\" (click)=\"retryProcessing()\">Tentar novamente</button>\n </div>\n }\n @if (historyContext && isActiveTab('chat')) {\n <div\n class=\"assistant-history assistant-section\"\n id=\"assistant-panel-chat\"\n role=\"tabpanel\"\n aria-labelledby=\"assistant-tab-chat\"\n >\n <div class=\"section-header\">\n <div class=\"section-heading\">\n <div class=\"section-title\">Hist\u00F3rico</div>\n <div class=\"section-subtitle\">Sess\u00F5es recentes, pedidos reaproveit\u00E1veis e desfazer r\u00E1pido.</div>\n </div>\n <div class=\"history-actions\" role=\"group\" aria-label=\"A\u00E7\u00F5es do hist\u00F3rico\">\n <button\n mat-stroked-button\n type=\"button\"\n class=\"history-action-btn\"\n (click)=\"historyExpanded = !historyExpanded\"\n [matTooltip]=\"historyExpanded ? 'Recolher hist\u00F3rico' : 'Expandir hist\u00F3rico'\"\n [attr.aria-label]=\"historyExpanded ? 'Recolher hist\u00F3rico' : 'Expandir hist\u00F3rico'\"\n [disabled]=\"!historyWarnings.length && !historySessions.length && !activeHistoryMessages.length\"\n >\n <mat-icon>{{ historyExpanded ? 'expand_less' : 'expand_more' }}</mat-icon>\n <span>{{ historyExpanded ? 'Recolher' : 'Expandir' }}</span>\n </button>\n <button\n mat-stroked-button\n type=\"button\"\n class=\"history-action-btn\"\n (click)=\"startNewSession()\"\n matTooltip=\"Nova conversa\"\n aria-label=\"Nova conversa\"\n [disabled]=\"isBusyState()\"\n >\n <mat-icon>add_comment</mat-icon>\n <span>Nova conversa</span>\n </button>\n <button\n mat-stroked-button\n type=\"button\"\n (click)=\"clearHistory()\"\n matTooltip=\"Limpar hist\u00F3rico local\"\n aria-label=\"Limpar hist\u00F3rico local\"\n class=\"history-action-btn history-action-btn--danger\"\n [disabled]=\"!historySessions.length\"\n >\n <mat-icon>delete_outline</mat-icon>\n <span>Limpar</span>\n </button>\n </div>\n </div>\n @if (historyUndoDeleteSession) {\n <div class=\"history-undo\">\n <span>Sess\u00E3o removida.</span>\n <button mat-button type=\"button\" (click)=\"undoRemoveHistorySession()\">\n Desfazer\n </button>\n </div>\n }\n @if (historyExpanded && historyWarnings.length) {\n <div class=\"history-warnings\">\n <mat-icon>info</mat-icon>\n <div class=\"history-warnings-list\">\n @for (warning of historyWarnings; track warning) {\n <div>{{ warning }}</div>\n }\n <div class=\"history-warnings-hint\">\n Configure headers via API_CONFIG_STORAGE_OPTIONS no host.\n </div>\n </div>\n </div>\n }\n @if (historyExpanded && historySessions.length) {\n <div class=\"history-sessions\">\n @for (session of historySessions; track session.id) {\n <div\n class=\"history-session\"\n role=\"button\"\n tabindex=\"0\"\n (click)=\"selectHistorySession(session.id)\"\n (keydown)=\"onHistorySessionCardKeydown($event, session.id)\"\n [class.active]=\"session.id === activeHistorySession?.id\"\n [matTooltip]=\"getHistorySessionTooltip(session)\"\n [matTooltipDisabled]=\"!session.componentType && !session.componentId\"\n >\n <div class=\"history-session-main\">\n <span class=\"history-session-title\">{{ session.title }}</span>\n <div class=\"history-session-main-right\">\n <span class=\"history-session-time\">{{ session.updatedAt | date:'short' }}</span>\n <div class=\"history-session-tools\">\n <button\n mat-icon-button\n type=\"button\"\n class=\"history-session-tool\"\n (click)=\"reuseHistorySessionPrompt(session.id, $event)\"\n matTooltip=\"Reusar \u00FAltimo pedido\"\n aria-label=\"Reusar \u00FAltimo pedido\"\n >\n <mat-icon>edit_note</mat-icon>\n </button>\n <button\n mat-icon-button\n type=\"button\"\n class=\"history-session-tool history-session-tool--danger\"\n (click)=\"removeHistorySession(session.id, $event)\"\n matTooltip=\"Excluir sess\u00E3o\"\n aria-label=\"Excluir sess\u00E3o\"\n >\n <mat-icon>delete_outline</mat-icon>\n </button>\n </div>\n </div>\n </div>\n <div class=\"history-session-meta\">\n @if (session.componentType) {\n <span class=\"history-chip\">{{ session.componentType }}</span>\n }\n @if (session.componentId) {\n <span class=\"history-chip\">{{ session.componentId }}</span>\n }\n </div>\n </div>\n }\n </div>\n }\n @if (historyExpanded && !historySessions.length) {\n <div class=\"history-empty\">\n Nenhuma sess\u00E3o salva ainda.\n </div>\n }\n @if (historyExpanded && activeHistoryMessages.length) {\n <div class=\"history-messages\">\n @if (activeHistoryTotalMessages > activeHistoryMessages.length) {\n <div\n class=\"history-messages-hint\"\n >\n Mostrando \u00FAltimas {{ activeHistoryMessages.length }} de {{ activeHistoryTotalMessages }} mensagens.\n </div>\n }\n @for (msg of activeHistoryMessages; track msg.id) {\n <div\n class=\"history-message\"\n [class.user]=\"msg.role === 'user'\"\n [class.assistant]=\"msg.role === 'assistant'\"\n >\n <div class=\"history-message-header\">\n <span class=\"history-message-role\">{{ msg.role === 'user' ? 'Voc\u00EA' : 'Assistente' }}</span>\n <span class=\"history-message-time\">{{ msg.createdAt | date:'shortTime' }}</span>\n @if (msg.context?.usedRag) {\n <span\n class=\"history-rag\"\n matTooltip=\"Resposta baseada em contexto recuperado (RAG)\"\n >RAG</span>\n }\n </div>\n <div class=\"history-message-text\">{{ msg.text }}</div>\n </div>\n }\n </div>\n }\n @if (historyExpanded && historySessions.length && !activeHistoryMessages.length) {\n <div class=\"history-empty history-empty--panel\">\n Selecione uma sess\u00E3o para visualizar as mensagens.\n </div>\n }\n @if (historyExpanded) {\n <div class=\"history-helper\">\n O hist\u00F3rico \u00E9 local ao usu\u00E1rio e ao componente atual.\n </div>\n }\n </div>\n }\n\n @if (loadingSuggestions && isActiveTab('suggestions')) {\n <div\n class=\"loading-suggestions assistant-section\"\n id=\"assistant-panel-suggestions\"\n role=\"tabpanel\"\n aria-labelledby=\"assistant-tab-suggestions\"\n >\n <mat-spinner diameter=\"20\"></mat-spinner>\n <span>Carregando sugest\u00F5es de melhoria...</span>\n </div>\n }\n\n <!-- STATE: LISTENING (Suggestions) -->\n @if (state === 'listening' && isActiveTab('suggestions')) {\n <div\n class=\"suggestions-area assistant-section\"\n id=\"assistant-panel-suggestions\"\n role=\"tabpanel\"\n aria-labelledby=\"assistant-tab-suggestions\"\n >\n <div class=\"section-header\">\n <div class=\"section-title\">Sugest\u00F5es de melhoria</div>\n <div class=\"suggestions-actions\">\n <button mat-icon-button type=\"button\" (click)=\"refreshSuggestions()\" [disabled]=\"loadingSuggestions\" matTooltip=\"Atualizar sugest\u00F5es\">\n <mat-icon>refresh</mat-icon>\n </button>\n </div>\n </div>\n @if (!loadingSuggestions) {\n <div class=\"suggestions-hero\">\n <div class=\"suggestions-hero__label\">Contexto ativo</div>\n <div class=\"suggestions-hero__title\">{{ adapter.componentName || 'Componente atual' }}</div>\n <div class=\"suggestions-hero__detail\">{{ getSystemStatusDetail() }}</div>\n </div>\n }\n @if (suggestionsWarnings.length) {\n <div class=\"warnings-area\">\n <mat-icon class=\"warnings-icon\">warning_amber</mat-icon>\n <div class=\"warnings-content\">\n <div class=\"warnings-title\">Avisos</div>\n <div class=\"warnings-list\">\n @for (warning of suggestionsWarnings; track warning) {\n <div>{{ warning }}</div>\n }\n </div>\n </div>\n </div>\n }\n @if (!loadingSuggestions && (richSuggestions.length || hasDismissedSuggestions())) {\n <div class=\"suggestions-content\">\n @if (hasDismissedSuggestions()) {\n <div class=\"suggestions-filter\">\n <span>{{ getDismissedSuggestionCount() }} oculta(s)</span>\n <button mat-button type=\"button\" (click)=\"restoreDismissedSuggestions()\">\n Restaurar\n </button>\n </div>\n }\n @if (getVisibleSuggestions().length) {\n <div class=\"suggestions-list\">\n @for (sug of getVisibleSuggestions(); track sug.id) {\n <div\n class=\"suggestion-item\"\n role=\"button\"\n tabindex=\"0\"\n [attr.aria-label]=\"'Selecionar sugest\u00E3o: ' + sug.label\"\n (click)=\"selectSuggestion(sug)\"\n (keydown)=\"onSuggestionCardKeydown($event, sug)\"\n >\n <div class=\"suggestion-copy\">\n <div class=\"suggestion-main\">\n @if (sug.icon) {\n <mat-icon class=\"suggestion-icon\">{{ sug.icon }}</mat-icon>\n }\n <span class=\"suggestion-label\">{{ sug.label }}</span>\n @if (sug.group) {\n <span class=\"suggestion-group\">{{ sug.group }}</span>\n }\n </div>\n @if (sug.description) {\n <div class=\"suggestion-desc\">{{ sug.description }}</div>\n }\n </div>\n <div class=\"suggestion-actions\">\n <span class=\"suggestion-arrow\" aria-hidden=\"true\">\n <mat-icon>chevron_right</mat-icon>\n </span>\n <button\n mat-icon-button\n type=\"button\"\n class=\"suggestion-action-btn\"\n (click)=\"prepareSuggestionPrompt(sug, $event)\"\n matTooltip=\"Refinar pedido\"\n aria-label=\"Refinar pedido\"\n >\n <mat-icon>edit</mat-icon>\n </button>\n <button\n mat-icon-button\n type=\"button\"\n class=\"suggestion-action-btn suggestion-action-btn--danger\"\n (click)=\"dismissSuggestion(sug, $event)\"\n matTooltip=\"Ocultar sugest\u00E3o\"\n aria-label=\"Ocultar sugest\u00E3o\"\n >\n <mat-icon>visibility_off</mat-icon>\n </button>\n </div>\n </div>\n }\n </div>\n } @else {\n <div class=\"suggestions-empty suggestions-empty--inline\">\n Todas as sugest\u00F5es foram ocultadas.\n </div>\n }\n </div>\n }\n @if (!loadingSuggestions && !richSuggestions.length) {\n <div class=\"suggestions-empty\">\n Nenhuma sugest\u00E3o dispon\u00EDvel no momento.\n </div>\n }\n @if (!loadingSuggestions && !richSuggestions.length) {\n <div class=\"suggestions-helper\">\n Selecione uma sugest\u00E3o acima ou descreva uma altera\u00E7\u00E3o no campo inferior.\n </div>\n }\n </div>\n }\n\n <!-- STATE: CLARIFICATION (Two-Step Flow) -->\n @if (state === 'clarification' && isActiveTab('task')) {\n <div\n class=\"clarification-area assistant-card\"\n id=\"assistant-panel-task\"\n role=\"tabpanel\"\n aria-labelledby=\"assistant-tab-task\"\n >\n @if (!shouldShowThoughtCard()) {\n <div class=\"task-header\">\n <div class=\"task-title\">{{ getTaskTitle() }}</div>\n <div class=\"task-subtitle\">{{ getTaskSubtitle() }}</div>\n @if (clarificationOptions.length > 1 && getTaskSelectionSummary(); as selectionSummary) {\n <div class=\"task-meta\">\n <span class=\"task-meta-label\">Selecionado:</span>\n <span class=\"task-meta-value\">{{ selectionSummary }}</span>\n </div>\n }\n @if (shouldShowTaskSteps()) {\n <div class=\"task-steps\">\n <span class=\"task-step active\">1 Dados</span>\n <span class=\"task-step\">2 Layout</span>\n <span class=\"task-step\">3 Revis\u00E3o</span>\n </div>\n }\n </div>\n }\n @if (clarificationResponseType === 'context') {\n <div class=\"context-only\">\n <mat-spinner diameter=\"24\"></mat-spinner>\n <div class=\"context-only-hint\">Buscando contexto adicional...</div>\n </div>\n }\n <ng-template #clarificationOptionContent let-opt let-index=\"index\" let-compact=\"compact\">\n @if (!compact) {\n <div class=\"clarification-decision-head\">\n <span class=\"clarification-decision-index\">{{ index + 1 }}</span>\n <span class=\"clarification-decision-type\">{{ getClarificationOptionKindLabel(opt) }}</span>\n <span class=\"spacer\"></span>\n @if (isClarificationSelected(opt)) {\n <span class=\"clarification-decision-state\">Selecionado</span>\n }\n </div>\n }\n @switch (getClarificationOptionLayout(opt)) {\n @case ('endpoint') {\n <div class=\"clarification-card\">\n <div class=\"clarification-card-header\">\n <mat-icon class=\"endpoint-icon\">{{ getEndpointIcon(opt) }}</mat-icon>\n @if (getEndpointMethod(opt); as method) {\n <span class=\"endpoint-method\" [attr.data-method]=\"method\">{{ method }}</span>\n }\n <span class=\"endpoint-label\">{{ opt.label }}</span>\n <span class=\"spacer\"></span>\n <mat-icon class=\"select-indicator\">\n {{ isClarificationSelected(opt) ? 'check_circle' : 'radio_button_unchecked' }}\n </mat-icon>\n </div>\n <div class=\"clarification-card-body\">\n @if (getEndpointPath(opt); as path) {\n <div class=\"endpoint-path\">{{ path }}</div>\n }\n @if (opt.contextHints?.description) {\n <div\n class=\"endpoint-description\"\n [matTooltip]=\"getDescriptionTooltip(opt)\"\n [matTooltipDisabled]=\"!shouldShowDescriptionTooltip(opt)\"\n >\n {{ opt.contextHints?.description }}\n </div>\n }\n </div>\n </div>\n }\n @case ('color') {\n <div class=\"clarification-color\">\n <span\n class=\"color-swatch\"\n [style.background]=\"getSafeHexColor(opt) || 'var(--md-sys-color-surface-container-highest)'\"\n ></span>\n <div class=\"color-meta\">\n <span class=\"color-label\">{{ opt.label }}</span>\n @if (opt.contextHints?.hexColor) {\n <span class=\"color-value\">{{ opt.contextHints?.hexColor }}</span>\n }\n </div>\n </div>\n }\n @case ('description') {\n <div class=\"clarification-description\">\n <span class=\"clarification-label\">{{ opt.label }}</span>\n @if (opt.contextHints?.description) {\n <span\n class=\"clarification-subtitle\"\n [matTooltip]=\"getDescriptionTooltip(opt)\"\n [matTooltipDisabled]=\"!shouldShowDescriptionTooltip(opt)\"\n >\n {{ opt.contextHints?.description }}\n </span>\n }\n </div>\n }\n @default {\n <span class=\"clarification-plain-label\">{{ opt.label }}</span>\n }\n }\n </ng-template>\n @if (warnings.length) {\n <div class=\"warnings-area\">\n <mat-icon class=\"warnings-icon\">warning_amber</mat-icon>\n <div class=\"warnings-content\">\n <div class=\"warnings-title\">Avisos</div>\n <div class=\"warnings-list\">\n @for (warning of warnings; track warning) {\n <div>{{ warning }}</div>\n }\n </div>\n </div>\n </div>\n }\n @if (clarificationQuestions.length) {\n <div\n class=\"clarification-questions\"\n [class.attention-highlight]=\"highlightClarificationDetails && !clarificationOptions.length\"\n >\n @for (question of clarificationQuestions; track question; let i = $index) {\n <div class=\"clarification-question\">\n <div class=\"clarification-question-label\">{{ question }}</div>\n <input\n type=\"text\"\n [(ngModel)]=\"clarificationAnswers[i]\"\n [placeholder]=\"'Resposta ' + (i + 1)\"\n autocomplete=\"off\">\n </div>\n }\n </div>\n }\n @if (clarificationOptions.length) {\n <div\n class=\"clarification-options-block\"\n [class.attention-highlight]=\"highlightClarificationDetails\"\n >\n <div class=\"clarification-options-title\">\n {{ clarificationOptions.length === 1 ? 'Decis\u00E3o sugerida' : 'Decis\u00F5es sugeridas' }}\n </div>\n @if (clarificationOptions.length === 1) {\n <div class=\"clarification-options-hint\">\n Etapa 2 de 4: confirme a melhor op\u00E7\u00E3o para continuar.\n </div>\n }\n @if (clarificationOptions.length > 1) {\n <div class=\"clarification-options-hint\">\n Etapa 2 de 4: selecione a alternativa mais aderente para gerar a proposta.\n </div>\n }\n @if (clarificationResponseType === 'confirm') {\n <div\n class=\"clarification-buttons\"\n [class.list]=\"clarificationPresentation === 'list'\"\n >\n @for (opt of clarificationOptions; track opt.value; let i = $index) {\n <button\n mat-button\n type=\"button\"\n (click)=\"onClarificationOptionClick(opt)\"\n class=\"clarification-option\"\n [class.selected]=\"isClarificationSelected(opt)\"\n [matTooltip]=\"getClarificationTooltip(opt)\"\n [matTooltipDisabled]=\"!shouldShowClarificationTooltip(opt) || isEndpointOption(opt)\"\n >\n <ng-container *ngTemplateOutlet=\"clarificationOptionContent; context: { $implicit: opt, index: i, compact: false }\"></ng-container>\n </button>\n }\n </div>\n }\n @if (clarificationSelectionMode === 'multiple') {\n <div\n class=\"clarification-buttons\"\n [class.list]=\"clarificationPresentation === 'list'\"\n >\n @for (opt of clarificationOptions; track opt.value; let i = $index) {\n <button\n mat-button\n type=\"button\"\n (click)=\"onClarificationOptionClick(opt)\"\n [class.selected]=\"isClarificationSelected(opt)\"\n class=\"clarification-option\"\n [matTooltip]=\"getClarificationTooltip(opt)\"\n [matTooltipDisabled]=\"!shouldShowClarificationTooltip(opt) || isEndpointOption(opt)\"\n >\n <ng-container *ngTemplateOutlet=\"clarificationOptionContent; context: { $implicit: opt, index: i, compact: false }\"></ng-container>\n </button>\n }\n </div>\n }\n @if (clarificationResponseType !== 'confirm' && clarificationSelectionMode === 'single' && clarificationPresentation !== 'chips') {\n <div\n class=\"clarification-buttons\"\n [class.list]=\"clarificationPresentation === 'list'\"\n >\n @for (opt of clarificationOptions; track opt.value; let i = $index) {\n <button\n mat-button\n type=\"button\"\n (click)=\"onClarificationOptionClick(opt)\"\n class=\"clarification-option\"\n [class.selected]=\"isClarificationSelected(opt)\"\n [matTooltip]=\"getClarificationTooltip(opt)\"\n [matTooltipDisabled]=\"!shouldShowClarificationTooltip(opt) || isEndpointOption(opt)\"\n >\n <ng-container *ngTemplateOutlet=\"clarificationOptionContent; context: { $implicit: opt, index: i, compact: false }\"></ng-container>\n </button>\n }\n </div>\n }\n @if (clarificationResponseType !== 'confirm' && clarificationSelectionMode === 'single' && clarificationPresentation === 'chips') {\n <div\n class=\"clarification-chips\"\n >\n @for (opt of clarificationOptions; track opt.value; let i = $index) {\n @if (isEndpointOption(opt)) {\n <button\n mat-button\n type=\"button\"\n class=\"clarification-option clarification-card-button\"\n (click)=\"onClarificationOptionClick(opt)\"\n [class.selected]=\"isClarificationSelected(opt)\"\n [matTooltip]=\"getClarificationTooltip(opt)\"\n [matTooltipDisabled]=\"!shouldShowClarificationTooltip(opt) || isEndpointOption(opt)\"\n >\n <ng-container *ngTemplateOutlet=\"clarificationOptionContent; context: { $implicit: opt, index: i, compact: false }\"></ng-container>\n </button>\n } @else {\n <mat-chip\n (click)=\"onClarificationOptionClick(opt)\"\n [matTooltip]=\"getClarificationTooltip(opt)\"\n [matTooltipDisabled]=\"!shouldShowClarificationTooltip(opt)\"\n class=\"clarification-chip\"\n >\n <ng-container *ngTemplateOutlet=\"clarificationOptionContent; context: { $implicit: opt, index: i, compact: true }\"></ng-container>\n </mat-chip>\n }\n }\n </div>\n }\n </div>\n }\n @if (clarificationAllowCustom && clarificationResponseType !== 'context') {\n <div\n class=\"clarification-manual-toggle\"\n >\n <span class=\"clarification-manual-label\">N\u00E3o encontrou o recurso?</span>\n <button mat-button type=\"button\" (click)=\"toggleManualInput()\">\n {{ showManualInput ? 'Ocultar resposta manual' : 'Responder manualmente' }}\n </button>\n </div>\n }\n @if (clarificationAllowCustom && showManualInput && clarificationResponseType !== 'context') {\n <div\n class=\"clarification-free\"\n >\n <input\n type=\"text\"\n [(ngModel)]=\"clarificationFreeText\"\n placeholder=\"Digite sua resposta\u2026\"\n autocomplete=\"off\"\n (keydown.enter)=\"confirmTaskAction()\"\n />\n </div>\n }\n @if (clarificationAllowCustom && showManualInput && clarificationResponseType !== 'context') {\n <div\n class=\"clarification-free-hint\"\n >\n Pressione Enter para enviar.\n </div>\n }\n </div>\n }\n\n <!-- STATE: REVIEW (Diff/Explanation) -->\n @if (state === 'review' && isActiveTab('task')) {\n <div\n class=\"review-area assistant-card\"\n id=\"assistant-panel-task\"\n role=\"tabpanel\"\n aria-labelledby=\"assistant-tab-task\"\n >\n @if (!shouldShowThoughtCard()) {\n <div class=\"task-header\">\n <div class=\"task-title\">{{ getTaskTitle() }}</div>\n <div class=\"task-subtitle\">{{ getTaskSubtitle() }}</div>\n @if (clarificationOptions.length > 1 && getTaskSelectionSummary(); as selectionSummary) {\n <div class=\"task-meta\">\n <span class=\"task-meta-label\">Selecionado:</span>\n <span class=\"task-meta-value\">{{ selectionSummary }}</span>\n </div>\n }\n @if (shouldShowTaskSteps()) {\n <div class=\"task-steps\">\n <span class=\"task-step\">1 Dados</span>\n <span class=\"task-step\">2 Layout</span>\n <span class=\"task-step active\">3 Revis\u00E3o</span>\n </div>\n }\n </div>\n }\n @if (warnings.length) {\n <div class=\"warnings-area\">\n <mat-icon class=\"warnings-icon\">warning_amber</mat-icon>\n <div class=\"warnings-content\">\n <div class=\"warnings-title\">Avisos</div>\n <div class=\"warnings-list\">\n @for (warning of warnings; track warning) {\n <div>{{ warning }}</div>\n }\n </div>\n </div>\n </div>\n }\n <div class=\"review-trust\">\n <span class=\"trust-chip\" [matTooltip]=\"getScopeTooltip()\">{{ getScopeLabel() }}</span>\n <span class=\"trust-chip\" [matTooltip]=\"getConfidenceTooltip()\">{{ getConfidenceLabel() }}</span>\n <span class=\"trust-chip risk-chip\" [class.medium]=\"getReviewRiskLevel() === 'm\u00E9dio'\" [class.high]=\"getReviewRiskLevel() === 'alto'\">\n Risco {{ getReviewRiskLevel() }}\n </span>\n </div>\n <div class=\"review-summary\" [class.attention-highlight]=\"highlightReviewDetails\">\n <div class=\"review-summary-title\">Resumo da proposta</div>\n <div class=\"review-summary-line\">{{ getReviewSummary() }}</div>\n </div>\n <div class=\"review-diff\">\n <div class=\"review-diff-title\">Pr\u00E9via de mudan\u00E7as</div>\n @if (pendingDiff.length) {\n <div class=\"review-diff-summary\">\n @for (line of getDiffSummaryLines(); track line) {\n <div class=\"review-diff-line\">{{ line }}</div>\n }\n @if (pendingDiff.length > 3) {\n <div class=\"review-diff-more\">\u2026 +{{ pendingDiff.length - 3 }} mudan\u00E7as</div>\n }\n </div>\n <button mat-stroked-button type=\"button\" class=\"review-diff-toggle\" (click)=\"toggleFullDiff()\">\n {{ getDiffToggleLabel() }}\n </button>\n } @else {\n <div class=\"review-diff-empty\">\n N\u00E3o foi poss\u00EDvel gerar um diff estruturado. Revise o resumo e aplique com cautela.\n </div>\n }\n @if (showFullDiff && pendingDiff.length) {\n <div class=\"review-diff-full\">\n @for (diff of pendingDiff; track diff.path) {\n <div class=\"review-diff-block\">\n <div class=\"review-diff-path\">{{ diff.path }}</div>\n <div class=\"review-diff-label\">Antes:</div>\n <pre>{{ diff.before | json }}</pre>\n <div class=\"review-diff-label\">Depois:</div>\n <pre>{{ diff.after | json }}</pre>\n </div>\n }\n </div>\n }\n </div>\n @if (aiExplanation.trim()) {\n <div class=\"ai-explanation\">\n {{ aiExplanation }}\n </div>\n }\n </div>\n }\n\n <!-- STATE: ERROR -->\n @if (state === 'error' && (isActiveTab('task') || (!isTaskMode() && isActiveTab('suggestions')))) {\n <div\n class=\"error-area assistant-card\"\n [attr.id]=\"isTaskMode() ? 'assistant-panel-task' : 'assistant-panel-suggestions'\"\n role=\"tabpanel\"\n [attr.aria-labelledby]=\"isTaskMode() ? 'assistant-tab-task' : 'assistant-tab-suggestions'\"\n >\n <div class=\"error-msg\">\n <mat-icon color=\"warn\">error_outline</mat-icon>\n <span>{{ errorMsg }}</span>\n </div>\n @if (warnings.length) {\n <div class=\"warnings-area\">\n <mat-icon class=\"warnings-icon\">warning_amber</mat-icon>\n <div class=\"warnings-content\">\n <div class=\"warnings-title\">Avisos</div>\n <div class=\"warnings-list\">\n @for (warning of warnings; track warning) {\n <div>{{ warning }}</div>\n }\n </div>\n </div>\n </div>\n }\n @if (shouldShowApplyDetails()) {\n <div class=\"apply-details\">\n <div class=\"apply-details-header\">\n <div class=\"apply-details-title\">Detalhes da aplica\u00E7\u00E3o</div>\n @if (allowManualPatchEdit) {\n <div class=\"apply-details-actions\">\n <button mat-button type=\"button\" (click)=\"togglePatchPathEditor()\" [disabled]=\"!pendingPatch\">\n {{ patchPathEditorExpanded ? 'Ocultar paths' : 'Editar por path' }}\n </button>\n <button mat-button type=\"button\" (click)=\"togglePatchEditor()\" [disabled]=\"!pendingPatch\">\n {{ patchEditorExpanded ? 'Ocultar editor' : 'Editar patch' }}\n </button>\n </div>\n }\n </div>\n @if (lastApplyAt) {\n <div class=\"apply-details-meta\">\n \u00DAltima tentativa: {{ lastApplyAt | date:'short' }}\n </div>\n }\n @if (getApplyPaths().length) {\n <div class=\"apply-paths\">\n @for (path of getApplyPaths(); track path) {\n <span class=\"apply-path-chip\">{{ path }}</span>\n }\n </div>\n }\n @if (applyWarnings.length) {\n <div class=\"apply-warnings\">\n <div class=\"apply-warnings-title\">Avisos da aplica\u00E7\u00E3o</div>\n <div class=\"apply-warnings-list\">\n @for (warning of applyWarnings; track warning) {\n <div>{{ warning }}</div>\n }\n </div>\n </div>\n }\n @if (allowManualPatchEdit && patchPathEditorExpanded) {\n <div class=\"patch-path-editor\">\n <div class=\"patch-editor-label\">Editar por path</div>\n <div class=\"patch-editor-hint\">Texto simples vira string; para for\u00E7ar texto em true/false/n\u00FAmero, use aspas.</div>\n @if (!getEditablePatchPathEdits().length) {\n <div class=\"patch-path-editor-empty\">\n Nenhum path edit\u00E1vel dispon\u00EDvel para este patch.\n </div>\n }\n @if (getEditablePatchPathEdits().length) {\n <div class=\"patch-path-rows\">\n @for (edit of getEditablePatchPathEdits(); track edit.path; let i = $index) {\n <div class=\"patch-path-row\">\n <div class=\"patch-path-label\">{{ edit.path }}</div>\n <input\n type=\"text\"\n [(ngModel)]=\"patchPathEdits[i].valueText\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n />\n @if (patchPathEdits[i].error) {\n <div class=\"patch-editor-error\">{{ patchPathEdits[i].error }}</div>\n }\n </div>\n }\n </div>\n }\n @if (patchPathEditorError) {\n <div class=\"patch-editor-error\">{{ patchPathEditorError }}</div>\n }\n <div class=\"patch-editor-actions\">\n <button mat-button type=\"button\" (click)=\"resetPatchPathEdits()\">\n Restaurar valores\n </button>\n <button mat-button type=\"button\" (click)=\"applyPathEditsToPatch()\">\n Aplicar no patch\n </button>\n <button mat-flat-button color=\"primary\" type=\"button\" (click)=\"reapplyPathEdits()\">\n Reaplicar por path\n </button>\n </div>\n </div>\n }\n @if (allowManualPatchEdit && patchEditorExpanded) {\n <div class=\"patch-editor\">\n <label class=\"patch-editor-label\">Patch JSON</label>\n <textarea\n [(ngModel)]=\"patchEditorText\"\n spellcheck=\"false\"\n ></textarea>\n @if (patchEditorError) {\n <div class=\"patch-editor-error\">{{ patchEditorError }}</div>\n }\n <div class=\"patch-editor-actions\">\n <button mat-button type=\"button\" (click)=\"resetPatchEditor()\">\n Restaurar original\n </button>\n <button mat-flat-button color=\"primary\" type=\"button\" (click)=\"reapplyEditedPatch()\">\n Reaplicar patch\n </button>\n </div>\n </div>\n }\n </div>\n }\n <div class=\"review-actions\">\n <button mat-button (click)=\"close()\">Fechar</button>\n <button mat-stroked-button (click)=\"retry()\">Tentar Novamente</button>\n </div>\n </div>\n }\n\n <!-- STATE: SUCCESS -->\n @if (state === 'success' && (isActiveTab('task') || (!isTaskMode() && isActiveTab('suggestions')))) {\n <div\n class=\"success-area assistant-card\"\n [attr.id]=\"isTaskMode() ? 'assistant-panel-task' : 'assistant-panel-suggestions'\"\n role=\"tabpanel\"\n [attr.aria-labelledby]=\"isTaskMode() ? 'assistant-tab-task' : 'assistant-tab-suggestions'\"\n >\n <div class=\"success-msg\">\n <mat-icon class=\"success-icon\">check_circle</mat-icon>\n <span>{{ aiExplanation || 'Configura\u00E7\u00E3o atualizada.' }}</span>\n </div>\n @if (warnings.length) {\n <div class=\"warnings-area\">\n <mat-icon class=\"warnings-icon\">warning_amber</mat-icon>\n <div class=\"warnings-content\">\n <div class=\"warnings-title\">Avisos</div>\n <div class=\"warnings-list\">\n @for (warning of warnings; track warning) {\n <div>{{ warning }}</div>\n }\n </div>\n </div>\n </div>\n }\n @if (shouldShowApplyDetails()) {\n <div class=\"apply-details\">\n <div class=\"apply-details-header\">\n <div class=\"apply-details-title\">Detalhes da aplica\u00E7\u00E3o</div>\n @if (allowManualPatchEdit) {\n <div class=\"apply-details-actions\">\n <button mat-button type=\"button\" (click)=\"togglePatchPathEditor()\" [disabled]=\"!pendingPatch\">\n {{ patchPathEditorExpanded ? 'Ocultar paths' : 'Editar por path' }}\n </button>\n <button mat-button type=\"button\" (click)=\"togglePatchEditor()\" [disabled]=\"!pendingPatch\">\n {{ patchEditorExpanded ? 'Ocultar editor' : 'Editar e reaplicar' }}\n </button>\n </div>\n }\n </div>\n @if (lastApplyAt) {\n <div class=\"apply-details-meta\">\n Aplicado em {{ lastApplyAt | date:'short' }}\n </div>\n }\n @if (getApplyPaths().length) {\n <div class=\"apply-paths\">\n @for (path of getApplyPaths(); track path) {\n <span class=\"apply-path-chip\">{{ path }}</span>\n }\n </div>\n }\n @if (applyWarnings.length) {\n <div class=\"apply-warnings\">\n <div class=\"apply-warnings-title\">Avisos da aplica\u00E7\u00E3o</div>\n <div class=\"apply-warnings-list\">\n @for (warning of applyWarnings; track warning) {\n <div>{{ warning }}</div>\n }\n </div>\n </div>\n }\n @if (allowManualPatchEdit && patchPathEditorExpanded) {\n <div class=\"patch-path-editor\">\n <div class=\"patch-editor-label\">Editar por path</div>\n <div class=\"patch-editor-hint\">Texto simples vira string; para for\u00E7ar texto em true/false/n\u00FAmero, use aspas.</div>\n @if (!getEditablePatchPathEdits().length) {\n <div class=\"patch-path-editor-empty\">\n Nenhum path edit\u00E1vel dispon\u00EDvel para este patch.\n </div>\n }\n @if (getEditablePatchPathEdits().length) {\n <div class=\"patch-path-rows\">\n @for (edit of getEditablePatchPathEdits(); track edit.path; let i = $index) {\n <div class=\"patch-path-row\">\n <div class=\"patch-path-label\">{{ edit.path }}</div>\n <input\n type=\"text\"\n [(ngModel)]=\"patchPathEdits[i].valueText\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n />\n @if (patchPathEdits[i].error) {\n <div class=\"patch-editor-error\">{{ patchPathEdits[i].error }}</div>\n }\n </div>\n }\n </div>\n }\n @if (patchPathEditorError) {\n <div class=\"patch-editor-error\">{{ patchPathEditorError }}</div>\n }\n <div class=\"patch-editor-actions\">\n <button mat-button type=\"button\" (click)=\"resetPatchPathEdits()\">\n Restaurar valores\n </button>\n <button mat-button type=\"button\" (click)=\"applyPathEditsToPatch()\">\n Aplicar no patch\n </button>\n <button mat-flat-button color=\"primary\" type=\"button\" (click)=\"reapplyPathEdits()\">\n Reaplicar por path\n </button>\n </div>\n </div>\n }\n @if (allowManualPatchEdit && patchEditorExpanded) {\n <div class=\"patch-editor\">\n <label class=\"patch-editor-label\">Patch JSON</label>\n <textarea\n [(ngModel)]=\"patchEditorText\"\n spellcheck=\"false\"\n ></textarea>\n @if (patchEditorError) {\n <div class=\"patch-editor-error\">{{ patchEditorError }}</div>\n }\n <div class=\"patch-editor-actions\">\n <button mat-button type=\"button\" (click)=\"resetPatchEditor()\">\n Restaurar original\n </button>\n <button mat-flat-button color=\"primary\" type=\"button\" (click)=\"reapplyEditedPatch()\">\n Reaplicar patch\n </button>\n </div>\n </div>\n }\n </div>\n }\n <button mat-button color=\"warn\" (click)=\"undoLastChange()\">\n <mat-icon>undo</mat-icon> Desfazer\n </button>\n </div>\n }\n\n </div>\n\n <div class=\"assistant-footer\">\n @if (!isTaskMode()) {\n <button\n mat-icon-button\n type=\"button\"\n class=\"composer-leading composer-leading-btn\"\n [matMenuTriggerFor]=\"assistantQuickMenu\"\n aria-label=\"Abrir a\u00E7\u00F5es r\u00E1pidas\"\n matTooltip=\"A\u00E7\u00F5es r\u00E1pidas\"\n >\n <mat-icon>add</mat-icon>\n </button>\n <input\n #inputEl\n type=\"text\"\n [(ngModel)]=\"userPrompt\"\n [disabled]=\"state === 'processing' || state === 'applying'\"\n placeholder=\"Descreva a altera\u00E7\u00E3o que deseja aplicar\u2026\"\n autocomplete=\"off\"\n />\n <div class=\"send-actions\">\n @if (state === 'listening') {\n <button\n mat-icon-button\n class=\"send-btn\"\n (click)=\"submitPrompt()\"\n [disabled]=\"!userPrompt.trim()\"\n [class.ready]=\"!!userPrompt.trim()\"\n >\n <mat-icon>arrow_upward</mat-icon>\n </button>\n }\n @if (state === 'processing' || state === 'applying') {\n <mat-spinner diameter=\"20\"></mat-spinner>\n }\n </div>\n } @else {\n <div class=\"task-footer\">\n <div class=\"task-footer-left\">\n <button mat-button type=\"button\" (click)=\"handleTaskSecondary()\">{{ getTaskCancelLabel() }}</button>\n @if (state === 'review') {\n <button\n mat-stroked-button\n type=\"button\"\n (click)=\"retry()\"\n >\n {{ getTaskSecondaryLabel() }}\n </button>\n }\n </div>\n <div class=\"task-footer-right\">\n <button\n class=\"task-primary-btn\"\n mat-flat-button\n color=\"primary\"\n type=\"button\"\n (click)=\"confirmTaskAction()\"\n [disabled]=\"isTaskPrimaryDisabled()\"\n >\n {{ getTaskPrimaryLabel() }}\n </button>\n @if (state === 'processing' || state === 'applying') {\n <mat-spinner diameter=\"20\"></mat-spinner>\n }\n </div>\n </div>\n }\n </div>\n\n <mat-menu #assistantQuickMenu=\"matMenu\" panelClass=\"assistant-quick-menu-panel\">\n <button mat-menu-item type=\"button\" (click)=\"setActiveTab('chat')\">\n <mat-icon>history</mat-icon>\n <span>Hist\u00F3rico</span>\n </button>\n <button mat-menu-item type=\"button\" (click)=\"setActiveTab('suggestions')\">\n <mat-icon>lightbulb</mat-icon>\n <span>Sugest\u00F5es</span>\n </button>\n <button mat-menu-item type=\"button\" (click)=\"startNewSession()\">\n <mat-icon>add_comment</mat-icon>\n <span>Nova conversa</span>\n </button>\n <button mat-menu-item type=\"button\" (click)=\"refreshSuggestions()\" [disabled]=\"loadingSuggestions\">\n <mat-icon>refresh</mat-icon>\n <span>Atualizar sugest\u00F5es</span>\n </button>\n <button\n mat-menu-item\n type=\"button\"\n (click)=\"restoreDismissedSuggestions()\"\n [disabled]=\"!hasDismissedSuggestions()\"\n >\n <mat-icon>visibility</mat-icon>\n <span>Restaurar sugest\u00F5es ocultas</span>\n </button>\n <button\n mat-menu-item\n type=\"button\"\n class=\"assistant-quick-menu-danger\"\n (click)=\"clearHistory()\"\n [disabled]=\"!historySessions.length\"\n >\n <mat-icon>delete_outline</mat-icon>\n <span>Limpar hist\u00F3rico local</span>\n </button>\n </mat-menu>\n </div>\n\n</ng-template>\n", styles: ["@keyframes assistantPremiumEnter{0%{opacity:0;transform:translate(14px) scale(.99)}to{opacity:1;transform:translate(0) scale(1)}}:host ::ng-deep .ai-assistant-backdrop{background:color-mix(in srgb,var(--md-sys-color-scrim, var(--md-sys-color-shadow, var(--md-sys-color-on-surface))) 42%,transparent);-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}::ng-deep .ai-assistant-overlay-pane{max-width:calc(100vw - 24px);max-height:calc(100vh - 24px)}.ai-assistant-panel{box-sizing:border-box;width:min(604px,100vw - 18px);min-height:min(620px,100vh - 18px);max-height:min(820px,100vh - 18px);display:flex;flex-direction:column;overflow:hidden;color:var(--md-sys-color-on-surface);border-left:1px solid color-mix(in srgb,var(--md-sys-color-primary) 24%,var(--md-sys-color-outline-variant));border-top:1px solid color-mix(in srgb,var(--md-sys-color-primary) 18%,var(--md-sys-color-outline-variant));border-bottom:1px solid color-mix(in srgb,var(--md-sys-color-primary) 18%,var(--md-sys-color-outline-variant));box-shadow:0 18px 48px color-mix(in srgb,var(--md-sys-color-shadow, var(--md-sys-color-on-surface)) 42%,transparent),inset 0 1px color-mix(in srgb,var(--md-sys-color-on-surface) 10%,transparent);background:radial-gradient(circle at 14% 8%,color-mix(in srgb,var(--md-sys-color-primary-container) 38%,transparent) 0%,transparent 44%),linear-gradient(165deg,color-mix(in srgb,var(--md-sys-color-surface-container-highest) 88%,var(--md-sys-color-surface)),var(--md-sys-color-surface));animation:assistantPremiumEnter .24s cubic-bezier(.22,1,.36,1)}.assistant-header{position:relative;display:flex;align-items:flex-start;justify-content:space-between;gap:12px;padding:12px 16px 10px;border-bottom:1px solid color-mix(in srgb,var(--md-sys-color-primary) 18%,var(--md-sys-color-outline-variant));background:linear-gradient(130deg,color-mix(in srgb,var(--md-sys-color-primary-container) 28%,transparent) 0%,transparent 52%),var(--md-sys-color-surface-container-low)}.assistant-header:after{content:\"\";position:absolute;left:16px;right:16px;bottom:-1px;height:1px;background:linear-gradient(90deg,color-mix(in srgb,var(--md-sys-color-primary) 55%,transparent),transparent);pointer-events:none}.assistant-header .assistant-header__left{min-width:0;display:flex;align-items:flex-start;gap:12px}.assistant-header .magic-icon{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;width:30px;height:30px;font-size:18px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 30%,transparent);box-shadow:0 4px 12px color-mix(in srgb,var(--md-sys-color-primary) 26%,transparent)}.assistant-header .assistant-title-group{min-width:0;display:flex;flex-direction:column;gap:4px}.assistant-header .assistant-title{font-size:15px;font-weight:700;letter-spacing:.01em;overflow-wrap:anywhere}.assistant-header .assistant-subtitle{display:block;font-size:11px;line-height:1.25;color:color-mix(in srgb,var(--md-sys-color-on-surface) 70%,var(--md-sys-color-on-surface-variant));overflow-wrap:anywhere}.assistant-header-chips{display:inline-flex;align-items:center;flex-wrap:wrap;gap:6px}.assistant-header .mode-chip{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;border-radius:999px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 28%,var(--md-sys-color-outline-variant));background:color-mix(in srgb,var(--md-sys-color-primary-container) 64%,var(--md-sys-color-surface-container));color:color-mix(in srgb,var(--md-sys-color-on-primary-container) 85%,var(--md-sys-color-on-surface));font-size:10px;font-weight:700;letter-spacing:.04em;text-transform:uppercase}.assistant-header .mode-chip:before{content:\"\";width:6px;height:6px;border-radius:999px;background:currentColor;box-shadow:0 0 0 3px color-mix(in srgb,currentColor 16%,transparent)}.assistant-header .mode-chip.mock{border-color:color-mix(in srgb,var(--md-sys-color-error) 34%,var(--md-sys-color-outline-variant));background:color-mix(in srgb,var(--md-sys-color-error-container) 72%,var(--md-sys-color-surface-container));color:color-mix(in srgb,var(--md-sys-color-on-error-container) 85%,var(--md-sys-color-error))}.assistant-header .policy-chip{padding:2px 8px;border-radius:999px;border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant) 84%,transparent);background:var(--md-sys-color-surface-container-high);font-size:10px;letter-spacing:.02em;font-weight:600}.assistant-header .policy-chip.strict{border-color:color-mix(in srgb,var(--md-sys-color-primary) 42%,var(--md-sys-color-outline-variant));background:color-mix(in srgb,var(--md-sys-color-primary-container) 56%,var(--md-sys-color-surface-container-high))}.assistant-status{display:flex;align-items:flex-start;gap:10px;padding:10px 16px;border-bottom:1px solid color-mix(in srgb,var(--md-sys-color-primary) 18%,var(--md-sys-color-outline-variant));border-radius:0;background:linear-gradient(160deg,color-mix(in srgb,var(--md-sys-color-primary-container) 24%,transparent),transparent 48%),var(--md-sys-color-surface-container-low)}.assistant-status-dot{width:8px;height:8px;margin-top:6px;border-radius:999px;flex:0 0 auto;background:var(--md-sys-color-primary);box-shadow:0 0 0 4px color-mix(in srgb,var(--md-sys-color-primary) 16%,transparent)}.assistant-status.warning .assistant-status-dot{background:var(--md-sys-color-error);box-shadow:0 0 0 4px color-mix(in srgb,var(--md-sys-color-error) 16%,transparent)}.assistant-status.success .assistant-status-dot{background:color-mix(in srgb,var(--md-sys-color-primary) 74%,var(--md-sys-color-tertiary, var(--md-sys-color-primary)))}.assistant-status-content{min-width:0;display:flex;flex-direction:column;gap:2px}.assistant-status-label{display:flex;align-items:center;flex-wrap:wrap;gap:4px;font-size:12px;font-weight:700;line-height:1.35}.assistant-status-detail{font-size:11px;line-height:1.4;color:var(--md-sys-color-on-surface-variant);overflow-wrap:anywhere}.assistant-status-mode{padding:1px 6px;border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-primary-container) 72%,transparent);color:var(--md-sys-color-on-primary-container);font-size:10px;font-weight:700}.assistant-nav{padding:8px 16px 0}.assistant-nav .assistant-tabs{display:flex;align-items:center;gap:4px;border-radius:12px;padding:5px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 24%,var(--md-sys-color-outline-variant));border-color:color-mix(in srgb,var(--md-sys-color-primary) 24%,var(--md-sys-color-outline-variant));background:linear-gradient(155deg,color-mix(in srgb,var(--md-sys-color-primary-container) 14%,transparent),transparent 58%),var(--md-sys-color-surface-container-low)}.assistant-nav .assistant-tab{appearance:none;min-width:0;min-height:30px;border:0;border-radius:8px;padding:0 10px;background:transparent;color:var(--md-sys-color-on-surface-variant);cursor:pointer;display:inline-flex;align-items:center;justify-content:center;flex:1 1 0;font-size:11px;font-weight:700;letter-spacing:.01em}.assistant-nav .assistant-tab.active{background:var(--md-sys-color-surface-container-highest);color:var(--md-sys-color-on-surface);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--md-sys-color-primary) 34%,transparent),0 6px 12px color-mix(in srgb,var(--md-sys-color-primary) 18%,transparent)}.assistant-section,.assistant-card{border-radius:14px;border-color:color-mix(in srgb,var(--md-sys-color-primary) 20%,var(--md-sys-color-outline-variant));background:linear-gradient(160deg,color-mix(in srgb,var(--md-sys-color-primary-container) 16%,transparent),transparent 50%),var(--md-sys-color-surface-container-lowest);box-shadow:0 6px 18px color-mix(in srgb,var(--md-sys-color-shadow, var(--md-sys-color-on-surface)) 12%,transparent),inset 0 1px color-mix(in srgb,var(--md-sys-color-on-surface) 7%,transparent)}.suggestions-hero{margin:2px 0 4px;padding:10px 12px;border-radius:12px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 24%,var(--md-sys-color-outline-variant));background:linear-gradient(120deg,color-mix(in srgb,var(--md-sys-color-primary-container) 34%,transparent) 0%,transparent 52%),var(--md-sys-color-surface-container-low)}.suggestions-hero__label{font-size:10px;letter-spacing:.08em;text-transform:uppercase;font-weight:700;color:var(--md-sys-color-on-surface-variant);opacity:.88}.suggestions-hero__title{margin-top:2px;font-size:13px;font-weight:700;color:var(--md-sys-color-on-surface)}.suggestions-hero__detail{margin-top:4px;font-size:12px;line-height:1.4;color:color-mix(in srgb,var(--md-sys-color-on-surface) 78%,var(--md-sys-color-on-surface-variant))}.suggestions-content .suggestion-item{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:12px;padding:12px;border-radius:12px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 18%,var(--md-sys-color-outline-variant));border-color:color-mix(in srgb,var(--md-sys-color-primary) 18%,var(--md-sys-color-outline-variant));background:linear-gradient(140deg,color-mix(in srgb,var(--md-sys-color-primary-container) 16%,transparent),transparent 56%),var(--md-sys-color-surface-container-lowest);transition:transform .2s cubic-bezier(.25,.8,.25,1),border-color .2s ease,box-shadow .2s ease}.suggestions-list{display:flex;flex-direction:column;gap:10px}.suggestion-copy{min-width:0;display:grid;gap:4px}.suggestion-main{min-width:0;display:flex;align-items:center;flex-wrap:wrap;gap:8px}.suggestion-icon{width:18px;height:18px;font-size:18px;flex:0 0 auto;color:var(--md-sys-color-primary)}.suggestion-label{min-width:0;font-size:13px;font-weight:700;line-height:1.35;overflow-wrap:anywhere}.suggestion-group{padding:2px 6px;border-radius:999px;background:var(--md-sys-color-surface-container-high);color:var(--md-sys-color-on-surface-variant);font-size:10px;font-weight:700;line-height:1.2}.suggestion-desc{font-size:12px;line-height:1.35;color:var(--md-sys-color-on-surface-variant);overflow-wrap:anywhere}.suggestion-actions{display:inline-flex;align-items:center;justify-content:flex-end;gap:4px}.suggestion-action-btn,.suggestion-arrow{width:32px;height:32px;display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;color:var(--md-sys-color-on-surface-variant)}.suggestions-content .suggestion-item:hover,.suggestions-content .suggestion-item:focus-visible{border-color:color-mix(in srgb,var(--md-sys-color-primary) 58%,var(--md-sys-color-outline-variant));box-shadow:0 8px 18px color-mix(in srgb,var(--md-sys-color-primary) 18%,transparent),inset 0 0 0 1px color-mix(in srgb,var(--md-sys-color-primary) 28%,transparent);transform:translateY(-2px) scale(1.01)}.assistant-footer{display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:8px;padding:10px 16px;border-top-color:color-mix(in srgb,var(--md-sys-color-primary) 20%,var(--md-sys-color-outline-variant));background:linear-gradient(180deg,color-mix(in srgb,var(--md-sys-color-primary-container) 16%,transparent),transparent 56%),var(--md-sys-color-surface-container-low)}.assistant-footer .task-footer{grid-column:1/-1}.composer-leading{width:30px;height:30px;display:inline-flex;align-items:center;justify-content:center;border-radius:999px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 30%,var(--md-sys-color-outline-variant));background:color-mix(in srgb,var(--md-sys-color-primary-container) 70%,var(--md-sys-color-surface-container-low));color:var(--md-sys-color-primary);box-shadow:0 4px 10px color-mix(in srgb,var(--md-sys-color-primary) 16%,transparent)}.composer-leading mat-icon{width:16px;height:16px;font-size:16px}.assistant-footer input{box-sizing:border-box;width:100%;min-width:0;height:34px;border:1px solid;border-radius:8px;padding:0 12px;color:var(--md-sys-color-on-surface);border-color:color-mix(in srgb,var(--md-sys-color-primary) 24%,var(--md-sys-color-outline-variant));background:var(--md-sys-color-surface);box-shadow:inset 0 1px 2px color-mix(in srgb,var(--md-sys-color-shadow, var(--md-sys-color-on-surface)) 12%,transparent)}.send-actions{min-width:36px;display:inline-flex;align-items:center;justify-content:center}.assistant-footer .send-btn{--mdc-icon-button-icon-size: 20px;--mdc-icon-button-state-layer-size: 36px;--mat-icon-button-state-layer-size: 36px;width:36px;height:36px;padding:8px;line-height:1;display:inline-flex;align-items:center;justify-content:center;border-color:color-mix(in srgb,var(--md-sys-color-primary) 24%,var(--md-sys-color-outline-variant));background:var(--md-sys-color-surface)}.assistant-footer .send-btn mat-icon{width:20px;height:20px;margin:0;font-size:20px;line-height:20px;display:inline-flex;align-items:center;justify-content:center}.assistant-footer .send-btn.ready{background:linear-gradient(135deg,color-mix(in srgb,var(--md-sys-color-primary-container) 84%,var(--md-sys-color-primary)),var(--md-sys-color-primary));color:var(--md-sys-color-on-primary);box-shadow:0 8px 18px color-mix(in srgb,var(--md-sys-color-primary) 30%,transparent)}.task-primary-btn{border-radius:12px;box-shadow:0 8px 18px color-mix(in srgb,var(--md-sys-color-primary) 24%,transparent)}@media(max-width:959px){.assistant-header{padding:12px 12px 10px}.assistant-section,.assistant-card{margin:4px 12px 10px}.assistant-header:after{left:12px;right:12px}.assistant-header .assistant-title{font-size:14px}.assistant-header .assistant-subtitle{font-size:10px}.assistant-footer{grid-template-columns:minmax(0,1fr) auto}.composer-leading{display:none}}.assistant-thought{margin-top:0;gap:10px;border-color:color-mix(in srgb,var(--md-sys-color-primary) 26%,var(--md-sys-color-outline-variant));background:linear-gradient(145deg,color-mix(in srgb,var(--md-sys-color-primary-container) 28%,transparent),transparent 58%),var(--md-sys-color-surface-container-low)}.assistant-thought-meta{display:inline-flex;align-items:center;gap:6px;font-size:11px;color:var(--md-sys-color-on-surface-variant)}.assistant-thought-meta mat-icon{width:15px;height:15px;font-size:15px;color:var(--md-sys-color-primary)}.assistant-thought-summary{font-size:13px;line-height:1.45;color:var(--md-sys-color-on-surface)}.assistant-thought-plan{border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 32%,var(--md-sys-color-outline-variant));border-radius:12px;padding:10px;background:var(--md-sys-color-surface-container-lowest);display:flex;flex-direction:column;gap:8px}.assistant-thought-plan-title{font-size:13px;font-weight:700;color:var(--md-sys-color-on-surface)}.assistant-thought-plan-actions{display:grid;grid-template-columns:repeat(auto-fit,minmax(0,1fr));gap:8px}.assistant-thought-plan-actions .mdc-button{min-width:0}.assistant-thought-plan-hint{font-size:11px;color:var(--md-sys-color-on-surface-variant);line-height:1.35}.assistant-thought-checklist{display:flex;flex-direction:column;gap:5px}.assistant-thought-checklist-item{display:inline-flex;align-items:center;gap:6px;font-size:12px;color:var(--md-sys-color-on-surface-variant)}.assistant-thought-checklist-item mat-icon{width:14px;height:14px;font-size:14px}.assistant-thought-shimmer{display:flex;flex-direction:column;gap:8px;margin-top:4px}.assistant-thought-shimmer .shimmer-line{height:12px;border-radius:4px;position:relative;overflow:hidden;background:var(--md-sys-color-surface-container-highest)}.assistant-thought-shimmer .shimmer-line:after{content:\"\";position:absolute;inset:0;transform:translate(-100%);background:linear-gradient(90deg,transparent,color-mix(in srgb,var(--md-sys-color-primary) 8%,transparent),transparent);animation:assistantShimmerEffect 1.5s infinite}.assistant-thought-shimmer .shimmer-line-1{width:85%}.assistant-thought-shimmer .shimmer-line-2{width:92%}.assistant-thought-shimmer .shimmer-line-3{width:64%}@keyframes assistantShimmerEffect{to{transform:translate(100%)}}.assistant-flow{grid-template-columns:1fr;gap:6px}.flow-step{display:flex;align-items:flex-start;gap:8px;text-align:left;padding:7px 8px;border-radius:10px}.flow-step-index{width:18px;height:18px;border-radius:999px;display:inline-flex;align-items:center;justify-content:center;font-size:10px;font-weight:700;border:1px solid var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface-container-highest);color:var(--md-sys-color-on-surface);flex:0 0 auto}.flow-step-content{min-width:0;display:flex;flex-direction:column;gap:1px}.flow-step-label{font-size:11px;font-weight:700;color:var(--md-sys-color-on-surface)}.flow-step-detail{font-size:11px;color:var(--md-sys-color-on-surface-variant);line-height:1.3}.flow-step.active .flow-step-index{border-color:color-mix(in srgb,var(--md-sys-color-primary) 60%,var(--md-sys-color-outline-variant));background:color-mix(in srgb,var(--md-sys-color-primary-container) 85%,var(--md-sys-color-surface-container-highest));color:var(--md-sys-color-on-primary-container)}.flow-step.done .flow-step-index{border-color:transparent;background:color-mix(in srgb,var(--md-sys-color-primary) 18%,var(--md-sys-color-surface-container-highest))}.task-timeline{margin-top:4px;display:grid;gap:6px}.task-timeline-item{display:flex;align-items:flex-start;gap:8px;border:1px solid var(--md-sys-color-outline-variant);border-radius:10px;padding:6px 8px;background:var(--md-sys-color-surface-container-low);opacity:.76}.task-timeline-item.active{opacity:1;border-color:color-mix(in srgb,var(--md-sys-color-primary) 40%,var(--md-sys-color-outline-variant));background:color-mix(in srgb,var(--md-sys-color-primary-container) 34%,var(--md-sys-color-surface-container-low))}.task-timeline-item.done{opacity:.9;border-color:color-mix(in srgb,var(--md-sys-color-primary) 24%,var(--md-sys-color-outline-variant))}.task-timeline-dot{width:18px;height:18px;border-radius:999px;display:inline-flex;align-items:center;justify-content:center;font-size:10px;font-weight:700;border:1px solid var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface-container-highest);color:var(--md-sys-color-on-surface);flex:0 0 auto}.task-timeline-copy{min-width:0;display:flex;flex-direction:column;gap:1px}.task-timeline-title{font-size:11px;font-weight:700;color:var(--md-sys-color-on-surface)}.task-timeline-detail{font-size:11px;line-height:1.3;color:var(--md-sys-color-on-surface-variant)}.clarification-decision-head{display:inline-flex;align-items:center;width:100%;gap:6px;padding:8px 12px 0;box-sizing:border-box}.clarification-decision-index{width:18px;height:18px;border-radius:999px;display:inline-flex;align-items:center;justify-content:center;font-size:10px;font-weight:700;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 35%,var(--md-sys-color-outline-variant));color:var(--md-sys-color-primary);background:color-mix(in srgb,var(--md-sys-color-primary-container) 68%,transparent)}.clarification-decision-type{font-size:10px;letter-spacing:.08em;text-transform:uppercase;color:var(--md-sys-color-on-surface-variant);opacity:.92}.clarification-decision-state{font-size:10px;font-weight:700;color:var(--md-sys-color-primary)}.clarification-option{border-color:color-mix(in srgb,var(--md-sys-color-primary) 20%,var(--md-sys-color-outline-variant));background:linear-gradient(145deg,color-mix(in srgb,var(--md-sys-color-primary-container) 16%,transparent),transparent 55%),var(--md-sys-color-surface-container-low)}.clarification-option.selected{border-color:color-mix(in srgb,var(--md-sys-color-primary) 56%,var(--md-sys-color-outline-variant));background:linear-gradient(145deg,color-mix(in srgb,var(--md-sys-color-primary-container) 44%,transparent),transparent 62%),var(--md-sys-color-surface-container);box-shadow:0 8px 16px color-mix(in srgb,var(--md-sys-color-primary) 18%,transparent)}.clarification-options-block{overflow:visible;padding-right:4px}@media(max-width:959px){.assistant-thought-plan-actions{grid-template-columns:1fr}}.ai-assistant-panel{width:min(604px,100vw - 18px)}.assistant-section,.assistant-card{margin:0;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 20%,var(--md-sys-color-outline-variant))}.assistant-section{min-height:0;padding:14px 16px;overflow:visible}.assistant-card{min-height:0;padding:14px 16px 16px;overflow:visible}.suggestions-area,.assistant-history,.loading-suggestions{overflow-y:auto;overflow-x:hidden}.section-header{min-width:0;display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:10px}.section-title{min-width:0;font-size:14px;font-weight:700;line-height:1.35;overflow-wrap:anywhere}.suggestions-actions{flex:0 0 auto;display:inline-flex;align-items:center}.review-area,.error-area,.success-area,.clarification-area{padding:0;overflow-y:auto;overflow-x:hidden;scrollbar-gutter:auto}.review-trust{margin:2px 0 4px}.trust-chip{max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.warnings-area,.review-summary,.review-diff,.apply-details,.clarification-options-block,.clarification-manual-toggle{width:100%;max-width:100%;min-width:0}.review-diff{padding:12px 14px}.review-diff-full{padding:10px;overflow-x:auto}.review-diff-block{min-width:0}.review-diff-block pre{overflow-wrap:anywhere;word-break:break-word}.clarification-options-block{padding:4px 2px 10px}.clarification-option{line-height:normal}:host ::ng-deep .clarification-option .mdc-button__label{line-height:1.35!important}.clarification-plain-label{padding:6px 12px 12px;font-size:14px;line-height:1.35}.clarification-manual-toggle{margin-top:10px;padding:10px 2px 0;flex-wrap:wrap;row-gap:6px}.suggestions-content .suggestion-actions{gap:6px}.suggestions-content .suggestion-arrow,.suggestions-content .suggestion-action-btn mat-icon,.suggestions-content .suggestion-arrow mat-icon{display:inline-flex;align-items:center;justify-content:center}:host ::ng-deep .assistant-quick-menu-panel{min-width:244px;max-width:min(90vw,320px);border-radius:14px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 26%,var(--md-sys-color-outline-variant));background:var(--md-sys-color-surface-container-high);box-shadow:0 12px 28px color-mix(in srgb,var(--md-sys-color-shadow, var(--md-sys-color-on-surface)) 32%,transparent),inset 0 1px color-mix(in srgb,var(--md-sys-color-on-surface) 6%,transparent);overflow:hidden;padding:6px}:host ::ng-deep .assistant-quick-menu-panel .mat-mdc-menu-item{min-height:36px;border-radius:10px;color:var(--md-sys-color-on-surface);font-size:12px;font-weight:500;margin:1px 0}:host ::ng-deep .assistant-quick-menu-panel .mat-mdc-menu-item .mat-icon{color:color-mix(in srgb,var(--md-sys-color-on-surface) 82%,var(--md-sys-color-on-surface-variant))}:host ::ng-deep .assistant-quick-menu-panel .mat-mdc-menu-item:hover:not([disabled]){background:color-mix(in srgb,var(--md-sys-color-primary-container) 45%,transparent)}:host ::ng-deep .assistant-quick-menu-panel .mat-mdc-menu-item:focus-visible{outline:2px solid var(--md-sys-color-primary);outline-offset:-2px}:host ::ng-deep .assistant-quick-menu-panel .assistant-quick-menu-danger{color:var(--md-sys-color-error)}:host ::ng-deep .assistant-quick-menu-panel .assistant-quick-menu-danger .mat-icon{color:var(--md-sys-color-error)}@media(max-width:959px){::ng-deep .ai-assistant-overlay-pane{top:12px!important;left:12px!important;width:calc(100vw - 24px)!important;height:calc(100vh - 24px)!important;max-width:calc(100vw - 24px);max-height:calc(100vh - 24px);transform:none!important}.ai-assistant-panel{width:calc(100vw - 48px);min-height:min(620px,100vh - 48px);max-height:calc(100vh - 48px)}.assistant-section,.assistant-card{margin:0}.assistant-card,.assistant-section{padding:12px}}.ai-trigger-btn{--mdc-icon-button-state-layer-size: 36px;width:36px;height:36px;border-radius:8px;background:color-mix(in srgb,var(--md-sys-color-primary) 9%,transparent);border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 22%,transparent);color:var(--md-sys-color-primary);opacity:1}.ai-trigger-btn:hover:not(:disabled){background:color-mix(in srgb,var(--md-sys-color-primary) 16%,transparent);border-color:color-mix(in srgb,var(--md-sys-color-primary) 36%,transparent);color:var(--md-sys-color-on-primary-container)}.ai-trigger-btn:focus-visible,.assistant-close-btn:focus-visible,.assistant-tab:focus-visible{outline:2px solid var(--md-sys-color-primary);outline-offset:2px}.assistant-close-btn{width:28px;height:28px;color:var(--md-sys-color-on-surface-variant)}.assistant-close-btn:hover:not(:disabled){background:var(--md-sys-color-surface-container-high);color:var(--md-sys-color-on-surface)}.assistant-body{padding:12px 16px;overflow:hidden;min-height:0;flex:1;display:flex;flex-direction:column;gap:12px}.assistant-body>*{min-height:0}@media(max-width:959px){.assistant-nav{padding:8px 12px 0}.assistant-body,.assistant-footer{padding:10px 12px}.suggestions-content .suggestion-item{grid-template-columns:1fr;align-items:start}.suggestion-actions{justify-content:flex-start}}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i4.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation", "cdkConnectedOverlayUsePopover", "cdkConnectedOverlayMatchWidth", "cdkConnectedOverlay"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i4.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "ngmodule", type: A11yModule }, { kind: "directive", type: i5.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "ngmodule", type: MatDialogModule }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i1.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i7.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i8.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatChipsModule }, { kind: "component", type: i15.MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["role", "id", "aria-label", "aria-description", "value", "color", "removable", "highlighted", "disableRipple", "disabled"], outputs: ["removed", "destroyed"], exportAs: ["matChip"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i10.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i10.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i10.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: DatePipe, name: "date" }, { kind: "pipe", type: JsonPipe, name: "json" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
6822
6822
  }
6823
6823
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisAiAssistantComponent, decorators: [{
6824
6824
  type: Component,
@@ -6836,7 +6836,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
6836
6836
  DatePipe,
6837
6837
  JsonPipe,
6838
6838
  NgTemplateOutlet,
6839
- ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- Trigger Button -->\n<button\n mat-icon-button\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n #triggerBtn\n (click)=\"open()\"\n [disabled]=\"isOpen\"\n class=\"ai-trigger-btn\"\n matTooltip=\"Assistente de Configura\u00E7\u00E3o\"\n aria-label=\"Abrir Assistente IA\">\n <mat-icon>auto_awesome</mat-icon>\n</button>\n\n<!-- Overlay Template -->\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"isOpen\"\n [cdkConnectedOverlayHasBackdrop]=\"hasBackdrop\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayPush]=\"true\"\n [cdkConnectedOverlayViewportMargin]=\"12\"\n cdkConnectedOverlayPanelClass=\"ai-assistant-overlay-pane\"\n cdkConnectedOverlayBackdropClass=\"ai-assistant-backdrop\"\n (backdropClick)=\"close()\"\n (overlayOutsideClick)=\"close()\"\n (detach)=\"close()\">\n\n <div\n class=\"ai-assistant-panel\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Assistente de Configura\u00E7\u00E3o\"\n [attr.aria-busy]=\"isBusyState() ? 'true' : null\"\n [cdkTrapFocus]=\"hasBackdrop\"\n [cdkTrapFocusAutoCapture]=\"hasBackdrop\"\n (keydown)=\"onKeydown($event)\"\n >\n\n <!-- HEADER -->\n <div class=\"assistant-header\">\n <div class=\"assistant-header__left\">\n <mat-icon class=\"magic-icon\">auto_awesome</mat-icon>\n <div class=\"assistant-title-group\">\n <div class=\"assistant-title\">Assistente de Configura\u00E7\u00E3o</div>\n <div class=\"assistant-subtitle\">Copiloto contextual para ajustes guiados</div>\n <div class=\"assistant-header-chips\">\n <span\n class=\"mode-chip\"\n [class.mock]=\"mockMode\"\n [matTooltip]=\"mockMode ? 'Sem chave de API: respostas de demonstra\u00E7\u00E3o' : 'Conectado ao assistente configurado'\"\n >\n {{ mockMode ? 'Mock' : 'Conectado' }}\n </span>\n <span\n class=\"policy-chip\"\n [class.strict]=\"isStrictRiskPolicy()\"\n [matTooltip]=\"getRiskPolicyTooltip()\"\n >\n {{ getRiskPolicyLabel() }}\n </span>\n </div>\n </div>\n </div>\n <div class=\"assistant-header__right\">\n <button\n mat-icon-button\n type=\"button\"\n class=\"assistant-close-btn\"\n (click)=\"close()\"\n aria-label=\"Fechar assistente\"\n matTooltip=\"Fechar assistente\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </div>\n </div>\n <div\n class=\"assistant-status\"\n [class.processing]=\"isBusyState()\"\n [class.pending]=\"state === 'clarification'\"\n [class.warning]=\"state === 'error'\"\n [class.success]=\"state === 'review' || state === 'success'\"\n [class.compact]=\"!shouldShowSystemStatusDetail()\"\n role=\"status\"\n [attr.aria-live]=\"getSystemStatusAriaLive()\"\n aria-atomic=\"true\"\n >\n <span class=\"assistant-status-dot\" aria-hidden=\"true\"></span>\n <div class=\"assistant-status-content\">\n <div class=\"assistant-status-label\">\n <span class=\"assistant-status-label-prefix\">Status:</span>\n <span>{{ getSystemStatusLabel() }}</span>\n @if (shouldShowSnapshotFallbackBadge()) {\n <span class=\"assistant-status-mode\">Snapshot</span>\n }\n </div>\n @if (shouldShowSystemStatusDetail()) {\n <div class=\"assistant-status-detail\">{{ getSystemStatusDetail() }}</div>\n }\n </div>\n </div>\n @if (shouldShowTaskFlow()) {\n <div class=\"assistant-flow\" role=\"list\" aria-label=\"Fluxo da proposta\">\n @for (step of flowSteps; track step) {\n <div\n class=\"flow-step\"\n role=\"listitem\"\n [class.active]=\"getFlowStepState(step.step) === 'active'\"\n [class.done]=\"getFlowStepState(step.step) === 'done'\"\n >\n <span class=\"flow-step-index\">{{ step.step }}</span>\n <span class=\"flow-step-content\">\n <span class=\"flow-step-label\">{{ step.label }}</span>\n <span class=\"flow-step-detail\">{{ getFlowStepDetail(step.step) }}</span>\n </span>\n </div>\n }\n </div>\n }\n <div class=\"assistant-nav\">\n <div\n class=\"assistant-tabs\"\n role=\"tablist\"\n aria-label=\"Se\u00E7\u00F5es do assistente\"\n (keydown)=\"onTabsKeydown($event)\"\n >\n @if (isTaskMode()) {\n <button\n class=\"assistant-tab\"\n type=\"button\"\n id=\"assistant-tab-task\"\n role=\"tab\"\n aria-label=\"Proposta atual\"\n [attr.aria-selected]=\"isActiveTab('task')\"\n aria-controls=\"assistant-panel-task\"\n [attr.tabindex]=\"isActiveTab('task') ? 0 : -1\"\n [class.active]=\"isActiveTab('task')\"\n (click)=\"setActiveTab('task')\"\n >\n Proposta\n @if (hasPendingClarification() && !isActiveTab('task')) {\n <span class=\"assistant-tab-badge\">1</span>\n }\n </button>\n }\n <button\n class=\"assistant-tab\"\n type=\"button\"\n id=\"assistant-tab-chat\"\n role=\"tab\"\n aria-label=\"Hist\u00F3rico\"\n [attr.aria-selected]=\"isActiveTab('chat')\"\n aria-controls=\"assistant-panel-chat\"\n [attr.tabindex]=\"isActiveTab('chat') ? 0 : -1\"\n [class.active]=\"isActiveTab('chat')\"\n (click)=\"setActiveTab('chat')\"\n >\n Hist\u00F3rico\n </button>\n <button\n class=\"assistant-tab\"\n type=\"button\"\n id=\"assistant-tab-suggestions\"\n role=\"tab\"\n aria-label=\"Sugest\u00F5es de melhoria\"\n [attr.aria-selected]=\"isActiveTab('suggestions')\"\n aria-controls=\"assistant-panel-suggestions\"\n [attr.tabindex]=\"isActiveTab('suggestions') ? 0 : -1\"\n [class.active]=\"isActiveTab('suggestions')\"\n (click)=\"setActiveTab('suggestions')\"\n >\n Sugest\u00F5es\n </button>\n </div>\n </div>\n\n <!-- BODY: Dynamic Content based on State -->\n <div class=\"assistant-body\">\n @if (shouldShowThoughtCard()) {\n <div class=\"assistant-thought assistant-section\">\n <div class=\"assistant-thought-meta\">\n <mat-icon>psychology</mat-icon>\n <span>{{ getThoughtTimingLabel() }}</span>\n </div>\n <div class=\"assistant-thought-summary\">{{ getThoughtSummary() }}</div>\n <div class=\"assistant-thought-plan\">\n <div class=\"assistant-thought-plan-title\">{{ getThoughtPlanTitle() }}</div>\n <div class=\"assistant-thought-plan-actions\">\n <button\n mat-stroked-button\n type=\"button\"\n class=\"thought-action-details\"\n (click)=\"openThoughtDetails()\"\n [attr.aria-label]=\"getThoughtDetailsLabel()\"\n [matTooltip]=\"getThoughtDetailsTooltip()\"\n >\n {{ getThoughtDetailsLabel() }}\n </button>\n @if (shouldShowThoughtPreviewAction()) {\n <button\n mat-flat-button\n color=\"primary\"\n type=\"button\"\n class=\"thought-action-preview\"\n (click)=\"openThoughtPreview()\"\n [matTooltip]=\"getThoughtPreviewTooltip()\"\n >\n Pr\u00E9via\n </button>\n }\n </div>\n <div class=\"assistant-thought-plan-hint\">{{ getThoughtActionHint() }}</div>\n @if (getThoughtChecklist(); as thoughtChecklist) {\n @if (thoughtChecklist.length) {\n <div class=\"assistant-thought-checklist\">\n @for (item of thoughtChecklist; track item) {\n <div class=\"assistant-thought-checklist-item\">\n <mat-icon>radio_button_unchecked</mat-icon>\n <span>{{ item }}</span>\n </div>\n }\n </div>\n }\n @if (isBusyState() && !thoughtChecklist.length) {\n <div class=\"assistant-thought-shimmer\">\n <div class=\"shimmer-line shimmer-line-1\"></div>\n <div class=\"shimmer-line shimmer-line-2\"></div>\n <div class=\"shimmer-line shimmer-line-3\"></div>\n </div>\n }\n }\n </div>\n </div>\n }\n @if (processingInfoVisible) {\n <div class=\"processing-banner\">\n <mat-spinner diameter=\"16\"></mat-spinner>\n <span>{{ aiExplanation || 'Analisando solicita\u00E7\u00E3o e preparando proposta...' }}</span>\n <button mat-button type=\"button\" class=\"processing-retry\" (click)=\"retryProcessing()\">Tentar novamente</button>\n </div>\n }\n @if (historyContext && isActiveTab('chat')) {\n <div\n class=\"assistant-history assistant-section\"\n id=\"assistant-panel-chat\"\n role=\"tabpanel\"\n aria-labelledby=\"assistant-tab-chat\"\n >\n <div class=\"section-header\">\n <div class=\"section-heading\">\n <div class=\"section-title\">Hist\u00F3rico</div>\n <div class=\"section-subtitle\">Sess\u00F5es recentes, pedidos reaproveit\u00E1veis e desfazer r\u00E1pido.</div>\n </div>\n <div class=\"history-actions\" role=\"group\" aria-label=\"A\u00E7\u00F5es do hist\u00F3rico\">\n <button\n mat-stroked-button\n type=\"button\"\n class=\"history-action-btn\"\n (click)=\"historyExpanded = !historyExpanded\"\n [matTooltip]=\"historyExpanded ? 'Recolher hist\u00F3rico' : 'Expandir hist\u00F3rico'\"\n [attr.aria-label]=\"historyExpanded ? 'Recolher hist\u00F3rico' : 'Expandir hist\u00F3rico'\"\n [disabled]=\"!historyWarnings.length && !historySessions.length && !activeHistoryMessages.length\"\n >\n <mat-icon>{{ historyExpanded ? 'expand_less' : 'expand_more' }}</mat-icon>\n <span>{{ historyExpanded ? 'Recolher' : 'Expandir' }}</span>\n </button>\n <button\n mat-stroked-button\n type=\"button\"\n class=\"history-action-btn\"\n (click)=\"startNewSession()\"\n matTooltip=\"Nova conversa\"\n aria-label=\"Nova conversa\"\n [disabled]=\"isBusyState()\"\n >\n <mat-icon>add_comment</mat-icon>\n <span>Nova conversa</span>\n </button>\n <button\n mat-stroked-button\n type=\"button\"\n (click)=\"clearHistory()\"\n matTooltip=\"Limpar hist\u00F3rico local\"\n aria-label=\"Limpar hist\u00F3rico local\"\n class=\"history-action-btn history-action-btn--danger\"\n [disabled]=\"!historySessions.length\"\n >\n <mat-icon>delete_outline</mat-icon>\n <span>Limpar</span>\n </button>\n </div>\n </div>\n @if (historyUndoDeleteSession) {\n <div class=\"history-undo\">\n <span>Sess\u00E3o removida.</span>\n <button mat-button type=\"button\" (click)=\"undoRemoveHistorySession()\">\n Desfazer\n </button>\n </div>\n }\n @if (historyExpanded && historyWarnings.length) {\n <div class=\"history-warnings\">\n <mat-icon>info</mat-icon>\n <div class=\"history-warnings-list\">\n @for (warning of historyWarnings; track warning) {\n <div>{{ warning }}</div>\n }\n <div class=\"history-warnings-hint\">\n Configure headers via API_CONFIG_STORAGE_OPTIONS no host.\n </div>\n </div>\n </div>\n }\n @if (historyExpanded && historySessions.length) {\n <div class=\"history-sessions\">\n @for (session of historySessions; track session) {\n <div\n class=\"history-session\"\n role=\"button\"\n tabindex=\"0\"\n (click)=\"selectHistorySession(session.id)\"\n (keydown)=\"onHistorySessionCardKeydown($event, session.id)\"\n [class.active]=\"session.id === activeHistorySession?.id\"\n [matTooltip]=\"getHistorySessionTooltip(session)\"\n [matTooltipDisabled]=\"!session.componentType && !session.componentId\"\n >\n <div class=\"history-session-main\">\n <span class=\"history-session-title\">{{ session.title }}</span>\n <div class=\"history-session-main-right\">\n <span class=\"history-session-time\">{{ session.updatedAt | date:'short' }}</span>\n <div class=\"history-session-tools\">\n <button\n mat-icon-button\n type=\"button\"\n class=\"history-session-tool\"\n (click)=\"reuseHistorySessionPrompt(session.id, $event)\"\n matTooltip=\"Reusar \u00FAltimo pedido\"\n aria-label=\"Reusar \u00FAltimo pedido\"\n >\n <mat-icon>edit_note</mat-icon>\n </button>\n <button\n mat-icon-button\n type=\"button\"\n class=\"history-session-tool history-session-tool--danger\"\n (click)=\"removeHistorySession(session.id, $event)\"\n matTooltip=\"Excluir sess\u00E3o\"\n aria-label=\"Excluir sess\u00E3o\"\n >\n <mat-icon>delete_outline</mat-icon>\n </button>\n </div>\n </div>\n </div>\n <div class=\"history-session-meta\">\n @if (session.componentType) {\n <span class=\"history-chip\">{{ session.componentType }}</span>\n }\n @if (session.componentId) {\n <span class=\"history-chip\">{{ session.componentId }}</span>\n }\n </div>\n </div>\n }\n </div>\n }\n @if (historyExpanded && !historySessions.length) {\n <div class=\"history-empty\">\n Nenhuma sess\u00E3o salva ainda.\n </div>\n }\n @if (historyExpanded && activeHistoryMessages.length) {\n <div class=\"history-messages\">\n @if (activeHistoryTotalMessages > activeHistoryMessages.length) {\n <div\n class=\"history-messages-hint\"\n >\n Mostrando \u00FAltimas {{ activeHistoryMessages.length }} de {{ activeHistoryTotalMessages }} mensagens.\n </div>\n }\n @for (msg of activeHistoryMessages; track msg) {\n <div\n class=\"history-message\"\n [class.user]=\"msg.role === 'user'\"\n [class.assistant]=\"msg.role === 'assistant'\"\n >\n <div class=\"history-message-header\">\n <span class=\"history-message-role\">{{ msg.role === 'user' ? 'Voc\u00EA' : 'Assistente' }}</span>\n <span class=\"history-message-time\">{{ msg.createdAt | date:'shortTime' }}</span>\n @if (msg.context?.usedRag) {\n <span\n class=\"history-rag\"\n matTooltip=\"Resposta baseada em contexto recuperado (RAG)\"\n >RAG</span>\n }\n </div>\n <div class=\"history-message-text\">{{ msg.text }}</div>\n </div>\n }\n </div>\n }\n @if (historyExpanded && historySessions.length && !activeHistoryMessages.length) {\n <div class=\"history-empty history-empty--panel\">\n Selecione uma sess\u00E3o para visualizar as mensagens.\n </div>\n }\n @if (historyExpanded) {\n <div class=\"history-helper\">\n O hist\u00F3rico \u00E9 local ao usu\u00E1rio e ao componente atual.\n </div>\n }\n </div>\n }\n\n @if (loadingSuggestions && isActiveTab('suggestions')) {\n <div\n class=\"loading-suggestions assistant-section\"\n id=\"assistant-panel-suggestions\"\n role=\"tabpanel\"\n aria-labelledby=\"assistant-tab-suggestions\"\n >\n <mat-spinner diameter=\"20\"></mat-spinner>\n <span>Carregando sugest\u00F5es de melhoria...</span>\n </div>\n }\n\n <!-- STATE: LISTENING (Suggestions) -->\n @if (state === 'listening' && isActiveTab('suggestions')) {\n <div\n class=\"suggestions-area assistant-section\"\n id=\"assistant-panel-suggestions\"\n role=\"tabpanel\"\n aria-labelledby=\"assistant-tab-suggestions\"\n >\n <div class=\"section-header\">\n <div class=\"section-title\">Sugest\u00F5es de melhoria</div>\n <div class=\"suggestions-actions\">\n <button mat-icon-button type=\"button\" (click)=\"refreshSuggestions()\" [disabled]=\"loadingSuggestions\" matTooltip=\"Atualizar sugest\u00F5es\">\n <mat-icon>refresh</mat-icon>\n </button>\n </div>\n </div>\n @if (!loadingSuggestions) {\n <div class=\"suggestions-hero\">\n <div class=\"suggestions-hero__label\">Contexto ativo</div>\n <div class=\"suggestions-hero__title\">{{ adapter.componentName || 'Componente atual' }}</div>\n <div class=\"suggestions-hero__detail\">{{ getSystemStatusDetail() }}</div>\n </div>\n }\n @if (suggestionsWarnings.length) {\n <div class=\"warnings-area\">\n <mat-icon class=\"warnings-icon\">warning_amber</mat-icon>\n <div class=\"warnings-content\">\n <div class=\"warnings-title\">Avisos</div>\n <div class=\"warnings-list\">\n @for (warning of suggestionsWarnings; track warning) {\n <div>{{ warning }}</div>\n }\n </div>\n </div>\n </div>\n }\n @if (!loadingSuggestions && (richSuggestions.length || hasDismissedSuggestions())) {\n <div class=\"suggestions-content\">\n @if (hasDismissedSuggestions()) {\n <div class=\"suggestions-filter\">\n <span>{{ getDismissedSuggestionCount() }} oculta(s)</span>\n <button mat-button type=\"button\" (click)=\"restoreDismissedSuggestions()\">\n Restaurar\n </button>\n </div>\n }\n @if (getVisibleSuggestions().length) {\n <div class=\"suggestions-list\">\n @for (sug of getVisibleSuggestions(); track sug) {\n <div\n class=\"suggestion-item\"\n role=\"button\"\n tabindex=\"0\"\n [attr.aria-label]=\"'Selecionar sugest\u00E3o: ' + sug.label\"\n (click)=\"selectSuggestion(sug)\"\n (keydown)=\"onSuggestionCardKeydown($event, sug)\"\n >\n <div class=\"suggestion-copy\">\n <div class=\"suggestion-main\">\n @if (sug.icon) {\n <mat-icon class=\"suggestion-icon\">{{ sug.icon }}</mat-icon>\n }\n <span class=\"suggestion-label\">{{ sug.label }}</span>\n @if (sug.group) {\n <span class=\"suggestion-group\">{{ sug.group }}</span>\n }\n </div>\n @if (sug.description) {\n <div class=\"suggestion-desc\">{{ sug.description }}</div>\n }\n </div>\n <div class=\"suggestion-actions\">\n <span class=\"suggestion-arrow\" aria-hidden=\"true\">\n <mat-icon>chevron_right</mat-icon>\n </span>\n <button\n mat-icon-button\n type=\"button\"\n class=\"suggestion-action-btn\"\n (click)=\"prepareSuggestionPrompt(sug, $event)\"\n matTooltip=\"Refinar pedido\"\n aria-label=\"Refinar pedido\"\n >\n <mat-icon>edit</mat-icon>\n </button>\n <button\n mat-icon-button\n type=\"button\"\n class=\"suggestion-action-btn suggestion-action-btn--danger\"\n (click)=\"dismissSuggestion(sug, $event)\"\n matTooltip=\"Ocultar sugest\u00E3o\"\n aria-label=\"Ocultar sugest\u00E3o\"\n >\n <mat-icon>visibility_off</mat-icon>\n </button>\n </div>\n </div>\n }\n </div>\n } @else {\n <div class=\"suggestions-empty suggestions-empty--inline\">\n Todas as sugest\u00F5es foram ocultadas.\n </div>\n }\n </div>\n }\n @if (!loadingSuggestions && !richSuggestions.length) {\n <div class=\"suggestions-empty\">\n Nenhuma sugest\u00E3o dispon\u00EDvel no momento.\n </div>\n }\n @if (!loadingSuggestions && !richSuggestions.length) {\n <div class=\"suggestions-helper\">\n Selecione uma sugest\u00E3o acima ou descreva uma altera\u00E7\u00E3o no campo inferior.\n </div>\n }\n </div>\n }\n\n <!-- STATE: CLARIFICATION (Two-Step Flow) -->\n @if (state === 'clarification' && isActiveTab('task')) {\n <div\n class=\"clarification-area assistant-card\"\n id=\"assistant-panel-task\"\n role=\"tabpanel\"\n aria-labelledby=\"assistant-tab-task\"\n >\n @if (!shouldShowThoughtCard()) {\n <div class=\"task-header\">\n <div class=\"task-title\">{{ getTaskTitle() }}</div>\n <div class=\"task-subtitle\">{{ getTaskSubtitle() }}</div>\n @if (clarificationOptions.length > 1 && getTaskSelectionSummary(); as selectionSummary) {\n <div class=\"task-meta\">\n <span class=\"task-meta-label\">Selecionado:</span>\n <span class=\"task-meta-value\">{{ selectionSummary }}</span>\n </div>\n }\n @if (shouldShowTaskSteps()) {\n <div class=\"task-steps\">\n <span class=\"task-step active\">1 Dados</span>\n <span class=\"task-step\">2 Layout</span>\n <span class=\"task-step\">3 Revis\u00E3o</span>\n </div>\n }\n </div>\n }\n @if (clarificationResponseType === 'context') {\n <div class=\"context-only\">\n <mat-spinner diameter=\"24\"></mat-spinner>\n <div class=\"context-only-hint\">Buscando contexto adicional...</div>\n </div>\n }\n <ng-template #clarificationOptionContent let-opt let-index=\"index\" let-compact=\"compact\">\n @if (!compact) {\n <div class=\"clarification-decision-head\">\n <span class=\"clarification-decision-index\">{{ index + 1 }}</span>\n <span class=\"clarification-decision-type\">{{ getClarificationOptionKindLabel(opt) }}</span>\n <span class=\"spacer\"></span>\n @if (isClarificationSelected(opt)) {\n <span class=\"clarification-decision-state\">Selecionado</span>\n }\n </div>\n }\n @switch (getClarificationOptionLayout(opt)) {\n @case ('endpoint') {\n <div class=\"clarification-card\">\n <div class=\"clarification-card-header\">\n <mat-icon class=\"endpoint-icon\">{{ getEndpointIcon(opt) }}</mat-icon>\n @if (getEndpointMethod(opt); as method) {\n <span class=\"endpoint-method\" [attr.data-method]=\"method\">{{ method }}</span>\n }\n <span class=\"endpoint-label\">{{ opt.label }}</span>\n <span class=\"spacer\"></span>\n <mat-icon class=\"select-indicator\">\n {{ isClarificationSelected(opt) ? 'check_circle' : 'radio_button_unchecked' }}\n </mat-icon>\n </div>\n <div class=\"clarification-card-body\">\n @if (getEndpointPath(opt); as path) {\n <div class=\"endpoint-path\">{{ path }}</div>\n }\n @if (opt.contextHints?.description) {\n <div\n class=\"endpoint-description\"\n [matTooltip]=\"getDescriptionTooltip(opt)\"\n [matTooltipDisabled]=\"!shouldShowDescriptionTooltip(opt)\"\n >\n {{ opt.contextHints?.description }}\n </div>\n }\n </div>\n </div>\n }\n @case ('color') {\n <div class=\"clarification-color\">\n <span\n class=\"color-swatch\"\n [style.background]=\"getSafeHexColor(opt) || 'var(--md-sys-color-surface-container-highest)'\"\n ></span>\n <div class=\"color-meta\">\n <span class=\"color-label\">{{ opt.label }}</span>\n @if (opt.contextHints?.hexColor) {\n <span class=\"color-value\">{{ opt.contextHints?.hexColor }}</span>\n }\n </div>\n </div>\n }\n @case ('description') {\n <div class=\"clarification-description\">\n <span class=\"clarification-label\">{{ opt.label }}</span>\n @if (opt.contextHints?.description) {\n <span\n class=\"clarification-subtitle\"\n [matTooltip]=\"getDescriptionTooltip(opt)\"\n [matTooltipDisabled]=\"!shouldShowDescriptionTooltip(opt)\"\n >\n {{ opt.contextHints?.description }}\n </span>\n }\n </div>\n }\n @default {\n <span class=\"clarification-plain-label\">{{ opt.label }}</span>\n }\n }\n </ng-template>\n @if (warnings.length) {\n <div class=\"warnings-area\">\n <mat-icon class=\"warnings-icon\">warning_amber</mat-icon>\n <div class=\"warnings-content\">\n <div class=\"warnings-title\">Avisos</div>\n <div class=\"warnings-list\">\n @for (warning of warnings; track warning) {\n <div>{{ warning }}</div>\n }\n </div>\n </div>\n </div>\n }\n @if (clarificationQuestions.length) {\n <div\n class=\"clarification-questions\"\n [class.attention-highlight]=\"highlightClarificationDetails && !clarificationOptions.length\"\n >\n @for (question of clarificationQuestions; track question; let i = $index) {\n <div class=\"clarification-question\">\n <div class=\"clarification-question-label\">{{ question }}</div>\n <input\n type=\"text\"\n [(ngModel)]=\"clarificationAnswers[i]\"\n [placeholder]=\"'Resposta ' + (i + 1)\"\n autocomplete=\"off\">\n </div>\n }\n </div>\n }\n @if (clarificationOptions.length) {\n <div\n class=\"clarification-options-block\"\n [class.attention-highlight]=\"highlightClarificationDetails\"\n >\n <div class=\"clarification-options-title\">\n {{ clarificationOptions.length === 1 ? 'Decis\u00E3o sugerida' : 'Decis\u00F5es sugeridas' }}\n </div>\n @if (clarificationOptions.length === 1) {\n <div class=\"clarification-options-hint\">\n Etapa 2 de 4: confirme a melhor op\u00E7\u00E3o para continuar.\n </div>\n }\n @if (clarificationOptions.length > 1) {\n <div class=\"clarification-options-hint\">\n Etapa 2 de 4: selecione a alternativa mais aderente para gerar a proposta.\n </div>\n }\n @if (clarificationResponseType === 'confirm') {\n <div\n class=\"clarification-buttons\"\n [class.list]=\"clarificationPresentation === 'list'\"\n >\n @for (opt of clarificationOptions; track opt; let i = $index) {\n <button\n mat-button\n type=\"button\"\n (click)=\"onClarificationOptionClick(opt)\"\n class=\"clarification-option\"\n [class.selected]=\"isClarificationSelected(opt)\"\n [matTooltip]=\"getClarificationTooltip(opt)\"\n [matTooltipDisabled]=\"!shouldShowClarificationTooltip(opt) || isEndpointOption(opt)\"\n >\n <ng-container *ngTemplateOutlet=\"clarificationOptionContent; context: { $implicit: opt, index: i, compact: false }\"></ng-container>\n </button>\n }\n </div>\n }\n @if (clarificationSelectionMode === 'multiple') {\n <div\n class=\"clarification-buttons\"\n [class.list]=\"clarificationPresentation === 'list'\"\n >\n @for (opt of clarificationOptions; track opt; let i = $index) {\n <button\n mat-button\n type=\"button\"\n (click)=\"onClarificationOptionClick(opt)\"\n [class.selected]=\"isClarificationSelected(opt)\"\n class=\"clarification-option\"\n [matTooltip]=\"getClarificationTooltip(opt)\"\n [matTooltipDisabled]=\"!shouldShowClarificationTooltip(opt) || isEndpointOption(opt)\"\n >\n <ng-container *ngTemplateOutlet=\"clarificationOptionContent; context: { $implicit: opt, index: i, compact: false }\"></ng-container>\n </button>\n }\n </div>\n }\n @if (clarificationResponseType !== 'confirm' && clarificationSelectionMode === 'single' && clarificationPresentation !== 'chips') {\n <div\n class=\"clarification-buttons\"\n [class.list]=\"clarificationPresentation === 'list'\"\n >\n @for (opt of clarificationOptions; track opt; let i = $index) {\n <button\n mat-button\n type=\"button\"\n (click)=\"onClarificationOptionClick(opt)\"\n class=\"clarification-option\"\n [class.selected]=\"isClarificationSelected(opt)\"\n [matTooltip]=\"getClarificationTooltip(opt)\"\n [matTooltipDisabled]=\"!shouldShowClarificationTooltip(opt) || isEndpointOption(opt)\"\n >\n <ng-container *ngTemplateOutlet=\"clarificationOptionContent; context: { $implicit: opt, index: i, compact: false }\"></ng-container>\n </button>\n }\n </div>\n }\n @if (clarificationResponseType !== 'confirm' && clarificationSelectionMode === 'single' && clarificationPresentation === 'chips') {\n <div\n class=\"clarification-chips\"\n >\n @for (opt of clarificationOptions; track opt; let i = $index) {\n @if (isEndpointOption(opt)) {\n <button\n mat-button\n type=\"button\"\n class=\"clarification-option clarification-card-button\"\n (click)=\"onClarificationOptionClick(opt)\"\n [class.selected]=\"isClarificationSelected(opt)\"\n [matTooltip]=\"getClarificationTooltip(opt)\"\n [matTooltipDisabled]=\"!shouldShowClarificationTooltip(opt) || isEndpointOption(opt)\"\n >\n <ng-container *ngTemplateOutlet=\"clarificationOptionContent; context: { $implicit: opt, index: i, compact: false }\"></ng-container>\n </button>\n } @else {\n <mat-chip\n (click)=\"onClarificationOptionClick(opt)\"\n [matTooltip]=\"getClarificationTooltip(opt)\"\n [matTooltipDisabled]=\"!shouldShowClarificationTooltip(opt)\"\n class=\"clarification-chip\"\n >\n <ng-container *ngTemplateOutlet=\"clarificationOptionContent; context: { $implicit: opt, index: i, compact: true }\"></ng-container>\n </mat-chip>\n }\n }\n </div>\n }\n </div>\n }\n @if (clarificationAllowCustom && clarificationResponseType !== 'context') {\n <div\n class=\"clarification-manual-toggle\"\n >\n <span class=\"clarification-manual-label\">N\u00E3o encontrou o recurso?</span>\n <button mat-button type=\"button\" (click)=\"toggleManualInput()\">\n {{ showManualInput ? 'Ocultar resposta manual' : 'Responder manualmente' }}\n </button>\n </div>\n }\n @if (clarificationAllowCustom && showManualInput && clarificationResponseType !== 'context') {\n <div\n class=\"clarification-free\"\n >\n <input\n type=\"text\"\n [(ngModel)]=\"clarificationFreeText\"\n placeholder=\"Digite sua resposta\u2026\"\n autocomplete=\"off\"\n (keydown.enter)=\"confirmTaskAction()\"\n />\n </div>\n }\n @if (clarificationAllowCustom && showManualInput && clarificationResponseType !== 'context') {\n <div\n class=\"clarification-free-hint\"\n >\n Pressione Enter para enviar.\n </div>\n }\n </div>\n }\n\n <!-- STATE: REVIEW (Diff/Explanation) -->\n @if (state === 'review' && isActiveTab('task')) {\n <div\n class=\"review-area assistant-card\"\n id=\"assistant-panel-task\"\n role=\"tabpanel\"\n aria-labelledby=\"assistant-tab-task\"\n >\n @if (!shouldShowThoughtCard()) {\n <div class=\"task-header\">\n <div class=\"task-title\">{{ getTaskTitle() }}</div>\n <div class=\"task-subtitle\">{{ getTaskSubtitle() }}</div>\n @if (clarificationOptions.length > 1 && getTaskSelectionSummary(); as selectionSummary) {\n <div class=\"task-meta\">\n <span class=\"task-meta-label\">Selecionado:</span>\n <span class=\"task-meta-value\">{{ selectionSummary }}</span>\n </div>\n }\n @if (shouldShowTaskSteps()) {\n <div class=\"task-steps\">\n <span class=\"task-step\">1 Dados</span>\n <span class=\"task-step\">2 Layout</span>\n <span class=\"task-step active\">3 Revis\u00E3o</span>\n </div>\n }\n </div>\n }\n @if (warnings.length) {\n <div class=\"warnings-area\">\n <mat-icon class=\"warnings-icon\">warning_amber</mat-icon>\n <div class=\"warnings-content\">\n <div class=\"warnings-title\">Avisos</div>\n <div class=\"warnings-list\">\n @for (warning of warnings; track warning) {\n <div>{{ warning }}</div>\n }\n </div>\n </div>\n </div>\n }\n <div class=\"review-trust\">\n <span class=\"trust-chip\" [matTooltip]=\"getScopeTooltip()\">{{ getScopeLabel() }}</span>\n <span class=\"trust-chip\" [matTooltip]=\"getConfidenceTooltip()\">{{ getConfidenceLabel() }}</span>\n <span class=\"trust-chip risk-chip\" [class.medium]=\"getReviewRiskLevel() === 'm\u00E9dio'\" [class.high]=\"getReviewRiskLevel() === 'alto'\">\n Risco {{ getReviewRiskLevel() }}\n </span>\n </div>\n <div class=\"review-summary\" [class.attention-highlight]=\"highlightReviewDetails\">\n <div class=\"review-summary-title\">Resumo da proposta</div>\n <div class=\"review-summary-line\">{{ getReviewSummary() }}</div>\n </div>\n <div class=\"review-diff\">\n <div class=\"review-diff-title\">Pr\u00E9via de mudan\u00E7as</div>\n @if (pendingDiff.length) {\n <div class=\"review-diff-summary\">\n @for (line of getDiffSummaryLines(); track line) {\n <div class=\"review-diff-line\">{{ line }}</div>\n }\n @if (pendingDiff.length > 3) {\n <div class=\"review-diff-more\">\u2026 +{{ pendingDiff.length - 3 }} mudan\u00E7as</div>\n }\n </div>\n <button mat-stroked-button type=\"button\" class=\"review-diff-toggle\" (click)=\"toggleFullDiff()\">\n {{ getDiffToggleLabel() }}\n </button>\n } @else {\n <div class=\"review-diff-empty\">\n N\u00E3o foi poss\u00EDvel gerar um diff estruturado. Revise o resumo e aplique com cautela.\n </div>\n }\n @if (showFullDiff && pendingDiff.length) {\n <div class=\"review-diff-full\">\n @for (diff of pendingDiff; track diff) {\n <div class=\"review-diff-block\">\n <div class=\"review-diff-path\">{{ diff.path }}</div>\n <div class=\"review-diff-label\">Antes:</div>\n <pre>{{ diff.before | json }}</pre>\n <div class=\"review-diff-label\">Depois:</div>\n <pre>{{ diff.after | json }}</pre>\n </div>\n }\n </div>\n }\n </div>\n @if (aiExplanation.trim()) {\n <div class=\"ai-explanation\">\n {{ aiExplanation }}\n </div>\n }\n </div>\n }\n\n <!-- STATE: ERROR -->\n @if (state === 'error' && (isActiveTab('task') || (!isTaskMode() && isActiveTab('suggestions')))) {\n <div\n class=\"error-area assistant-card\"\n [attr.id]=\"isTaskMode() ? 'assistant-panel-task' : 'assistant-panel-suggestions'\"\n role=\"tabpanel\"\n [attr.aria-labelledby]=\"isTaskMode() ? 'assistant-tab-task' : 'assistant-tab-suggestions'\"\n >\n <div class=\"error-msg\">\n <mat-icon color=\"warn\">error_outline</mat-icon>\n <span>{{ errorMsg }}</span>\n </div>\n @if (warnings.length) {\n <div class=\"warnings-area\">\n <mat-icon class=\"warnings-icon\">warning_amber</mat-icon>\n <div class=\"warnings-content\">\n <div class=\"warnings-title\">Avisos</div>\n <div class=\"warnings-list\">\n @for (warning of warnings; track warning) {\n <div>{{ warning }}</div>\n }\n </div>\n </div>\n </div>\n }\n @if (shouldShowApplyDetails()) {\n <div class=\"apply-details\">\n <div class=\"apply-details-header\">\n <div class=\"apply-details-title\">Detalhes da aplica\u00E7\u00E3o</div>\n @if (allowManualPatchEdit) {\n <div class=\"apply-details-actions\">\n <button mat-button type=\"button\" (click)=\"togglePatchPathEditor()\" [disabled]=\"!pendingPatch\">\n {{ patchPathEditorExpanded ? 'Ocultar paths' : 'Editar por path' }}\n </button>\n <button mat-button type=\"button\" (click)=\"togglePatchEditor()\" [disabled]=\"!pendingPatch\">\n {{ patchEditorExpanded ? 'Ocultar editor' : 'Editar patch' }}\n </button>\n </div>\n }\n </div>\n @if (lastApplyAt) {\n <div class=\"apply-details-meta\">\n \u00DAltima tentativa: {{ lastApplyAt | date:'short' }}\n </div>\n }\n @if (getApplyPaths().length) {\n <div class=\"apply-paths\">\n @for (path of getApplyPaths(); track path) {\n <span class=\"apply-path-chip\">{{ path }}</span>\n }\n </div>\n }\n @if (applyWarnings.length) {\n <div class=\"apply-warnings\">\n <div class=\"apply-warnings-title\">Avisos da aplica\u00E7\u00E3o</div>\n <div class=\"apply-warnings-list\">\n @for (warning of applyWarnings; track warning) {\n <div>{{ warning }}</div>\n }\n </div>\n </div>\n }\n @if (allowManualPatchEdit && patchPathEditorExpanded) {\n <div class=\"patch-path-editor\">\n <div class=\"patch-editor-label\">Editar por path</div>\n <div class=\"patch-editor-hint\">Texto simples vira string; para for\u00E7ar texto em true/false/n\u00FAmero, use aspas.</div>\n @if (!getEditablePatchPathEdits().length) {\n <div class=\"patch-path-editor-empty\">\n Nenhum path edit\u00E1vel dispon\u00EDvel para este patch.\n </div>\n }\n @if (getEditablePatchPathEdits().length) {\n <div class=\"patch-path-rows\">\n @for (edit of getEditablePatchPathEdits(); track edit; let i = $index) {\n <div class=\"patch-path-row\">\n <div class=\"patch-path-label\">{{ edit.path }}</div>\n <input\n type=\"text\"\n [(ngModel)]=\"patchPathEdits[i].valueText\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n />\n @if (patchPathEdits[i].error) {\n <div class=\"patch-editor-error\">{{ patchPathEdits[i].error }}</div>\n }\n </div>\n }\n </div>\n }\n @if (patchPathEditorError) {\n <div class=\"patch-editor-error\">{{ patchPathEditorError }}</div>\n }\n <div class=\"patch-editor-actions\">\n <button mat-button type=\"button\" (click)=\"resetPatchPathEdits()\">\n Restaurar valores\n </button>\n <button mat-button type=\"button\" (click)=\"applyPathEditsToPatch()\">\n Aplicar no patch\n </button>\n <button mat-flat-button color=\"primary\" type=\"button\" (click)=\"reapplyPathEdits()\">\n Reaplicar por path\n </button>\n </div>\n </div>\n }\n @if (allowManualPatchEdit && patchEditorExpanded) {\n <div class=\"patch-editor\">\n <label class=\"patch-editor-label\">Patch JSON</label>\n <textarea\n [(ngModel)]=\"patchEditorText\"\n spellcheck=\"false\"\n ></textarea>\n @if (patchEditorError) {\n <div class=\"patch-editor-error\">{{ patchEditorError }}</div>\n }\n <div class=\"patch-editor-actions\">\n <button mat-button type=\"button\" (click)=\"resetPatchEditor()\">\n Restaurar original\n </button>\n <button mat-flat-button color=\"primary\" type=\"button\" (click)=\"reapplyEditedPatch()\">\n Reaplicar patch\n </button>\n </div>\n </div>\n }\n </div>\n }\n <div class=\"review-actions\">\n <button mat-button (click)=\"close()\">Fechar</button>\n <button mat-stroked-button (click)=\"retry()\">Tentar Novamente</button>\n </div>\n </div>\n }\n\n <!-- STATE: SUCCESS -->\n @if (state === 'success' && (isActiveTab('task') || (!isTaskMode() && isActiveTab('suggestions')))) {\n <div\n class=\"success-area assistant-card\"\n [attr.id]=\"isTaskMode() ? 'assistant-panel-task' : 'assistant-panel-suggestions'\"\n role=\"tabpanel\"\n [attr.aria-labelledby]=\"isTaskMode() ? 'assistant-tab-task' : 'assistant-tab-suggestions'\"\n >\n <div class=\"success-msg\">\n <mat-icon class=\"success-icon\">check_circle</mat-icon>\n <span>{{ aiExplanation || 'Configura\u00E7\u00E3o atualizada.' }}</span>\n </div>\n @if (warnings.length) {\n <div class=\"warnings-area\">\n <mat-icon class=\"warnings-icon\">warning_amber</mat-icon>\n <div class=\"warnings-content\">\n <div class=\"warnings-title\">Avisos</div>\n <div class=\"warnings-list\">\n @for (warning of warnings; track warning) {\n <div>{{ warning }}</div>\n }\n </div>\n </div>\n </div>\n }\n @if (shouldShowApplyDetails()) {\n <div class=\"apply-details\">\n <div class=\"apply-details-header\">\n <div class=\"apply-details-title\">Detalhes da aplica\u00E7\u00E3o</div>\n @if (allowManualPatchEdit) {\n <div class=\"apply-details-actions\">\n <button mat-button type=\"button\" (click)=\"togglePatchPathEditor()\" [disabled]=\"!pendingPatch\">\n {{ patchPathEditorExpanded ? 'Ocultar paths' : 'Editar por path' }}\n </button>\n <button mat-button type=\"button\" (click)=\"togglePatchEditor()\" [disabled]=\"!pendingPatch\">\n {{ patchEditorExpanded ? 'Ocultar editor' : 'Editar e reaplicar' }}\n </button>\n </div>\n }\n </div>\n @if (lastApplyAt) {\n <div class=\"apply-details-meta\">\n Aplicado em {{ lastApplyAt | date:'short' }}\n </div>\n }\n @if (getApplyPaths().length) {\n <div class=\"apply-paths\">\n @for (path of getApplyPaths(); track path) {\n <span class=\"apply-path-chip\">{{ path }}</span>\n }\n </div>\n }\n @if (applyWarnings.length) {\n <div class=\"apply-warnings\">\n <div class=\"apply-warnings-title\">Avisos da aplica\u00E7\u00E3o</div>\n <div class=\"apply-warnings-list\">\n @for (warning of applyWarnings; track warning) {\n <div>{{ warning }}</div>\n }\n </div>\n </div>\n }\n @if (allowManualPatchEdit && patchPathEditorExpanded) {\n <div class=\"patch-path-editor\">\n <div class=\"patch-editor-label\">Editar por path</div>\n <div class=\"patch-editor-hint\">Texto simples vira string; para for\u00E7ar texto em true/false/n\u00FAmero, use aspas.</div>\n @if (!getEditablePatchPathEdits().length) {\n <div class=\"patch-path-editor-empty\">\n Nenhum path edit\u00E1vel dispon\u00EDvel para este patch.\n </div>\n }\n @if (getEditablePatchPathEdits().length) {\n <div class=\"patch-path-rows\">\n @for (edit of getEditablePatchPathEdits(); track edit; let i = $index) {\n <div class=\"patch-path-row\">\n <div class=\"patch-path-label\">{{ edit.path }}</div>\n <input\n type=\"text\"\n [(ngModel)]=\"patchPathEdits[i].valueText\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n />\n @if (patchPathEdits[i].error) {\n <div class=\"patch-editor-error\">{{ patchPathEdits[i].error }}</div>\n }\n </div>\n }\n </div>\n }\n @if (patchPathEditorError) {\n <div class=\"patch-editor-error\">{{ patchPathEditorError }}</div>\n }\n <div class=\"patch-editor-actions\">\n <button mat-button type=\"button\" (click)=\"resetPatchPathEdits()\">\n Restaurar valores\n </button>\n <button mat-button type=\"button\" (click)=\"applyPathEditsToPatch()\">\n Aplicar no patch\n </button>\n <button mat-flat-button color=\"primary\" type=\"button\" (click)=\"reapplyPathEdits()\">\n Reaplicar por path\n </button>\n </div>\n </div>\n }\n @if (allowManualPatchEdit && patchEditorExpanded) {\n <div class=\"patch-editor\">\n <label class=\"patch-editor-label\">Patch JSON</label>\n <textarea\n [(ngModel)]=\"patchEditorText\"\n spellcheck=\"false\"\n ></textarea>\n @if (patchEditorError) {\n <div class=\"patch-editor-error\">{{ patchEditorError }}</div>\n }\n <div class=\"patch-editor-actions\">\n <button mat-button type=\"button\" (click)=\"resetPatchEditor()\">\n Restaurar original\n </button>\n <button mat-flat-button color=\"primary\" type=\"button\" (click)=\"reapplyEditedPatch()\">\n Reaplicar patch\n </button>\n </div>\n </div>\n }\n </div>\n }\n <button mat-button color=\"warn\" (click)=\"undoLastChange()\">\n <mat-icon>undo</mat-icon> Desfazer\n </button>\n </div>\n }\n\n </div>\n\n <div class=\"assistant-footer\">\n @if (!isTaskMode()) {\n <button\n mat-icon-button\n type=\"button\"\n class=\"composer-leading composer-leading-btn\"\n [matMenuTriggerFor]=\"assistantQuickMenu\"\n aria-label=\"Abrir a\u00E7\u00F5es r\u00E1pidas\"\n matTooltip=\"A\u00E7\u00F5es r\u00E1pidas\"\n >\n <mat-icon>add</mat-icon>\n </button>\n <input\n #inputEl\n type=\"text\"\n [(ngModel)]=\"userPrompt\"\n [disabled]=\"state === 'processing' || state === 'applying'\"\n placeholder=\"Descreva a altera\u00E7\u00E3o que deseja aplicar\u2026\"\n autocomplete=\"off\"\n />\n <div class=\"send-actions\">\n @if (state === 'listening') {\n <button\n mat-icon-button\n class=\"send-btn\"\n (click)=\"submitPrompt()\"\n [disabled]=\"!userPrompt.trim()\"\n [class.ready]=\"!!userPrompt.trim()\"\n >\n <mat-icon>arrow_upward</mat-icon>\n </button>\n }\n @if (state === 'processing' || state === 'applying') {\n <mat-spinner diameter=\"20\"></mat-spinner>\n }\n </div>\n } @else {\n <div class=\"task-footer\">\n <div class=\"task-footer-left\">\n <button mat-button type=\"button\" (click)=\"handleTaskSecondary()\">{{ getTaskCancelLabel() }}</button>\n @if (state === 'review') {\n <button\n mat-stroked-button\n type=\"button\"\n (click)=\"retry()\"\n >\n {{ getTaskSecondaryLabel() }}\n </button>\n }\n </div>\n <div class=\"task-footer-right\">\n <button\n class=\"task-primary-btn\"\n mat-flat-button\n color=\"primary\"\n type=\"button\"\n (click)=\"confirmTaskAction()\"\n [disabled]=\"isTaskPrimaryDisabled()\"\n >\n {{ getTaskPrimaryLabel() }}\n </button>\n @if (state === 'processing' || state === 'applying') {\n <mat-spinner diameter=\"20\"></mat-spinner>\n }\n </div>\n </div>\n }\n </div>\n\n <mat-menu #assistantQuickMenu=\"matMenu\" panelClass=\"assistant-quick-menu-panel\">\n <button mat-menu-item type=\"button\" (click)=\"setActiveTab('chat')\">\n <mat-icon>history</mat-icon>\n <span>Hist\u00F3rico</span>\n </button>\n <button mat-menu-item type=\"button\" (click)=\"setActiveTab('suggestions')\">\n <mat-icon>lightbulb</mat-icon>\n <span>Sugest\u00F5es</span>\n </button>\n <button mat-menu-item type=\"button\" (click)=\"startNewSession()\">\n <mat-icon>add_comment</mat-icon>\n <span>Nova conversa</span>\n </button>\n <button mat-menu-item type=\"button\" (click)=\"refreshSuggestions()\" [disabled]=\"loadingSuggestions\">\n <mat-icon>refresh</mat-icon>\n <span>Atualizar sugest\u00F5es</span>\n </button>\n <button\n mat-menu-item\n type=\"button\"\n (click)=\"restoreDismissedSuggestions()\"\n [disabled]=\"!hasDismissedSuggestions()\"\n >\n <mat-icon>visibility</mat-icon>\n <span>Restaurar sugest\u00F5es ocultas</span>\n </button>\n <button\n mat-menu-item\n type=\"button\"\n class=\"assistant-quick-menu-danger\"\n (click)=\"clearHistory()\"\n [disabled]=\"!historySessions.length\"\n >\n <mat-icon>delete_outline</mat-icon>\n <span>Limpar hist\u00F3rico local</span>\n </button>\n </mat-menu>\n </div>\n\n</ng-template>\n", styles: ["@keyframes assistantPremiumEnter{0%{opacity:0;transform:translate(14px) scale(.99)}to{opacity:1;transform:translate(0) scale(1)}}:host ::ng-deep .ai-assistant-backdrop{background:color-mix(in srgb,var(--md-sys-color-scrim, var(--md-sys-color-shadow, var(--md-sys-color-on-surface))) 42%,transparent);-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}::ng-deep .ai-assistant-overlay-pane{max-width:calc(100vw - 24px);max-height:calc(100vh - 24px)}.ai-assistant-panel{box-sizing:border-box;width:min(604px,100vw - 18px);min-height:min(620px,100vh - 18px);max-height:min(820px,100vh - 18px);display:flex;flex-direction:column;overflow:hidden;color:var(--md-sys-color-on-surface);border-left:1px solid color-mix(in srgb,var(--md-sys-color-primary) 24%,var(--md-sys-color-outline-variant));border-top:1px solid color-mix(in srgb,var(--md-sys-color-primary) 18%,var(--md-sys-color-outline-variant));border-bottom:1px solid color-mix(in srgb,var(--md-sys-color-primary) 18%,var(--md-sys-color-outline-variant));box-shadow:0 18px 48px color-mix(in srgb,var(--md-sys-color-shadow, var(--md-sys-color-on-surface)) 42%,transparent),inset 0 1px color-mix(in srgb,var(--md-sys-color-on-surface) 10%,transparent);background:radial-gradient(circle at 14% 8%,color-mix(in srgb,var(--md-sys-color-primary-container) 38%,transparent) 0%,transparent 44%),linear-gradient(165deg,color-mix(in srgb,var(--md-sys-color-surface-container-highest) 88%,var(--md-sys-color-surface)),var(--md-sys-color-surface));animation:assistantPremiumEnter .24s cubic-bezier(.22,1,.36,1)}.assistant-header{position:relative;display:flex;align-items:flex-start;justify-content:space-between;gap:12px;padding:12px 16px 10px;border-bottom:1px solid color-mix(in srgb,var(--md-sys-color-primary) 18%,var(--md-sys-color-outline-variant));background:linear-gradient(130deg,color-mix(in srgb,var(--md-sys-color-primary-container) 28%,transparent) 0%,transparent 52%),var(--md-sys-color-surface-container-low)}.assistant-header:after{content:\"\";position:absolute;left:16px;right:16px;bottom:-1px;height:1px;background:linear-gradient(90deg,color-mix(in srgb,var(--md-sys-color-primary) 55%,transparent),transparent);pointer-events:none}.assistant-header .assistant-header__left{min-width:0;display:flex;align-items:flex-start;gap:12px}.assistant-header .magic-icon{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;width:30px;height:30px;font-size:18px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 30%,transparent);box-shadow:0 4px 12px color-mix(in srgb,var(--md-sys-color-primary) 26%,transparent)}.assistant-header .assistant-title-group{min-width:0;display:flex;flex-direction:column;gap:4px}.assistant-header .assistant-title{font-size:15px;font-weight:700;letter-spacing:.01em;overflow-wrap:anywhere}.assistant-header .assistant-subtitle{display:block;font-size:11px;line-height:1.25;color:color-mix(in srgb,var(--md-sys-color-on-surface) 70%,var(--md-sys-color-on-surface-variant));overflow-wrap:anywhere}.assistant-header-chips{display:inline-flex;align-items:center;flex-wrap:wrap;gap:6px}.assistant-header .mode-chip{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;border-radius:999px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 28%,var(--md-sys-color-outline-variant));background:color-mix(in srgb,var(--md-sys-color-primary-container) 64%,var(--md-sys-color-surface-container));color:color-mix(in srgb,var(--md-sys-color-on-primary-container) 85%,var(--md-sys-color-on-surface));font-size:10px;font-weight:700;letter-spacing:.04em;text-transform:uppercase}.assistant-header .mode-chip:before{content:\"\";width:6px;height:6px;border-radius:999px;background:currentColor;box-shadow:0 0 0 3px color-mix(in srgb,currentColor 16%,transparent)}.assistant-header .mode-chip.mock{border-color:color-mix(in srgb,var(--md-sys-color-error) 34%,var(--md-sys-color-outline-variant));background:color-mix(in srgb,var(--md-sys-color-error-container) 72%,var(--md-sys-color-surface-container));color:color-mix(in srgb,var(--md-sys-color-on-error-container) 85%,var(--md-sys-color-error))}.assistant-header .policy-chip{padding:2px 8px;border-radius:999px;border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant) 84%,transparent);background:var(--md-sys-color-surface-container-high);font-size:10px;letter-spacing:.02em;font-weight:600}.assistant-header .policy-chip.strict{border-color:color-mix(in srgb,var(--md-sys-color-primary) 42%,var(--md-sys-color-outline-variant));background:color-mix(in srgb,var(--md-sys-color-primary-container) 56%,var(--md-sys-color-surface-container-high))}.assistant-status{display:flex;align-items:flex-start;gap:10px;padding:10px 16px;border-bottom:1px solid color-mix(in srgb,var(--md-sys-color-primary) 18%,var(--md-sys-color-outline-variant));border-radius:0;background:linear-gradient(160deg,color-mix(in srgb,var(--md-sys-color-primary-container) 24%,transparent),transparent 48%),var(--md-sys-color-surface-container-low)}.assistant-status-dot{width:8px;height:8px;margin-top:6px;border-radius:999px;flex:0 0 auto;background:var(--md-sys-color-primary);box-shadow:0 0 0 4px color-mix(in srgb,var(--md-sys-color-primary) 16%,transparent)}.assistant-status.warning .assistant-status-dot{background:var(--md-sys-color-error);box-shadow:0 0 0 4px color-mix(in srgb,var(--md-sys-color-error) 16%,transparent)}.assistant-status.success .assistant-status-dot{background:color-mix(in srgb,var(--md-sys-color-primary) 74%,var(--md-sys-color-tertiary, var(--md-sys-color-primary)))}.assistant-status-content{min-width:0;display:flex;flex-direction:column;gap:2px}.assistant-status-label{display:flex;align-items:center;flex-wrap:wrap;gap:4px;font-size:12px;font-weight:700;line-height:1.35}.assistant-status-detail{font-size:11px;line-height:1.4;color:var(--md-sys-color-on-surface-variant);overflow-wrap:anywhere}.assistant-status-mode{padding:1px 6px;border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-primary-container) 72%,transparent);color:var(--md-sys-color-on-primary-container);font-size:10px;font-weight:700}.assistant-nav{padding:8px 16px 0}.assistant-nav .assistant-tabs{display:flex;align-items:center;gap:4px;border-radius:12px;padding:5px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 24%,var(--md-sys-color-outline-variant));border-color:color-mix(in srgb,var(--md-sys-color-primary) 24%,var(--md-sys-color-outline-variant));background:linear-gradient(155deg,color-mix(in srgb,var(--md-sys-color-primary-container) 14%,transparent),transparent 58%),var(--md-sys-color-surface-container-low)}.assistant-nav .assistant-tab{appearance:none;min-width:0;min-height:30px;border:0;border-radius:8px;padding:0 10px;background:transparent;color:var(--md-sys-color-on-surface-variant);cursor:pointer;display:inline-flex;align-items:center;justify-content:center;flex:1 1 0;font-size:11px;font-weight:700;letter-spacing:.01em}.assistant-nav .assistant-tab.active{background:var(--md-sys-color-surface-container-highest);color:var(--md-sys-color-on-surface);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--md-sys-color-primary) 34%,transparent),0 6px 12px color-mix(in srgb,var(--md-sys-color-primary) 18%,transparent)}.assistant-section,.assistant-card{border-radius:14px;border-color:color-mix(in srgb,var(--md-sys-color-primary) 20%,var(--md-sys-color-outline-variant));background:linear-gradient(160deg,color-mix(in srgb,var(--md-sys-color-primary-container) 16%,transparent),transparent 50%),var(--md-sys-color-surface-container-lowest);box-shadow:0 6px 18px color-mix(in srgb,var(--md-sys-color-shadow, var(--md-sys-color-on-surface)) 12%,transparent),inset 0 1px color-mix(in srgb,var(--md-sys-color-on-surface) 7%,transparent)}.suggestions-hero{margin:2px 0 4px;padding:10px 12px;border-radius:12px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 24%,var(--md-sys-color-outline-variant));background:linear-gradient(120deg,color-mix(in srgb,var(--md-sys-color-primary-container) 34%,transparent) 0%,transparent 52%),var(--md-sys-color-surface-container-low)}.suggestions-hero__label{font-size:10px;letter-spacing:.08em;text-transform:uppercase;font-weight:700;color:var(--md-sys-color-on-surface-variant);opacity:.88}.suggestions-hero__title{margin-top:2px;font-size:13px;font-weight:700;color:var(--md-sys-color-on-surface)}.suggestions-hero__detail{margin-top:4px;font-size:12px;line-height:1.4;color:color-mix(in srgb,var(--md-sys-color-on-surface) 78%,var(--md-sys-color-on-surface-variant))}.suggestions-content .suggestion-item{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:12px;padding:12px;border-radius:12px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 18%,var(--md-sys-color-outline-variant));border-color:color-mix(in srgb,var(--md-sys-color-primary) 18%,var(--md-sys-color-outline-variant));background:linear-gradient(140deg,color-mix(in srgb,var(--md-sys-color-primary-container) 16%,transparent),transparent 56%),var(--md-sys-color-surface-container-lowest);transition:transform .2s cubic-bezier(.25,.8,.25,1),border-color .2s ease,box-shadow .2s ease}.suggestions-list{display:flex;flex-direction:column;gap:10px}.suggestion-copy{min-width:0;display:grid;gap:4px}.suggestion-main{min-width:0;display:flex;align-items:center;flex-wrap:wrap;gap:8px}.suggestion-icon{width:18px;height:18px;font-size:18px;flex:0 0 auto;color:var(--md-sys-color-primary)}.suggestion-label{min-width:0;font-size:13px;font-weight:700;line-height:1.35;overflow-wrap:anywhere}.suggestion-group{padding:2px 6px;border-radius:999px;background:var(--md-sys-color-surface-container-high);color:var(--md-sys-color-on-surface-variant);font-size:10px;font-weight:700;line-height:1.2}.suggestion-desc{font-size:12px;line-height:1.35;color:var(--md-sys-color-on-surface-variant);overflow-wrap:anywhere}.suggestion-actions{display:inline-flex;align-items:center;justify-content:flex-end;gap:4px}.suggestion-action-btn,.suggestion-arrow{width:32px;height:32px;display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;color:var(--md-sys-color-on-surface-variant)}.suggestions-content .suggestion-item:hover,.suggestions-content .suggestion-item:focus-visible{border-color:color-mix(in srgb,var(--md-sys-color-primary) 58%,var(--md-sys-color-outline-variant));box-shadow:0 8px 18px color-mix(in srgb,var(--md-sys-color-primary) 18%,transparent),inset 0 0 0 1px color-mix(in srgb,var(--md-sys-color-primary) 28%,transparent);transform:translateY(-2px) scale(1.01)}.assistant-footer{display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:8px;padding:10px 16px;border-top-color:color-mix(in srgb,var(--md-sys-color-primary) 20%,var(--md-sys-color-outline-variant));background:linear-gradient(180deg,color-mix(in srgb,var(--md-sys-color-primary-container) 16%,transparent),transparent 56%),var(--md-sys-color-surface-container-low)}.assistant-footer .task-footer{grid-column:1/-1}.composer-leading{width:30px;height:30px;display:inline-flex;align-items:center;justify-content:center;border-radius:999px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 30%,var(--md-sys-color-outline-variant));background:color-mix(in srgb,var(--md-sys-color-primary-container) 70%,var(--md-sys-color-surface-container-low));color:var(--md-sys-color-primary);box-shadow:0 4px 10px color-mix(in srgb,var(--md-sys-color-primary) 16%,transparent)}.composer-leading mat-icon{width:16px;height:16px;font-size:16px}.assistant-footer input{box-sizing:border-box;width:100%;min-width:0;height:34px;border:1px solid;border-radius:8px;padding:0 12px;color:var(--md-sys-color-on-surface);border-color:color-mix(in srgb,var(--md-sys-color-primary) 24%,var(--md-sys-color-outline-variant));background:var(--md-sys-color-surface);box-shadow:inset 0 1px 2px color-mix(in srgb,var(--md-sys-color-shadow, var(--md-sys-color-on-surface)) 12%,transparent)}.send-actions{min-width:36px;display:inline-flex;align-items:center;justify-content:center}.assistant-footer .send-btn{--mdc-icon-button-icon-size: 20px;--mdc-icon-button-state-layer-size: 36px;--mat-icon-button-state-layer-size: 36px;width:36px;height:36px;padding:8px;line-height:1;display:inline-flex;align-items:center;justify-content:center;border-color:color-mix(in srgb,var(--md-sys-color-primary) 24%,var(--md-sys-color-outline-variant));background:var(--md-sys-color-surface)}.assistant-footer .send-btn mat-icon{width:20px;height:20px;margin:0;font-size:20px;line-height:20px;display:inline-flex;align-items:center;justify-content:center}.assistant-footer .send-btn.ready{background:linear-gradient(135deg,color-mix(in srgb,var(--md-sys-color-primary-container) 84%,var(--md-sys-color-primary)),var(--md-sys-color-primary));color:var(--md-sys-color-on-primary);box-shadow:0 8px 18px color-mix(in srgb,var(--md-sys-color-primary) 30%,transparent)}.task-primary-btn{border-radius:12px;box-shadow:0 8px 18px color-mix(in srgb,var(--md-sys-color-primary) 24%,transparent)}@media(max-width:959px){.assistant-header{padding:12px 12px 10px}.assistant-section,.assistant-card{margin:4px 12px 10px}.assistant-header:after{left:12px;right:12px}.assistant-header .assistant-title{font-size:14px}.assistant-header .assistant-subtitle{font-size:10px}.assistant-footer{grid-template-columns:minmax(0,1fr) auto}.composer-leading{display:none}}.assistant-thought{margin-top:0;gap:10px;border-color:color-mix(in srgb,var(--md-sys-color-primary) 26%,var(--md-sys-color-outline-variant));background:linear-gradient(145deg,color-mix(in srgb,var(--md-sys-color-primary-container) 28%,transparent),transparent 58%),var(--md-sys-color-surface-container-low)}.assistant-thought-meta{display:inline-flex;align-items:center;gap:6px;font-size:11px;color:var(--md-sys-color-on-surface-variant)}.assistant-thought-meta mat-icon{width:15px;height:15px;font-size:15px;color:var(--md-sys-color-primary)}.assistant-thought-summary{font-size:13px;line-height:1.45;color:var(--md-sys-color-on-surface)}.assistant-thought-plan{border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 32%,var(--md-sys-color-outline-variant));border-radius:12px;padding:10px;background:var(--md-sys-color-surface-container-lowest);display:flex;flex-direction:column;gap:8px}.assistant-thought-plan-title{font-size:13px;font-weight:700;color:var(--md-sys-color-on-surface)}.assistant-thought-plan-actions{display:grid;grid-template-columns:repeat(auto-fit,minmax(0,1fr));gap:8px}.assistant-thought-plan-actions .mdc-button{min-width:0}.assistant-thought-plan-hint{font-size:11px;color:var(--md-sys-color-on-surface-variant);line-height:1.35}.assistant-thought-checklist{display:flex;flex-direction:column;gap:5px}.assistant-thought-checklist-item{display:inline-flex;align-items:center;gap:6px;font-size:12px;color:var(--md-sys-color-on-surface-variant)}.assistant-thought-checklist-item mat-icon{width:14px;height:14px;font-size:14px}.assistant-thought-shimmer{display:flex;flex-direction:column;gap:8px;margin-top:4px}.assistant-thought-shimmer .shimmer-line{height:12px;border-radius:4px;position:relative;overflow:hidden;background:var(--md-sys-color-surface-container-highest)}.assistant-thought-shimmer .shimmer-line:after{content:\"\";position:absolute;inset:0;transform:translate(-100%);background:linear-gradient(90deg,transparent,color-mix(in srgb,var(--md-sys-color-primary) 8%,transparent),transparent);animation:assistantShimmerEffect 1.5s infinite}.assistant-thought-shimmer .shimmer-line-1{width:85%}.assistant-thought-shimmer .shimmer-line-2{width:92%}.assistant-thought-shimmer .shimmer-line-3{width:64%}@keyframes assistantShimmerEffect{to{transform:translate(100%)}}.assistant-flow{grid-template-columns:1fr;gap:6px}.flow-step{display:flex;align-items:flex-start;gap:8px;text-align:left;padding:7px 8px;border-radius:10px}.flow-step-index{width:18px;height:18px;border-radius:999px;display:inline-flex;align-items:center;justify-content:center;font-size:10px;font-weight:700;border:1px solid var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface-container-highest);color:var(--md-sys-color-on-surface);flex:0 0 auto}.flow-step-content{min-width:0;display:flex;flex-direction:column;gap:1px}.flow-step-label{font-size:11px;font-weight:700;color:var(--md-sys-color-on-surface)}.flow-step-detail{font-size:11px;color:var(--md-sys-color-on-surface-variant);line-height:1.3}.flow-step.active .flow-step-index{border-color:color-mix(in srgb,var(--md-sys-color-primary) 60%,var(--md-sys-color-outline-variant));background:color-mix(in srgb,var(--md-sys-color-primary-container) 85%,var(--md-sys-color-surface-container-highest));color:var(--md-sys-color-on-primary-container)}.flow-step.done .flow-step-index{border-color:transparent;background:color-mix(in srgb,var(--md-sys-color-primary) 18%,var(--md-sys-color-surface-container-highest))}.task-timeline{margin-top:4px;display:grid;gap:6px}.task-timeline-item{display:flex;align-items:flex-start;gap:8px;border:1px solid var(--md-sys-color-outline-variant);border-radius:10px;padding:6px 8px;background:var(--md-sys-color-surface-container-low);opacity:.76}.task-timeline-item.active{opacity:1;border-color:color-mix(in srgb,var(--md-sys-color-primary) 40%,var(--md-sys-color-outline-variant));background:color-mix(in srgb,var(--md-sys-color-primary-container) 34%,var(--md-sys-color-surface-container-low))}.task-timeline-item.done{opacity:.9;border-color:color-mix(in srgb,var(--md-sys-color-primary) 24%,var(--md-sys-color-outline-variant))}.task-timeline-dot{width:18px;height:18px;border-radius:999px;display:inline-flex;align-items:center;justify-content:center;font-size:10px;font-weight:700;border:1px solid var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface-container-highest);color:var(--md-sys-color-on-surface);flex:0 0 auto}.task-timeline-copy{min-width:0;display:flex;flex-direction:column;gap:1px}.task-timeline-title{font-size:11px;font-weight:700;color:var(--md-sys-color-on-surface)}.task-timeline-detail{font-size:11px;line-height:1.3;color:var(--md-sys-color-on-surface-variant)}.clarification-decision-head{display:inline-flex;align-items:center;width:100%;gap:6px;padding:8px 12px 0;box-sizing:border-box}.clarification-decision-index{width:18px;height:18px;border-radius:999px;display:inline-flex;align-items:center;justify-content:center;font-size:10px;font-weight:700;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 35%,var(--md-sys-color-outline-variant));color:var(--md-sys-color-primary);background:color-mix(in srgb,var(--md-sys-color-primary-container) 68%,transparent)}.clarification-decision-type{font-size:10px;letter-spacing:.08em;text-transform:uppercase;color:var(--md-sys-color-on-surface-variant);opacity:.92}.clarification-decision-state{font-size:10px;font-weight:700;color:var(--md-sys-color-primary)}.clarification-option{border-color:color-mix(in srgb,var(--md-sys-color-primary) 20%,var(--md-sys-color-outline-variant));background:linear-gradient(145deg,color-mix(in srgb,var(--md-sys-color-primary-container) 16%,transparent),transparent 55%),var(--md-sys-color-surface-container-low)}.clarification-option.selected{border-color:color-mix(in srgb,var(--md-sys-color-primary) 56%,var(--md-sys-color-outline-variant));background:linear-gradient(145deg,color-mix(in srgb,var(--md-sys-color-primary-container) 44%,transparent),transparent 62%),var(--md-sys-color-surface-container);box-shadow:0 8px 16px color-mix(in srgb,var(--md-sys-color-primary) 18%,transparent)}.clarification-options-block{overflow:visible;padding-right:4px}@media(max-width:959px){.assistant-thought-plan-actions{grid-template-columns:1fr}}.ai-assistant-panel{width:min(604px,100vw - 18px)}.assistant-section,.assistant-card{margin:0;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 20%,var(--md-sys-color-outline-variant))}.assistant-section{min-height:0;padding:14px 16px;overflow:visible}.assistant-card{min-height:0;padding:14px 16px 16px;overflow:visible}.suggestions-area,.assistant-history,.loading-suggestions{overflow-y:auto;overflow-x:hidden}.section-header{min-width:0;display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:10px}.section-title{min-width:0;font-size:14px;font-weight:700;line-height:1.35;overflow-wrap:anywhere}.suggestions-actions{flex:0 0 auto;display:inline-flex;align-items:center}.review-area,.error-area,.success-area,.clarification-area{padding:0;overflow-y:auto;overflow-x:hidden;scrollbar-gutter:auto}.review-trust{margin:2px 0 4px}.trust-chip{max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.warnings-area,.review-summary,.review-diff,.apply-details,.clarification-options-block,.clarification-manual-toggle{width:100%;max-width:100%;min-width:0}.review-diff{padding:12px 14px}.review-diff-full{padding:10px;overflow-x:auto}.review-diff-block{min-width:0}.review-diff-block pre{overflow-wrap:anywhere;word-break:break-word}.clarification-options-block{padding:4px 2px 10px}.clarification-option{line-height:normal}:host ::ng-deep .clarification-option .mdc-button__label{line-height:1.35!important}.clarification-plain-label{padding:6px 12px 12px;font-size:14px;line-height:1.35}.clarification-manual-toggle{margin-top:10px;padding:10px 2px 0;flex-wrap:wrap;row-gap:6px}.suggestions-content .suggestion-actions{gap:6px}.suggestions-content .suggestion-arrow,.suggestions-content .suggestion-action-btn mat-icon,.suggestions-content .suggestion-arrow mat-icon{display:inline-flex;align-items:center;justify-content:center}:host ::ng-deep .assistant-quick-menu-panel{min-width:244px;max-width:min(90vw,320px);border-radius:14px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 26%,var(--md-sys-color-outline-variant));background:var(--md-sys-color-surface-container-high);box-shadow:0 12px 28px color-mix(in srgb,var(--md-sys-color-shadow, var(--md-sys-color-on-surface)) 32%,transparent),inset 0 1px color-mix(in srgb,var(--md-sys-color-on-surface) 6%,transparent);overflow:hidden;padding:6px}:host ::ng-deep .assistant-quick-menu-panel .mat-mdc-menu-item{min-height:36px;border-radius:10px;color:var(--md-sys-color-on-surface);font-size:12px;font-weight:500;margin:1px 0}:host ::ng-deep .assistant-quick-menu-panel .mat-mdc-menu-item .mat-icon{color:color-mix(in srgb,var(--md-sys-color-on-surface) 82%,var(--md-sys-color-on-surface-variant))}:host ::ng-deep .assistant-quick-menu-panel .mat-mdc-menu-item:hover:not([disabled]){background:color-mix(in srgb,var(--md-sys-color-primary-container) 45%,transparent)}:host ::ng-deep .assistant-quick-menu-panel .mat-mdc-menu-item:focus-visible{outline:2px solid var(--md-sys-color-primary);outline-offset:-2px}:host ::ng-deep .assistant-quick-menu-panel .assistant-quick-menu-danger{color:var(--md-sys-color-error)}:host ::ng-deep .assistant-quick-menu-panel .assistant-quick-menu-danger .mat-icon{color:var(--md-sys-color-error)}@media(max-width:959px){::ng-deep .ai-assistant-overlay-pane{top:12px!important;left:12px!important;width:calc(100vw - 24px)!important;height:calc(100vh - 24px)!important;max-width:calc(100vw - 24px);max-height:calc(100vh - 24px);transform:none!important}.ai-assistant-panel{width:calc(100vw - 48px);min-height:min(620px,100vh - 48px);max-height:calc(100vh - 48px)}.assistant-section,.assistant-card{margin:0}.assistant-card,.assistant-section{padding:12px}}.ai-trigger-btn{--mdc-icon-button-state-layer-size: 36px;width:36px;height:36px;border-radius:8px;background:color-mix(in srgb,var(--md-sys-color-primary) 9%,transparent);border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 22%,transparent);color:var(--md-sys-color-primary);opacity:1}.ai-trigger-btn:hover:not(:disabled){background:color-mix(in srgb,var(--md-sys-color-primary) 16%,transparent);border-color:color-mix(in srgb,var(--md-sys-color-primary) 36%,transparent);color:var(--md-sys-color-on-primary-container)}.ai-trigger-btn:focus-visible,.assistant-close-btn:focus-visible,.assistant-tab:focus-visible{outline:2px solid var(--md-sys-color-primary);outline-offset:2px}.assistant-close-btn{width:28px;height:28px;color:var(--md-sys-color-on-surface-variant)}.assistant-close-btn:hover:not(:disabled){background:var(--md-sys-color-surface-container-high);color:var(--md-sys-color-on-surface)}.assistant-body{padding:12px 16px;overflow:hidden;min-height:0;flex:1;display:flex;flex-direction:column;gap:12px}.assistant-body>*{min-height:0}@media(max-width:959px){.assistant-nav{padding:8px 12px 0}.assistant-body,.assistant-footer{padding:10px 12px}.suggestions-content .suggestion-item{grid-template-columns:1fr;align-items:start}.suggestion-actions{justify-content:flex-start}}\n"] }]
6839
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- Trigger Button -->\n<button\n mat-icon-button\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n #triggerBtn\n (click)=\"open()\"\n [disabled]=\"isOpen\"\n class=\"ai-trigger-btn\"\n matTooltip=\"Assistente de Configura\u00E7\u00E3o\"\n aria-label=\"Abrir Assistente IA\">\n <mat-icon>auto_awesome</mat-icon>\n</button>\n\n<!-- Overlay Template -->\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"isOpen\"\n [cdkConnectedOverlayHasBackdrop]=\"hasBackdrop\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayPush]=\"true\"\n [cdkConnectedOverlayViewportMargin]=\"12\"\n cdkConnectedOverlayPanelClass=\"ai-assistant-overlay-pane\"\n cdkConnectedOverlayBackdropClass=\"ai-assistant-backdrop\"\n (backdropClick)=\"close()\"\n (overlayOutsideClick)=\"close()\"\n (detach)=\"close()\">\n\n <div\n class=\"ai-assistant-panel\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Assistente de Configura\u00E7\u00E3o\"\n [attr.aria-busy]=\"isBusyState() ? 'true' : null\"\n [cdkTrapFocus]=\"hasBackdrop\"\n [cdkTrapFocusAutoCapture]=\"hasBackdrop\"\n (keydown)=\"onKeydown($event)\"\n >\n\n <!-- HEADER -->\n <div class=\"assistant-header\">\n <div class=\"assistant-header__left\">\n <mat-icon class=\"magic-icon\">auto_awesome</mat-icon>\n <div class=\"assistant-title-group\">\n <div class=\"assistant-title\">Assistente de Configura\u00E7\u00E3o</div>\n <div class=\"assistant-subtitle\">Copiloto contextual para ajustes guiados</div>\n <div class=\"assistant-header-chips\">\n <span\n class=\"mode-chip\"\n [class.mock]=\"mockMode\"\n [matTooltip]=\"mockMode ? 'Sem chave de API: respostas de demonstra\u00E7\u00E3o' : 'Conectado ao assistente configurado'\"\n >\n {{ mockMode ? 'Mock' : 'Conectado' }}\n </span>\n <span\n class=\"policy-chip\"\n [class.strict]=\"isStrictRiskPolicy()\"\n [matTooltip]=\"getRiskPolicyTooltip()\"\n >\n {{ getRiskPolicyLabel() }}\n </span>\n </div>\n </div>\n </div>\n <div class=\"assistant-header__right\">\n <button\n mat-icon-button\n type=\"button\"\n class=\"assistant-close-btn\"\n (click)=\"close()\"\n aria-label=\"Fechar assistente\"\n matTooltip=\"Fechar assistente\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </div>\n </div>\n <div\n class=\"assistant-status\"\n [class.processing]=\"isBusyState()\"\n [class.pending]=\"state === 'clarification'\"\n [class.warning]=\"state === 'error'\"\n [class.success]=\"state === 'review' || state === 'success'\"\n [class.compact]=\"!shouldShowSystemStatusDetail()\"\n role=\"status\"\n [attr.aria-live]=\"getSystemStatusAriaLive()\"\n aria-atomic=\"true\"\n >\n <span class=\"assistant-status-dot\" aria-hidden=\"true\"></span>\n <div class=\"assistant-status-content\">\n <div class=\"assistant-status-label\">\n <span class=\"assistant-status-label-prefix\">Status:</span>\n <span>{{ getSystemStatusLabel() }}</span>\n @if (shouldShowSnapshotFallbackBadge()) {\n <span class=\"assistant-status-mode\">Snapshot</span>\n }\n </div>\n @if (shouldShowSystemStatusDetail()) {\n <div class=\"assistant-status-detail\">{{ getSystemStatusDetail() }}</div>\n }\n </div>\n </div>\n @if (shouldShowTaskFlow()) {\n <div class=\"assistant-flow\" role=\"list\" aria-label=\"Fluxo da proposta\">\n @for (step of flowSteps; track step) {\n <div\n class=\"flow-step\"\n role=\"listitem\"\n [class.active]=\"getFlowStepState(step.step) === 'active'\"\n [class.done]=\"getFlowStepState(step.step) === 'done'\"\n >\n <span class=\"flow-step-index\">{{ step.step }}</span>\n <span class=\"flow-step-content\">\n <span class=\"flow-step-label\">{{ step.label }}</span>\n <span class=\"flow-step-detail\">{{ getFlowStepDetail(step.step) }}</span>\n </span>\n </div>\n }\n </div>\n }\n <div class=\"assistant-nav\">\n <div\n class=\"assistant-tabs\"\n role=\"tablist\"\n aria-label=\"Se\u00E7\u00F5es do assistente\"\n (keydown)=\"onTabsKeydown($event)\"\n >\n @if (isTaskMode()) {\n <button\n class=\"assistant-tab\"\n type=\"button\"\n id=\"assistant-tab-task\"\n role=\"tab\"\n aria-label=\"Proposta atual\"\n [attr.aria-selected]=\"isActiveTab('task')\"\n aria-controls=\"assistant-panel-task\"\n [attr.tabindex]=\"isActiveTab('task') ? 0 : -1\"\n [class.active]=\"isActiveTab('task')\"\n (click)=\"setActiveTab('task')\"\n >\n Proposta\n @if (hasPendingClarification() && !isActiveTab('task')) {\n <span class=\"assistant-tab-badge\">1</span>\n }\n </button>\n }\n <button\n class=\"assistant-tab\"\n type=\"button\"\n id=\"assistant-tab-chat\"\n role=\"tab\"\n aria-label=\"Hist\u00F3rico\"\n [attr.aria-selected]=\"isActiveTab('chat')\"\n aria-controls=\"assistant-panel-chat\"\n [attr.tabindex]=\"isActiveTab('chat') ? 0 : -1\"\n [class.active]=\"isActiveTab('chat')\"\n (click)=\"setActiveTab('chat')\"\n >\n Hist\u00F3rico\n </button>\n <button\n class=\"assistant-tab\"\n type=\"button\"\n id=\"assistant-tab-suggestions\"\n role=\"tab\"\n aria-label=\"Sugest\u00F5es de melhoria\"\n [attr.aria-selected]=\"isActiveTab('suggestions')\"\n aria-controls=\"assistant-panel-suggestions\"\n [attr.tabindex]=\"isActiveTab('suggestions') ? 0 : -1\"\n [class.active]=\"isActiveTab('suggestions')\"\n (click)=\"setActiveTab('suggestions')\"\n >\n Sugest\u00F5es\n </button>\n </div>\n </div>\n\n <!-- BODY: Dynamic Content based on State -->\n <div class=\"assistant-body\">\n @if (shouldShowThoughtCard()) {\n <div class=\"assistant-thought assistant-section\">\n <div class=\"assistant-thought-meta\">\n <mat-icon>psychology</mat-icon>\n <span>{{ getThoughtTimingLabel() }}</span>\n </div>\n <div class=\"assistant-thought-summary\">{{ getThoughtSummary() }}</div>\n <div class=\"assistant-thought-plan\">\n <div class=\"assistant-thought-plan-title\">{{ getThoughtPlanTitle() }}</div>\n <div class=\"assistant-thought-plan-actions\">\n <button\n mat-stroked-button\n type=\"button\"\n class=\"thought-action-details\"\n (click)=\"openThoughtDetails()\"\n [attr.aria-label]=\"getThoughtDetailsLabel()\"\n [matTooltip]=\"getThoughtDetailsTooltip()\"\n >\n {{ getThoughtDetailsLabel() }}\n </button>\n @if (shouldShowThoughtPreviewAction()) {\n <button\n mat-flat-button\n color=\"primary\"\n type=\"button\"\n class=\"thought-action-preview\"\n (click)=\"openThoughtPreview()\"\n [matTooltip]=\"getThoughtPreviewTooltip()\"\n >\n Pr\u00E9via\n </button>\n }\n </div>\n <div class=\"assistant-thought-plan-hint\">{{ getThoughtActionHint() }}</div>\n @if (getThoughtChecklist(); as thoughtChecklist) {\n @if (thoughtChecklist.length) {\n <div class=\"assistant-thought-checklist\">\n @for (item of thoughtChecklist; track item) {\n <div class=\"assistant-thought-checklist-item\">\n <mat-icon>radio_button_unchecked</mat-icon>\n <span>{{ item }}</span>\n </div>\n }\n </div>\n }\n @if (isBusyState() && !thoughtChecklist.length) {\n <div class=\"assistant-thought-shimmer\">\n <div class=\"shimmer-line shimmer-line-1\"></div>\n <div class=\"shimmer-line shimmer-line-2\"></div>\n <div class=\"shimmer-line shimmer-line-3\"></div>\n </div>\n }\n }\n </div>\n </div>\n }\n @if (processingInfoVisible) {\n <div class=\"processing-banner\">\n <mat-spinner diameter=\"16\"></mat-spinner>\n <span>{{ aiExplanation || 'Analisando solicita\u00E7\u00E3o e preparando proposta...' }}</span>\n <button mat-button type=\"button\" class=\"processing-retry\" (click)=\"retryProcessing()\">Tentar novamente</button>\n </div>\n }\n @if (historyContext && isActiveTab('chat')) {\n <div\n class=\"assistant-history assistant-section\"\n id=\"assistant-panel-chat\"\n role=\"tabpanel\"\n aria-labelledby=\"assistant-tab-chat\"\n >\n <div class=\"section-header\">\n <div class=\"section-heading\">\n <div class=\"section-title\">Hist\u00F3rico</div>\n <div class=\"section-subtitle\">Sess\u00F5es recentes, pedidos reaproveit\u00E1veis e desfazer r\u00E1pido.</div>\n </div>\n <div class=\"history-actions\" role=\"group\" aria-label=\"A\u00E7\u00F5es do hist\u00F3rico\">\n <button\n mat-stroked-button\n type=\"button\"\n class=\"history-action-btn\"\n (click)=\"historyExpanded = !historyExpanded\"\n [matTooltip]=\"historyExpanded ? 'Recolher hist\u00F3rico' : 'Expandir hist\u00F3rico'\"\n [attr.aria-label]=\"historyExpanded ? 'Recolher hist\u00F3rico' : 'Expandir hist\u00F3rico'\"\n [disabled]=\"!historyWarnings.length && !historySessions.length && !activeHistoryMessages.length\"\n >\n <mat-icon>{{ historyExpanded ? 'expand_less' : 'expand_more' }}</mat-icon>\n <span>{{ historyExpanded ? 'Recolher' : 'Expandir' }}</span>\n </button>\n <button\n mat-stroked-button\n type=\"button\"\n class=\"history-action-btn\"\n (click)=\"startNewSession()\"\n matTooltip=\"Nova conversa\"\n aria-label=\"Nova conversa\"\n [disabled]=\"isBusyState()\"\n >\n <mat-icon>add_comment</mat-icon>\n <span>Nova conversa</span>\n </button>\n <button\n mat-stroked-button\n type=\"button\"\n (click)=\"clearHistory()\"\n matTooltip=\"Limpar hist\u00F3rico local\"\n aria-label=\"Limpar hist\u00F3rico local\"\n class=\"history-action-btn history-action-btn--danger\"\n [disabled]=\"!historySessions.length\"\n >\n <mat-icon>delete_outline</mat-icon>\n <span>Limpar</span>\n </button>\n </div>\n </div>\n @if (historyUndoDeleteSession) {\n <div class=\"history-undo\">\n <span>Sess\u00E3o removida.</span>\n <button mat-button type=\"button\" (click)=\"undoRemoveHistorySession()\">\n Desfazer\n </button>\n </div>\n }\n @if (historyExpanded && historyWarnings.length) {\n <div class=\"history-warnings\">\n <mat-icon>info</mat-icon>\n <div class=\"history-warnings-list\">\n @for (warning of historyWarnings; track warning) {\n <div>{{ warning }}</div>\n }\n <div class=\"history-warnings-hint\">\n Configure headers via API_CONFIG_STORAGE_OPTIONS no host.\n </div>\n </div>\n </div>\n }\n @if (historyExpanded && historySessions.length) {\n <div class=\"history-sessions\">\n @for (session of historySessions; track session.id) {\n <div\n class=\"history-session\"\n role=\"button\"\n tabindex=\"0\"\n (click)=\"selectHistorySession(session.id)\"\n (keydown)=\"onHistorySessionCardKeydown($event, session.id)\"\n [class.active]=\"session.id === activeHistorySession?.id\"\n [matTooltip]=\"getHistorySessionTooltip(session)\"\n [matTooltipDisabled]=\"!session.componentType && !session.componentId\"\n >\n <div class=\"history-session-main\">\n <span class=\"history-session-title\">{{ session.title }}</span>\n <div class=\"history-session-main-right\">\n <span class=\"history-session-time\">{{ session.updatedAt | date:'short' }}</span>\n <div class=\"history-session-tools\">\n <button\n mat-icon-button\n type=\"button\"\n class=\"history-session-tool\"\n (click)=\"reuseHistorySessionPrompt(session.id, $event)\"\n matTooltip=\"Reusar \u00FAltimo pedido\"\n aria-label=\"Reusar \u00FAltimo pedido\"\n >\n <mat-icon>edit_note</mat-icon>\n </button>\n <button\n mat-icon-button\n type=\"button\"\n class=\"history-session-tool history-session-tool--danger\"\n (click)=\"removeHistorySession(session.id, $event)\"\n matTooltip=\"Excluir sess\u00E3o\"\n aria-label=\"Excluir sess\u00E3o\"\n >\n <mat-icon>delete_outline</mat-icon>\n </button>\n </div>\n </div>\n </div>\n <div class=\"history-session-meta\">\n @if (session.componentType) {\n <span class=\"history-chip\">{{ session.componentType }}</span>\n }\n @if (session.componentId) {\n <span class=\"history-chip\">{{ session.componentId }}</span>\n }\n </div>\n </div>\n }\n </div>\n }\n @if (historyExpanded && !historySessions.length) {\n <div class=\"history-empty\">\n Nenhuma sess\u00E3o salva ainda.\n </div>\n }\n @if (historyExpanded && activeHistoryMessages.length) {\n <div class=\"history-messages\">\n @if (activeHistoryTotalMessages > activeHistoryMessages.length) {\n <div\n class=\"history-messages-hint\"\n >\n Mostrando \u00FAltimas {{ activeHistoryMessages.length }} de {{ activeHistoryTotalMessages }} mensagens.\n </div>\n }\n @for (msg of activeHistoryMessages; track msg.id) {\n <div\n class=\"history-message\"\n [class.user]=\"msg.role === 'user'\"\n [class.assistant]=\"msg.role === 'assistant'\"\n >\n <div class=\"history-message-header\">\n <span class=\"history-message-role\">{{ msg.role === 'user' ? 'Voc\u00EA' : 'Assistente' }}</span>\n <span class=\"history-message-time\">{{ msg.createdAt | date:'shortTime' }}</span>\n @if (msg.context?.usedRag) {\n <span\n class=\"history-rag\"\n matTooltip=\"Resposta baseada em contexto recuperado (RAG)\"\n >RAG</span>\n }\n </div>\n <div class=\"history-message-text\">{{ msg.text }}</div>\n </div>\n }\n </div>\n }\n @if (historyExpanded && historySessions.length && !activeHistoryMessages.length) {\n <div class=\"history-empty history-empty--panel\">\n Selecione uma sess\u00E3o para visualizar as mensagens.\n </div>\n }\n @if (historyExpanded) {\n <div class=\"history-helper\">\n O hist\u00F3rico \u00E9 local ao usu\u00E1rio e ao componente atual.\n </div>\n }\n </div>\n }\n\n @if (loadingSuggestions && isActiveTab('suggestions')) {\n <div\n class=\"loading-suggestions assistant-section\"\n id=\"assistant-panel-suggestions\"\n role=\"tabpanel\"\n aria-labelledby=\"assistant-tab-suggestions\"\n >\n <mat-spinner diameter=\"20\"></mat-spinner>\n <span>Carregando sugest\u00F5es de melhoria...</span>\n </div>\n }\n\n <!-- STATE: LISTENING (Suggestions) -->\n @if (state === 'listening' && isActiveTab('suggestions')) {\n <div\n class=\"suggestions-area assistant-section\"\n id=\"assistant-panel-suggestions\"\n role=\"tabpanel\"\n aria-labelledby=\"assistant-tab-suggestions\"\n >\n <div class=\"section-header\">\n <div class=\"section-title\">Sugest\u00F5es de melhoria</div>\n <div class=\"suggestions-actions\">\n <button mat-icon-button type=\"button\" (click)=\"refreshSuggestions()\" [disabled]=\"loadingSuggestions\" matTooltip=\"Atualizar sugest\u00F5es\">\n <mat-icon>refresh</mat-icon>\n </button>\n </div>\n </div>\n @if (!loadingSuggestions) {\n <div class=\"suggestions-hero\">\n <div class=\"suggestions-hero__label\">Contexto ativo</div>\n <div class=\"suggestions-hero__title\">{{ adapter.componentName || 'Componente atual' }}</div>\n <div class=\"suggestions-hero__detail\">{{ getSystemStatusDetail() }}</div>\n </div>\n }\n @if (suggestionsWarnings.length) {\n <div class=\"warnings-area\">\n <mat-icon class=\"warnings-icon\">warning_amber</mat-icon>\n <div class=\"warnings-content\">\n <div class=\"warnings-title\">Avisos</div>\n <div class=\"warnings-list\">\n @for (warning of suggestionsWarnings; track warning) {\n <div>{{ warning }}</div>\n }\n </div>\n </div>\n </div>\n }\n @if (!loadingSuggestions && (richSuggestions.length || hasDismissedSuggestions())) {\n <div class=\"suggestions-content\">\n @if (hasDismissedSuggestions()) {\n <div class=\"suggestions-filter\">\n <span>{{ getDismissedSuggestionCount() }} oculta(s)</span>\n <button mat-button type=\"button\" (click)=\"restoreDismissedSuggestions()\">\n Restaurar\n </button>\n </div>\n }\n @if (getVisibleSuggestions().length) {\n <div class=\"suggestions-list\">\n @for (sug of getVisibleSuggestions(); track sug.id) {\n <div\n class=\"suggestion-item\"\n role=\"button\"\n tabindex=\"0\"\n [attr.aria-label]=\"'Selecionar sugest\u00E3o: ' + sug.label\"\n (click)=\"selectSuggestion(sug)\"\n (keydown)=\"onSuggestionCardKeydown($event, sug)\"\n >\n <div class=\"suggestion-copy\">\n <div class=\"suggestion-main\">\n @if (sug.icon) {\n <mat-icon class=\"suggestion-icon\">{{ sug.icon }}</mat-icon>\n }\n <span class=\"suggestion-label\">{{ sug.label }}</span>\n @if (sug.group) {\n <span class=\"suggestion-group\">{{ sug.group }}</span>\n }\n </div>\n @if (sug.description) {\n <div class=\"suggestion-desc\">{{ sug.description }}</div>\n }\n </div>\n <div class=\"suggestion-actions\">\n <span class=\"suggestion-arrow\" aria-hidden=\"true\">\n <mat-icon>chevron_right</mat-icon>\n </span>\n <button\n mat-icon-button\n type=\"button\"\n class=\"suggestion-action-btn\"\n (click)=\"prepareSuggestionPrompt(sug, $event)\"\n matTooltip=\"Refinar pedido\"\n aria-label=\"Refinar pedido\"\n >\n <mat-icon>edit</mat-icon>\n </button>\n <button\n mat-icon-button\n type=\"button\"\n class=\"suggestion-action-btn suggestion-action-btn--danger\"\n (click)=\"dismissSuggestion(sug, $event)\"\n matTooltip=\"Ocultar sugest\u00E3o\"\n aria-label=\"Ocultar sugest\u00E3o\"\n >\n <mat-icon>visibility_off</mat-icon>\n </button>\n </div>\n </div>\n }\n </div>\n } @else {\n <div class=\"suggestions-empty suggestions-empty--inline\">\n Todas as sugest\u00F5es foram ocultadas.\n </div>\n }\n </div>\n }\n @if (!loadingSuggestions && !richSuggestions.length) {\n <div class=\"suggestions-empty\">\n Nenhuma sugest\u00E3o dispon\u00EDvel no momento.\n </div>\n }\n @if (!loadingSuggestions && !richSuggestions.length) {\n <div class=\"suggestions-helper\">\n Selecione uma sugest\u00E3o acima ou descreva uma altera\u00E7\u00E3o no campo inferior.\n </div>\n }\n </div>\n }\n\n <!-- STATE: CLARIFICATION (Two-Step Flow) -->\n @if (state === 'clarification' && isActiveTab('task')) {\n <div\n class=\"clarification-area assistant-card\"\n id=\"assistant-panel-task\"\n role=\"tabpanel\"\n aria-labelledby=\"assistant-tab-task\"\n >\n @if (!shouldShowThoughtCard()) {\n <div class=\"task-header\">\n <div class=\"task-title\">{{ getTaskTitle() }}</div>\n <div class=\"task-subtitle\">{{ getTaskSubtitle() }}</div>\n @if (clarificationOptions.length > 1 && getTaskSelectionSummary(); as selectionSummary) {\n <div class=\"task-meta\">\n <span class=\"task-meta-label\">Selecionado:</span>\n <span class=\"task-meta-value\">{{ selectionSummary }}</span>\n </div>\n }\n @if (shouldShowTaskSteps()) {\n <div class=\"task-steps\">\n <span class=\"task-step active\">1 Dados</span>\n <span class=\"task-step\">2 Layout</span>\n <span class=\"task-step\">3 Revis\u00E3o</span>\n </div>\n }\n </div>\n }\n @if (clarificationResponseType === 'context') {\n <div class=\"context-only\">\n <mat-spinner diameter=\"24\"></mat-spinner>\n <div class=\"context-only-hint\">Buscando contexto adicional...</div>\n </div>\n }\n <ng-template #clarificationOptionContent let-opt let-index=\"index\" let-compact=\"compact\">\n @if (!compact) {\n <div class=\"clarification-decision-head\">\n <span class=\"clarification-decision-index\">{{ index + 1 }}</span>\n <span class=\"clarification-decision-type\">{{ getClarificationOptionKindLabel(opt) }}</span>\n <span class=\"spacer\"></span>\n @if (isClarificationSelected(opt)) {\n <span class=\"clarification-decision-state\">Selecionado</span>\n }\n </div>\n }\n @switch (getClarificationOptionLayout(opt)) {\n @case ('endpoint') {\n <div class=\"clarification-card\">\n <div class=\"clarification-card-header\">\n <mat-icon class=\"endpoint-icon\">{{ getEndpointIcon(opt) }}</mat-icon>\n @if (getEndpointMethod(opt); as method) {\n <span class=\"endpoint-method\" [attr.data-method]=\"method\">{{ method }}</span>\n }\n <span class=\"endpoint-label\">{{ opt.label }}</span>\n <span class=\"spacer\"></span>\n <mat-icon class=\"select-indicator\">\n {{ isClarificationSelected(opt) ? 'check_circle' : 'radio_button_unchecked' }}\n </mat-icon>\n </div>\n <div class=\"clarification-card-body\">\n @if (getEndpointPath(opt); as path) {\n <div class=\"endpoint-path\">{{ path }}</div>\n }\n @if (opt.contextHints?.description) {\n <div\n class=\"endpoint-description\"\n [matTooltip]=\"getDescriptionTooltip(opt)\"\n [matTooltipDisabled]=\"!shouldShowDescriptionTooltip(opt)\"\n >\n {{ opt.contextHints?.description }}\n </div>\n }\n </div>\n </div>\n }\n @case ('color') {\n <div class=\"clarification-color\">\n <span\n class=\"color-swatch\"\n [style.background]=\"getSafeHexColor(opt) || 'var(--md-sys-color-surface-container-highest)'\"\n ></span>\n <div class=\"color-meta\">\n <span class=\"color-label\">{{ opt.label }}</span>\n @if (opt.contextHints?.hexColor) {\n <span class=\"color-value\">{{ opt.contextHints?.hexColor }}</span>\n }\n </div>\n </div>\n }\n @case ('description') {\n <div class=\"clarification-description\">\n <span class=\"clarification-label\">{{ opt.label }}</span>\n @if (opt.contextHints?.description) {\n <span\n class=\"clarification-subtitle\"\n [matTooltip]=\"getDescriptionTooltip(opt)\"\n [matTooltipDisabled]=\"!shouldShowDescriptionTooltip(opt)\"\n >\n {{ opt.contextHints?.description }}\n </span>\n }\n </div>\n }\n @default {\n <span class=\"clarification-plain-label\">{{ opt.label }}</span>\n }\n }\n </ng-template>\n @if (warnings.length) {\n <div class=\"warnings-area\">\n <mat-icon class=\"warnings-icon\">warning_amber</mat-icon>\n <div class=\"warnings-content\">\n <div class=\"warnings-title\">Avisos</div>\n <div class=\"warnings-list\">\n @for (warning of warnings; track warning) {\n <div>{{ warning }}</div>\n }\n </div>\n </div>\n </div>\n }\n @if (clarificationQuestions.length) {\n <div\n class=\"clarification-questions\"\n [class.attention-highlight]=\"highlightClarificationDetails && !clarificationOptions.length\"\n >\n @for (question of clarificationQuestions; track question; let i = $index) {\n <div class=\"clarification-question\">\n <div class=\"clarification-question-label\">{{ question }}</div>\n <input\n type=\"text\"\n [(ngModel)]=\"clarificationAnswers[i]\"\n [placeholder]=\"'Resposta ' + (i + 1)\"\n autocomplete=\"off\">\n </div>\n }\n </div>\n }\n @if (clarificationOptions.length) {\n <div\n class=\"clarification-options-block\"\n [class.attention-highlight]=\"highlightClarificationDetails\"\n >\n <div class=\"clarification-options-title\">\n {{ clarificationOptions.length === 1 ? 'Decis\u00E3o sugerida' : 'Decis\u00F5es sugeridas' }}\n </div>\n @if (clarificationOptions.length === 1) {\n <div class=\"clarification-options-hint\">\n Etapa 2 de 4: confirme a melhor op\u00E7\u00E3o para continuar.\n </div>\n }\n @if (clarificationOptions.length > 1) {\n <div class=\"clarification-options-hint\">\n Etapa 2 de 4: selecione a alternativa mais aderente para gerar a proposta.\n </div>\n }\n @if (clarificationResponseType === 'confirm') {\n <div\n class=\"clarification-buttons\"\n [class.list]=\"clarificationPresentation === 'list'\"\n >\n @for (opt of clarificationOptions; track opt.value; let i = $index) {\n <button\n mat-button\n type=\"button\"\n (click)=\"onClarificationOptionClick(opt)\"\n class=\"clarification-option\"\n [class.selected]=\"isClarificationSelected(opt)\"\n [matTooltip]=\"getClarificationTooltip(opt)\"\n [matTooltipDisabled]=\"!shouldShowClarificationTooltip(opt) || isEndpointOption(opt)\"\n >\n <ng-container *ngTemplateOutlet=\"clarificationOptionContent; context: { $implicit: opt, index: i, compact: false }\"></ng-container>\n </button>\n }\n </div>\n }\n @if (clarificationSelectionMode === 'multiple') {\n <div\n class=\"clarification-buttons\"\n [class.list]=\"clarificationPresentation === 'list'\"\n >\n @for (opt of clarificationOptions; track opt.value; let i = $index) {\n <button\n mat-button\n type=\"button\"\n (click)=\"onClarificationOptionClick(opt)\"\n [class.selected]=\"isClarificationSelected(opt)\"\n class=\"clarification-option\"\n [matTooltip]=\"getClarificationTooltip(opt)\"\n [matTooltipDisabled]=\"!shouldShowClarificationTooltip(opt) || isEndpointOption(opt)\"\n >\n <ng-container *ngTemplateOutlet=\"clarificationOptionContent; context: { $implicit: opt, index: i, compact: false }\"></ng-container>\n </button>\n }\n </div>\n }\n @if (clarificationResponseType !== 'confirm' && clarificationSelectionMode === 'single' && clarificationPresentation !== 'chips') {\n <div\n class=\"clarification-buttons\"\n [class.list]=\"clarificationPresentation === 'list'\"\n >\n @for (opt of clarificationOptions; track opt.value; let i = $index) {\n <button\n mat-button\n type=\"button\"\n (click)=\"onClarificationOptionClick(opt)\"\n class=\"clarification-option\"\n [class.selected]=\"isClarificationSelected(opt)\"\n [matTooltip]=\"getClarificationTooltip(opt)\"\n [matTooltipDisabled]=\"!shouldShowClarificationTooltip(opt) || isEndpointOption(opt)\"\n >\n <ng-container *ngTemplateOutlet=\"clarificationOptionContent; context: { $implicit: opt, index: i, compact: false }\"></ng-container>\n </button>\n }\n </div>\n }\n @if (clarificationResponseType !== 'confirm' && clarificationSelectionMode === 'single' && clarificationPresentation === 'chips') {\n <div\n class=\"clarification-chips\"\n >\n @for (opt of clarificationOptions; track opt.value; let i = $index) {\n @if (isEndpointOption(opt)) {\n <button\n mat-button\n type=\"button\"\n class=\"clarification-option clarification-card-button\"\n (click)=\"onClarificationOptionClick(opt)\"\n [class.selected]=\"isClarificationSelected(opt)\"\n [matTooltip]=\"getClarificationTooltip(opt)\"\n [matTooltipDisabled]=\"!shouldShowClarificationTooltip(opt) || isEndpointOption(opt)\"\n >\n <ng-container *ngTemplateOutlet=\"clarificationOptionContent; context: { $implicit: opt, index: i, compact: false }\"></ng-container>\n </button>\n } @else {\n <mat-chip\n (click)=\"onClarificationOptionClick(opt)\"\n [matTooltip]=\"getClarificationTooltip(opt)\"\n [matTooltipDisabled]=\"!shouldShowClarificationTooltip(opt)\"\n class=\"clarification-chip\"\n >\n <ng-container *ngTemplateOutlet=\"clarificationOptionContent; context: { $implicit: opt, index: i, compact: true }\"></ng-container>\n </mat-chip>\n }\n }\n </div>\n }\n </div>\n }\n @if (clarificationAllowCustom && clarificationResponseType !== 'context') {\n <div\n class=\"clarification-manual-toggle\"\n >\n <span class=\"clarification-manual-label\">N\u00E3o encontrou o recurso?</span>\n <button mat-button type=\"button\" (click)=\"toggleManualInput()\">\n {{ showManualInput ? 'Ocultar resposta manual' : 'Responder manualmente' }}\n </button>\n </div>\n }\n @if (clarificationAllowCustom && showManualInput && clarificationResponseType !== 'context') {\n <div\n class=\"clarification-free\"\n >\n <input\n type=\"text\"\n [(ngModel)]=\"clarificationFreeText\"\n placeholder=\"Digite sua resposta\u2026\"\n autocomplete=\"off\"\n (keydown.enter)=\"confirmTaskAction()\"\n />\n </div>\n }\n @if (clarificationAllowCustom && showManualInput && clarificationResponseType !== 'context') {\n <div\n class=\"clarification-free-hint\"\n >\n Pressione Enter para enviar.\n </div>\n }\n </div>\n }\n\n <!-- STATE: REVIEW (Diff/Explanation) -->\n @if (state === 'review' && isActiveTab('task')) {\n <div\n class=\"review-area assistant-card\"\n id=\"assistant-panel-task\"\n role=\"tabpanel\"\n aria-labelledby=\"assistant-tab-task\"\n >\n @if (!shouldShowThoughtCard()) {\n <div class=\"task-header\">\n <div class=\"task-title\">{{ getTaskTitle() }}</div>\n <div class=\"task-subtitle\">{{ getTaskSubtitle() }}</div>\n @if (clarificationOptions.length > 1 && getTaskSelectionSummary(); as selectionSummary) {\n <div class=\"task-meta\">\n <span class=\"task-meta-label\">Selecionado:</span>\n <span class=\"task-meta-value\">{{ selectionSummary }}</span>\n </div>\n }\n @if (shouldShowTaskSteps()) {\n <div class=\"task-steps\">\n <span class=\"task-step\">1 Dados</span>\n <span class=\"task-step\">2 Layout</span>\n <span class=\"task-step active\">3 Revis\u00E3o</span>\n </div>\n }\n </div>\n }\n @if (warnings.length) {\n <div class=\"warnings-area\">\n <mat-icon class=\"warnings-icon\">warning_amber</mat-icon>\n <div class=\"warnings-content\">\n <div class=\"warnings-title\">Avisos</div>\n <div class=\"warnings-list\">\n @for (warning of warnings; track warning) {\n <div>{{ warning }}</div>\n }\n </div>\n </div>\n </div>\n }\n <div class=\"review-trust\">\n <span class=\"trust-chip\" [matTooltip]=\"getScopeTooltip()\">{{ getScopeLabel() }}</span>\n <span class=\"trust-chip\" [matTooltip]=\"getConfidenceTooltip()\">{{ getConfidenceLabel() }}</span>\n <span class=\"trust-chip risk-chip\" [class.medium]=\"getReviewRiskLevel() === 'm\u00E9dio'\" [class.high]=\"getReviewRiskLevel() === 'alto'\">\n Risco {{ getReviewRiskLevel() }}\n </span>\n </div>\n <div class=\"review-summary\" [class.attention-highlight]=\"highlightReviewDetails\">\n <div class=\"review-summary-title\">Resumo da proposta</div>\n <div class=\"review-summary-line\">{{ getReviewSummary() }}</div>\n </div>\n <div class=\"review-diff\">\n <div class=\"review-diff-title\">Pr\u00E9via de mudan\u00E7as</div>\n @if (pendingDiff.length) {\n <div class=\"review-diff-summary\">\n @for (line of getDiffSummaryLines(); track line) {\n <div class=\"review-diff-line\">{{ line }}</div>\n }\n @if (pendingDiff.length > 3) {\n <div class=\"review-diff-more\">\u2026 +{{ pendingDiff.length - 3 }} mudan\u00E7as</div>\n }\n </div>\n <button mat-stroked-button type=\"button\" class=\"review-diff-toggle\" (click)=\"toggleFullDiff()\">\n {{ getDiffToggleLabel() }}\n </button>\n } @else {\n <div class=\"review-diff-empty\">\n N\u00E3o foi poss\u00EDvel gerar um diff estruturado. Revise o resumo e aplique com cautela.\n </div>\n }\n @if (showFullDiff && pendingDiff.length) {\n <div class=\"review-diff-full\">\n @for (diff of pendingDiff; track diff.path) {\n <div class=\"review-diff-block\">\n <div class=\"review-diff-path\">{{ diff.path }}</div>\n <div class=\"review-diff-label\">Antes:</div>\n <pre>{{ diff.before | json }}</pre>\n <div class=\"review-diff-label\">Depois:</div>\n <pre>{{ diff.after | json }}</pre>\n </div>\n }\n </div>\n }\n </div>\n @if (aiExplanation.trim()) {\n <div class=\"ai-explanation\">\n {{ aiExplanation }}\n </div>\n }\n </div>\n }\n\n <!-- STATE: ERROR -->\n @if (state === 'error' && (isActiveTab('task') || (!isTaskMode() && isActiveTab('suggestions')))) {\n <div\n class=\"error-area assistant-card\"\n [attr.id]=\"isTaskMode() ? 'assistant-panel-task' : 'assistant-panel-suggestions'\"\n role=\"tabpanel\"\n [attr.aria-labelledby]=\"isTaskMode() ? 'assistant-tab-task' : 'assistant-tab-suggestions'\"\n >\n <div class=\"error-msg\">\n <mat-icon color=\"warn\">error_outline</mat-icon>\n <span>{{ errorMsg }}</span>\n </div>\n @if (warnings.length) {\n <div class=\"warnings-area\">\n <mat-icon class=\"warnings-icon\">warning_amber</mat-icon>\n <div class=\"warnings-content\">\n <div class=\"warnings-title\">Avisos</div>\n <div class=\"warnings-list\">\n @for (warning of warnings; track warning) {\n <div>{{ warning }}</div>\n }\n </div>\n </div>\n </div>\n }\n @if (shouldShowApplyDetails()) {\n <div class=\"apply-details\">\n <div class=\"apply-details-header\">\n <div class=\"apply-details-title\">Detalhes da aplica\u00E7\u00E3o</div>\n @if (allowManualPatchEdit) {\n <div class=\"apply-details-actions\">\n <button mat-button type=\"button\" (click)=\"togglePatchPathEditor()\" [disabled]=\"!pendingPatch\">\n {{ patchPathEditorExpanded ? 'Ocultar paths' : 'Editar por path' }}\n </button>\n <button mat-button type=\"button\" (click)=\"togglePatchEditor()\" [disabled]=\"!pendingPatch\">\n {{ patchEditorExpanded ? 'Ocultar editor' : 'Editar patch' }}\n </button>\n </div>\n }\n </div>\n @if (lastApplyAt) {\n <div class=\"apply-details-meta\">\n \u00DAltima tentativa: {{ lastApplyAt | date:'short' }}\n </div>\n }\n @if (getApplyPaths().length) {\n <div class=\"apply-paths\">\n @for (path of getApplyPaths(); track path) {\n <span class=\"apply-path-chip\">{{ path }}</span>\n }\n </div>\n }\n @if (applyWarnings.length) {\n <div class=\"apply-warnings\">\n <div class=\"apply-warnings-title\">Avisos da aplica\u00E7\u00E3o</div>\n <div class=\"apply-warnings-list\">\n @for (warning of applyWarnings; track warning) {\n <div>{{ warning }}</div>\n }\n </div>\n </div>\n }\n @if (allowManualPatchEdit && patchPathEditorExpanded) {\n <div class=\"patch-path-editor\">\n <div class=\"patch-editor-label\">Editar por path</div>\n <div class=\"patch-editor-hint\">Texto simples vira string; para for\u00E7ar texto em true/false/n\u00FAmero, use aspas.</div>\n @if (!getEditablePatchPathEdits().length) {\n <div class=\"patch-path-editor-empty\">\n Nenhum path edit\u00E1vel dispon\u00EDvel para este patch.\n </div>\n }\n @if (getEditablePatchPathEdits().length) {\n <div class=\"patch-path-rows\">\n @for (edit of getEditablePatchPathEdits(); track edit.path; let i = $index) {\n <div class=\"patch-path-row\">\n <div class=\"patch-path-label\">{{ edit.path }}</div>\n <input\n type=\"text\"\n [(ngModel)]=\"patchPathEdits[i].valueText\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n />\n @if (patchPathEdits[i].error) {\n <div class=\"patch-editor-error\">{{ patchPathEdits[i].error }}</div>\n }\n </div>\n }\n </div>\n }\n @if (patchPathEditorError) {\n <div class=\"patch-editor-error\">{{ patchPathEditorError }}</div>\n }\n <div class=\"patch-editor-actions\">\n <button mat-button type=\"button\" (click)=\"resetPatchPathEdits()\">\n Restaurar valores\n </button>\n <button mat-button type=\"button\" (click)=\"applyPathEditsToPatch()\">\n Aplicar no patch\n </button>\n <button mat-flat-button color=\"primary\" type=\"button\" (click)=\"reapplyPathEdits()\">\n Reaplicar por path\n </button>\n </div>\n </div>\n }\n @if (allowManualPatchEdit && patchEditorExpanded) {\n <div class=\"patch-editor\">\n <label class=\"patch-editor-label\">Patch JSON</label>\n <textarea\n [(ngModel)]=\"patchEditorText\"\n spellcheck=\"false\"\n ></textarea>\n @if (patchEditorError) {\n <div class=\"patch-editor-error\">{{ patchEditorError }}</div>\n }\n <div class=\"patch-editor-actions\">\n <button mat-button type=\"button\" (click)=\"resetPatchEditor()\">\n Restaurar original\n </button>\n <button mat-flat-button color=\"primary\" type=\"button\" (click)=\"reapplyEditedPatch()\">\n Reaplicar patch\n </button>\n </div>\n </div>\n }\n </div>\n }\n <div class=\"review-actions\">\n <button mat-button (click)=\"close()\">Fechar</button>\n <button mat-stroked-button (click)=\"retry()\">Tentar Novamente</button>\n </div>\n </div>\n }\n\n <!-- STATE: SUCCESS -->\n @if (state === 'success' && (isActiveTab('task') || (!isTaskMode() && isActiveTab('suggestions')))) {\n <div\n class=\"success-area assistant-card\"\n [attr.id]=\"isTaskMode() ? 'assistant-panel-task' : 'assistant-panel-suggestions'\"\n role=\"tabpanel\"\n [attr.aria-labelledby]=\"isTaskMode() ? 'assistant-tab-task' : 'assistant-tab-suggestions'\"\n >\n <div class=\"success-msg\">\n <mat-icon class=\"success-icon\">check_circle</mat-icon>\n <span>{{ aiExplanation || 'Configura\u00E7\u00E3o atualizada.' }}</span>\n </div>\n @if (warnings.length) {\n <div class=\"warnings-area\">\n <mat-icon class=\"warnings-icon\">warning_amber</mat-icon>\n <div class=\"warnings-content\">\n <div class=\"warnings-title\">Avisos</div>\n <div class=\"warnings-list\">\n @for (warning of warnings; track warning) {\n <div>{{ warning }}</div>\n }\n </div>\n </div>\n </div>\n }\n @if (shouldShowApplyDetails()) {\n <div class=\"apply-details\">\n <div class=\"apply-details-header\">\n <div class=\"apply-details-title\">Detalhes da aplica\u00E7\u00E3o</div>\n @if (allowManualPatchEdit) {\n <div class=\"apply-details-actions\">\n <button mat-button type=\"button\" (click)=\"togglePatchPathEditor()\" [disabled]=\"!pendingPatch\">\n {{ patchPathEditorExpanded ? 'Ocultar paths' : 'Editar por path' }}\n </button>\n <button mat-button type=\"button\" (click)=\"togglePatchEditor()\" [disabled]=\"!pendingPatch\">\n {{ patchEditorExpanded ? 'Ocultar editor' : 'Editar e reaplicar' }}\n </button>\n </div>\n }\n </div>\n @if (lastApplyAt) {\n <div class=\"apply-details-meta\">\n Aplicado em {{ lastApplyAt | date:'short' }}\n </div>\n }\n @if (getApplyPaths().length) {\n <div class=\"apply-paths\">\n @for (path of getApplyPaths(); track path) {\n <span class=\"apply-path-chip\">{{ path }}</span>\n }\n </div>\n }\n @if (applyWarnings.length) {\n <div class=\"apply-warnings\">\n <div class=\"apply-warnings-title\">Avisos da aplica\u00E7\u00E3o</div>\n <div class=\"apply-warnings-list\">\n @for (warning of applyWarnings; track warning) {\n <div>{{ warning }}</div>\n }\n </div>\n </div>\n }\n @if (allowManualPatchEdit && patchPathEditorExpanded) {\n <div class=\"patch-path-editor\">\n <div class=\"patch-editor-label\">Editar por path</div>\n <div class=\"patch-editor-hint\">Texto simples vira string; para for\u00E7ar texto em true/false/n\u00FAmero, use aspas.</div>\n @if (!getEditablePatchPathEdits().length) {\n <div class=\"patch-path-editor-empty\">\n Nenhum path edit\u00E1vel dispon\u00EDvel para este patch.\n </div>\n }\n @if (getEditablePatchPathEdits().length) {\n <div class=\"patch-path-rows\">\n @for (edit of getEditablePatchPathEdits(); track edit.path; let i = $index) {\n <div class=\"patch-path-row\">\n <div class=\"patch-path-label\">{{ edit.path }}</div>\n <input\n type=\"text\"\n [(ngModel)]=\"patchPathEdits[i].valueText\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n />\n @if (patchPathEdits[i].error) {\n <div class=\"patch-editor-error\">{{ patchPathEdits[i].error }}</div>\n }\n </div>\n }\n </div>\n }\n @if (patchPathEditorError) {\n <div class=\"patch-editor-error\">{{ patchPathEditorError }}</div>\n }\n <div class=\"patch-editor-actions\">\n <button mat-button type=\"button\" (click)=\"resetPatchPathEdits()\">\n Restaurar valores\n </button>\n <button mat-button type=\"button\" (click)=\"applyPathEditsToPatch()\">\n Aplicar no patch\n </button>\n <button mat-flat-button color=\"primary\" type=\"button\" (click)=\"reapplyPathEdits()\">\n Reaplicar por path\n </button>\n </div>\n </div>\n }\n @if (allowManualPatchEdit && patchEditorExpanded) {\n <div class=\"patch-editor\">\n <label class=\"patch-editor-label\">Patch JSON</label>\n <textarea\n [(ngModel)]=\"patchEditorText\"\n spellcheck=\"false\"\n ></textarea>\n @if (patchEditorError) {\n <div class=\"patch-editor-error\">{{ patchEditorError }}</div>\n }\n <div class=\"patch-editor-actions\">\n <button mat-button type=\"button\" (click)=\"resetPatchEditor()\">\n Restaurar original\n </button>\n <button mat-flat-button color=\"primary\" type=\"button\" (click)=\"reapplyEditedPatch()\">\n Reaplicar patch\n </button>\n </div>\n </div>\n }\n </div>\n }\n <button mat-button color=\"warn\" (click)=\"undoLastChange()\">\n <mat-icon>undo</mat-icon> Desfazer\n </button>\n </div>\n }\n\n </div>\n\n <div class=\"assistant-footer\">\n @if (!isTaskMode()) {\n <button\n mat-icon-button\n type=\"button\"\n class=\"composer-leading composer-leading-btn\"\n [matMenuTriggerFor]=\"assistantQuickMenu\"\n aria-label=\"Abrir a\u00E7\u00F5es r\u00E1pidas\"\n matTooltip=\"A\u00E7\u00F5es r\u00E1pidas\"\n >\n <mat-icon>add</mat-icon>\n </button>\n <input\n #inputEl\n type=\"text\"\n [(ngModel)]=\"userPrompt\"\n [disabled]=\"state === 'processing' || state === 'applying'\"\n placeholder=\"Descreva a altera\u00E7\u00E3o que deseja aplicar\u2026\"\n autocomplete=\"off\"\n />\n <div class=\"send-actions\">\n @if (state === 'listening') {\n <button\n mat-icon-button\n class=\"send-btn\"\n (click)=\"submitPrompt()\"\n [disabled]=\"!userPrompt.trim()\"\n [class.ready]=\"!!userPrompt.trim()\"\n >\n <mat-icon>arrow_upward</mat-icon>\n </button>\n }\n @if (state === 'processing' || state === 'applying') {\n <mat-spinner diameter=\"20\"></mat-spinner>\n }\n </div>\n } @else {\n <div class=\"task-footer\">\n <div class=\"task-footer-left\">\n <button mat-button type=\"button\" (click)=\"handleTaskSecondary()\">{{ getTaskCancelLabel() }}</button>\n @if (state === 'review') {\n <button\n mat-stroked-button\n type=\"button\"\n (click)=\"retry()\"\n >\n {{ getTaskSecondaryLabel() }}\n </button>\n }\n </div>\n <div class=\"task-footer-right\">\n <button\n class=\"task-primary-btn\"\n mat-flat-button\n color=\"primary\"\n type=\"button\"\n (click)=\"confirmTaskAction()\"\n [disabled]=\"isTaskPrimaryDisabled()\"\n >\n {{ getTaskPrimaryLabel() }}\n </button>\n @if (state === 'processing' || state === 'applying') {\n <mat-spinner diameter=\"20\"></mat-spinner>\n }\n </div>\n </div>\n }\n </div>\n\n <mat-menu #assistantQuickMenu=\"matMenu\" panelClass=\"assistant-quick-menu-panel\">\n <button mat-menu-item type=\"button\" (click)=\"setActiveTab('chat')\">\n <mat-icon>history</mat-icon>\n <span>Hist\u00F3rico</span>\n </button>\n <button mat-menu-item type=\"button\" (click)=\"setActiveTab('suggestions')\">\n <mat-icon>lightbulb</mat-icon>\n <span>Sugest\u00F5es</span>\n </button>\n <button mat-menu-item type=\"button\" (click)=\"startNewSession()\">\n <mat-icon>add_comment</mat-icon>\n <span>Nova conversa</span>\n </button>\n <button mat-menu-item type=\"button\" (click)=\"refreshSuggestions()\" [disabled]=\"loadingSuggestions\">\n <mat-icon>refresh</mat-icon>\n <span>Atualizar sugest\u00F5es</span>\n </button>\n <button\n mat-menu-item\n type=\"button\"\n (click)=\"restoreDismissedSuggestions()\"\n [disabled]=\"!hasDismissedSuggestions()\"\n >\n <mat-icon>visibility</mat-icon>\n <span>Restaurar sugest\u00F5es ocultas</span>\n </button>\n <button\n mat-menu-item\n type=\"button\"\n class=\"assistant-quick-menu-danger\"\n (click)=\"clearHistory()\"\n [disabled]=\"!historySessions.length\"\n >\n <mat-icon>delete_outline</mat-icon>\n <span>Limpar hist\u00F3rico local</span>\n </button>\n </mat-menu>\n </div>\n\n</ng-template>\n", styles: ["@keyframes assistantPremiumEnter{0%{opacity:0;transform:translate(14px) scale(.99)}to{opacity:1;transform:translate(0) scale(1)}}:host ::ng-deep .ai-assistant-backdrop{background:color-mix(in srgb,var(--md-sys-color-scrim, var(--md-sys-color-shadow, var(--md-sys-color-on-surface))) 42%,transparent);-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}::ng-deep .ai-assistant-overlay-pane{max-width:calc(100vw - 24px);max-height:calc(100vh - 24px)}.ai-assistant-panel{box-sizing:border-box;width:min(604px,100vw - 18px);min-height:min(620px,100vh - 18px);max-height:min(820px,100vh - 18px);display:flex;flex-direction:column;overflow:hidden;color:var(--md-sys-color-on-surface);border-left:1px solid color-mix(in srgb,var(--md-sys-color-primary) 24%,var(--md-sys-color-outline-variant));border-top:1px solid color-mix(in srgb,var(--md-sys-color-primary) 18%,var(--md-sys-color-outline-variant));border-bottom:1px solid color-mix(in srgb,var(--md-sys-color-primary) 18%,var(--md-sys-color-outline-variant));box-shadow:0 18px 48px color-mix(in srgb,var(--md-sys-color-shadow, var(--md-sys-color-on-surface)) 42%,transparent),inset 0 1px color-mix(in srgb,var(--md-sys-color-on-surface) 10%,transparent);background:radial-gradient(circle at 14% 8%,color-mix(in srgb,var(--md-sys-color-primary-container) 38%,transparent) 0%,transparent 44%),linear-gradient(165deg,color-mix(in srgb,var(--md-sys-color-surface-container-highest) 88%,var(--md-sys-color-surface)),var(--md-sys-color-surface));animation:assistantPremiumEnter .24s cubic-bezier(.22,1,.36,1)}.assistant-header{position:relative;display:flex;align-items:flex-start;justify-content:space-between;gap:12px;padding:12px 16px 10px;border-bottom:1px solid color-mix(in srgb,var(--md-sys-color-primary) 18%,var(--md-sys-color-outline-variant));background:linear-gradient(130deg,color-mix(in srgb,var(--md-sys-color-primary-container) 28%,transparent) 0%,transparent 52%),var(--md-sys-color-surface-container-low)}.assistant-header:after{content:\"\";position:absolute;left:16px;right:16px;bottom:-1px;height:1px;background:linear-gradient(90deg,color-mix(in srgb,var(--md-sys-color-primary) 55%,transparent),transparent);pointer-events:none}.assistant-header .assistant-header__left{min-width:0;display:flex;align-items:flex-start;gap:12px}.assistant-header .magic-icon{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;width:30px;height:30px;font-size:18px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 30%,transparent);box-shadow:0 4px 12px color-mix(in srgb,var(--md-sys-color-primary) 26%,transparent)}.assistant-header .assistant-title-group{min-width:0;display:flex;flex-direction:column;gap:4px}.assistant-header .assistant-title{font-size:15px;font-weight:700;letter-spacing:.01em;overflow-wrap:anywhere}.assistant-header .assistant-subtitle{display:block;font-size:11px;line-height:1.25;color:color-mix(in srgb,var(--md-sys-color-on-surface) 70%,var(--md-sys-color-on-surface-variant));overflow-wrap:anywhere}.assistant-header-chips{display:inline-flex;align-items:center;flex-wrap:wrap;gap:6px}.assistant-header .mode-chip{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;border-radius:999px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 28%,var(--md-sys-color-outline-variant));background:color-mix(in srgb,var(--md-sys-color-primary-container) 64%,var(--md-sys-color-surface-container));color:color-mix(in srgb,var(--md-sys-color-on-primary-container) 85%,var(--md-sys-color-on-surface));font-size:10px;font-weight:700;letter-spacing:.04em;text-transform:uppercase}.assistant-header .mode-chip:before{content:\"\";width:6px;height:6px;border-radius:999px;background:currentColor;box-shadow:0 0 0 3px color-mix(in srgb,currentColor 16%,transparent)}.assistant-header .mode-chip.mock{border-color:color-mix(in srgb,var(--md-sys-color-error) 34%,var(--md-sys-color-outline-variant));background:color-mix(in srgb,var(--md-sys-color-error-container) 72%,var(--md-sys-color-surface-container));color:color-mix(in srgb,var(--md-sys-color-on-error-container) 85%,var(--md-sys-color-error))}.assistant-header .policy-chip{padding:2px 8px;border-radius:999px;border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant) 84%,transparent);background:var(--md-sys-color-surface-container-high);font-size:10px;letter-spacing:.02em;font-weight:600}.assistant-header .policy-chip.strict{border-color:color-mix(in srgb,var(--md-sys-color-primary) 42%,var(--md-sys-color-outline-variant));background:color-mix(in srgb,var(--md-sys-color-primary-container) 56%,var(--md-sys-color-surface-container-high))}.assistant-status{display:flex;align-items:flex-start;gap:10px;padding:10px 16px;border-bottom:1px solid color-mix(in srgb,var(--md-sys-color-primary) 18%,var(--md-sys-color-outline-variant));border-radius:0;background:linear-gradient(160deg,color-mix(in srgb,var(--md-sys-color-primary-container) 24%,transparent),transparent 48%),var(--md-sys-color-surface-container-low)}.assistant-status-dot{width:8px;height:8px;margin-top:6px;border-radius:999px;flex:0 0 auto;background:var(--md-sys-color-primary);box-shadow:0 0 0 4px color-mix(in srgb,var(--md-sys-color-primary) 16%,transparent)}.assistant-status.warning .assistant-status-dot{background:var(--md-sys-color-error);box-shadow:0 0 0 4px color-mix(in srgb,var(--md-sys-color-error) 16%,transparent)}.assistant-status.success .assistant-status-dot{background:color-mix(in srgb,var(--md-sys-color-primary) 74%,var(--md-sys-color-tertiary, var(--md-sys-color-primary)))}.assistant-status-content{min-width:0;display:flex;flex-direction:column;gap:2px}.assistant-status-label{display:flex;align-items:center;flex-wrap:wrap;gap:4px;font-size:12px;font-weight:700;line-height:1.35}.assistant-status-detail{font-size:11px;line-height:1.4;color:var(--md-sys-color-on-surface-variant);overflow-wrap:anywhere}.assistant-status-mode{padding:1px 6px;border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-primary-container) 72%,transparent);color:var(--md-sys-color-on-primary-container);font-size:10px;font-weight:700}.assistant-nav{padding:8px 16px 0}.assistant-nav .assistant-tabs{display:flex;align-items:center;gap:4px;border-radius:12px;padding:5px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 24%,var(--md-sys-color-outline-variant));border-color:color-mix(in srgb,var(--md-sys-color-primary) 24%,var(--md-sys-color-outline-variant));background:linear-gradient(155deg,color-mix(in srgb,var(--md-sys-color-primary-container) 14%,transparent),transparent 58%),var(--md-sys-color-surface-container-low)}.assistant-nav .assistant-tab{appearance:none;min-width:0;min-height:30px;border:0;border-radius:8px;padding:0 10px;background:transparent;color:var(--md-sys-color-on-surface-variant);cursor:pointer;display:inline-flex;align-items:center;justify-content:center;flex:1 1 0;font-size:11px;font-weight:700;letter-spacing:.01em}.assistant-nav .assistant-tab.active{background:var(--md-sys-color-surface-container-highest);color:var(--md-sys-color-on-surface);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--md-sys-color-primary) 34%,transparent),0 6px 12px color-mix(in srgb,var(--md-sys-color-primary) 18%,transparent)}.assistant-section,.assistant-card{border-radius:14px;border-color:color-mix(in srgb,var(--md-sys-color-primary) 20%,var(--md-sys-color-outline-variant));background:linear-gradient(160deg,color-mix(in srgb,var(--md-sys-color-primary-container) 16%,transparent),transparent 50%),var(--md-sys-color-surface-container-lowest);box-shadow:0 6px 18px color-mix(in srgb,var(--md-sys-color-shadow, var(--md-sys-color-on-surface)) 12%,transparent),inset 0 1px color-mix(in srgb,var(--md-sys-color-on-surface) 7%,transparent)}.suggestions-hero{margin:2px 0 4px;padding:10px 12px;border-radius:12px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 24%,var(--md-sys-color-outline-variant));background:linear-gradient(120deg,color-mix(in srgb,var(--md-sys-color-primary-container) 34%,transparent) 0%,transparent 52%),var(--md-sys-color-surface-container-low)}.suggestions-hero__label{font-size:10px;letter-spacing:.08em;text-transform:uppercase;font-weight:700;color:var(--md-sys-color-on-surface-variant);opacity:.88}.suggestions-hero__title{margin-top:2px;font-size:13px;font-weight:700;color:var(--md-sys-color-on-surface)}.suggestions-hero__detail{margin-top:4px;font-size:12px;line-height:1.4;color:color-mix(in srgb,var(--md-sys-color-on-surface) 78%,var(--md-sys-color-on-surface-variant))}.suggestions-content .suggestion-item{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:12px;padding:12px;border-radius:12px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 18%,var(--md-sys-color-outline-variant));border-color:color-mix(in srgb,var(--md-sys-color-primary) 18%,var(--md-sys-color-outline-variant));background:linear-gradient(140deg,color-mix(in srgb,var(--md-sys-color-primary-container) 16%,transparent),transparent 56%),var(--md-sys-color-surface-container-lowest);transition:transform .2s cubic-bezier(.25,.8,.25,1),border-color .2s ease,box-shadow .2s ease}.suggestions-list{display:flex;flex-direction:column;gap:10px}.suggestion-copy{min-width:0;display:grid;gap:4px}.suggestion-main{min-width:0;display:flex;align-items:center;flex-wrap:wrap;gap:8px}.suggestion-icon{width:18px;height:18px;font-size:18px;flex:0 0 auto;color:var(--md-sys-color-primary)}.suggestion-label{min-width:0;font-size:13px;font-weight:700;line-height:1.35;overflow-wrap:anywhere}.suggestion-group{padding:2px 6px;border-radius:999px;background:var(--md-sys-color-surface-container-high);color:var(--md-sys-color-on-surface-variant);font-size:10px;font-weight:700;line-height:1.2}.suggestion-desc{font-size:12px;line-height:1.35;color:var(--md-sys-color-on-surface-variant);overflow-wrap:anywhere}.suggestion-actions{display:inline-flex;align-items:center;justify-content:flex-end;gap:4px}.suggestion-action-btn,.suggestion-arrow{width:32px;height:32px;display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;color:var(--md-sys-color-on-surface-variant)}.suggestions-content .suggestion-item:hover,.suggestions-content .suggestion-item:focus-visible{border-color:color-mix(in srgb,var(--md-sys-color-primary) 58%,var(--md-sys-color-outline-variant));box-shadow:0 8px 18px color-mix(in srgb,var(--md-sys-color-primary) 18%,transparent),inset 0 0 0 1px color-mix(in srgb,var(--md-sys-color-primary) 28%,transparent);transform:translateY(-2px) scale(1.01)}.assistant-footer{display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:8px;padding:10px 16px;border-top-color:color-mix(in srgb,var(--md-sys-color-primary) 20%,var(--md-sys-color-outline-variant));background:linear-gradient(180deg,color-mix(in srgb,var(--md-sys-color-primary-container) 16%,transparent),transparent 56%),var(--md-sys-color-surface-container-low)}.assistant-footer .task-footer{grid-column:1/-1}.composer-leading{width:30px;height:30px;display:inline-flex;align-items:center;justify-content:center;border-radius:999px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 30%,var(--md-sys-color-outline-variant));background:color-mix(in srgb,var(--md-sys-color-primary-container) 70%,var(--md-sys-color-surface-container-low));color:var(--md-sys-color-primary);box-shadow:0 4px 10px color-mix(in srgb,var(--md-sys-color-primary) 16%,transparent)}.composer-leading mat-icon{width:16px;height:16px;font-size:16px}.assistant-footer input{box-sizing:border-box;width:100%;min-width:0;height:34px;border:1px solid;border-radius:8px;padding:0 12px;color:var(--md-sys-color-on-surface);border-color:color-mix(in srgb,var(--md-sys-color-primary) 24%,var(--md-sys-color-outline-variant));background:var(--md-sys-color-surface);box-shadow:inset 0 1px 2px color-mix(in srgb,var(--md-sys-color-shadow, var(--md-sys-color-on-surface)) 12%,transparent)}.send-actions{min-width:36px;display:inline-flex;align-items:center;justify-content:center}.assistant-footer .send-btn{--mdc-icon-button-icon-size: 20px;--mdc-icon-button-state-layer-size: 36px;--mat-icon-button-state-layer-size: 36px;width:36px;height:36px;padding:8px;line-height:1;display:inline-flex;align-items:center;justify-content:center;border-color:color-mix(in srgb,var(--md-sys-color-primary) 24%,var(--md-sys-color-outline-variant));background:var(--md-sys-color-surface)}.assistant-footer .send-btn mat-icon{width:20px;height:20px;margin:0;font-size:20px;line-height:20px;display:inline-flex;align-items:center;justify-content:center}.assistant-footer .send-btn.ready{background:linear-gradient(135deg,color-mix(in srgb,var(--md-sys-color-primary-container) 84%,var(--md-sys-color-primary)),var(--md-sys-color-primary));color:var(--md-sys-color-on-primary);box-shadow:0 8px 18px color-mix(in srgb,var(--md-sys-color-primary) 30%,transparent)}.task-primary-btn{border-radius:12px;box-shadow:0 8px 18px color-mix(in srgb,var(--md-sys-color-primary) 24%,transparent)}@media(max-width:959px){.assistant-header{padding:12px 12px 10px}.assistant-section,.assistant-card{margin:4px 12px 10px}.assistant-header:after{left:12px;right:12px}.assistant-header .assistant-title{font-size:14px}.assistant-header .assistant-subtitle{font-size:10px}.assistant-footer{grid-template-columns:minmax(0,1fr) auto}.composer-leading{display:none}}.assistant-thought{margin-top:0;gap:10px;border-color:color-mix(in srgb,var(--md-sys-color-primary) 26%,var(--md-sys-color-outline-variant));background:linear-gradient(145deg,color-mix(in srgb,var(--md-sys-color-primary-container) 28%,transparent),transparent 58%),var(--md-sys-color-surface-container-low)}.assistant-thought-meta{display:inline-flex;align-items:center;gap:6px;font-size:11px;color:var(--md-sys-color-on-surface-variant)}.assistant-thought-meta mat-icon{width:15px;height:15px;font-size:15px;color:var(--md-sys-color-primary)}.assistant-thought-summary{font-size:13px;line-height:1.45;color:var(--md-sys-color-on-surface)}.assistant-thought-plan{border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 32%,var(--md-sys-color-outline-variant));border-radius:12px;padding:10px;background:var(--md-sys-color-surface-container-lowest);display:flex;flex-direction:column;gap:8px}.assistant-thought-plan-title{font-size:13px;font-weight:700;color:var(--md-sys-color-on-surface)}.assistant-thought-plan-actions{display:grid;grid-template-columns:repeat(auto-fit,minmax(0,1fr));gap:8px}.assistant-thought-plan-actions .mdc-button{min-width:0}.assistant-thought-plan-hint{font-size:11px;color:var(--md-sys-color-on-surface-variant);line-height:1.35}.assistant-thought-checklist{display:flex;flex-direction:column;gap:5px}.assistant-thought-checklist-item{display:inline-flex;align-items:center;gap:6px;font-size:12px;color:var(--md-sys-color-on-surface-variant)}.assistant-thought-checklist-item mat-icon{width:14px;height:14px;font-size:14px}.assistant-thought-shimmer{display:flex;flex-direction:column;gap:8px;margin-top:4px}.assistant-thought-shimmer .shimmer-line{height:12px;border-radius:4px;position:relative;overflow:hidden;background:var(--md-sys-color-surface-container-highest)}.assistant-thought-shimmer .shimmer-line:after{content:\"\";position:absolute;inset:0;transform:translate(-100%);background:linear-gradient(90deg,transparent,color-mix(in srgb,var(--md-sys-color-primary) 8%,transparent),transparent);animation:assistantShimmerEffect 1.5s infinite}.assistant-thought-shimmer .shimmer-line-1{width:85%}.assistant-thought-shimmer .shimmer-line-2{width:92%}.assistant-thought-shimmer .shimmer-line-3{width:64%}@keyframes assistantShimmerEffect{to{transform:translate(100%)}}.assistant-flow{grid-template-columns:1fr;gap:6px}.flow-step{display:flex;align-items:flex-start;gap:8px;text-align:left;padding:7px 8px;border-radius:10px}.flow-step-index{width:18px;height:18px;border-radius:999px;display:inline-flex;align-items:center;justify-content:center;font-size:10px;font-weight:700;border:1px solid var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface-container-highest);color:var(--md-sys-color-on-surface);flex:0 0 auto}.flow-step-content{min-width:0;display:flex;flex-direction:column;gap:1px}.flow-step-label{font-size:11px;font-weight:700;color:var(--md-sys-color-on-surface)}.flow-step-detail{font-size:11px;color:var(--md-sys-color-on-surface-variant);line-height:1.3}.flow-step.active .flow-step-index{border-color:color-mix(in srgb,var(--md-sys-color-primary) 60%,var(--md-sys-color-outline-variant));background:color-mix(in srgb,var(--md-sys-color-primary-container) 85%,var(--md-sys-color-surface-container-highest));color:var(--md-sys-color-on-primary-container)}.flow-step.done .flow-step-index{border-color:transparent;background:color-mix(in srgb,var(--md-sys-color-primary) 18%,var(--md-sys-color-surface-container-highest))}.task-timeline{margin-top:4px;display:grid;gap:6px}.task-timeline-item{display:flex;align-items:flex-start;gap:8px;border:1px solid var(--md-sys-color-outline-variant);border-radius:10px;padding:6px 8px;background:var(--md-sys-color-surface-container-low);opacity:.76}.task-timeline-item.active{opacity:1;border-color:color-mix(in srgb,var(--md-sys-color-primary) 40%,var(--md-sys-color-outline-variant));background:color-mix(in srgb,var(--md-sys-color-primary-container) 34%,var(--md-sys-color-surface-container-low))}.task-timeline-item.done{opacity:.9;border-color:color-mix(in srgb,var(--md-sys-color-primary) 24%,var(--md-sys-color-outline-variant))}.task-timeline-dot{width:18px;height:18px;border-radius:999px;display:inline-flex;align-items:center;justify-content:center;font-size:10px;font-weight:700;border:1px solid var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface-container-highest);color:var(--md-sys-color-on-surface);flex:0 0 auto}.task-timeline-copy{min-width:0;display:flex;flex-direction:column;gap:1px}.task-timeline-title{font-size:11px;font-weight:700;color:var(--md-sys-color-on-surface)}.task-timeline-detail{font-size:11px;line-height:1.3;color:var(--md-sys-color-on-surface-variant)}.clarification-decision-head{display:inline-flex;align-items:center;width:100%;gap:6px;padding:8px 12px 0;box-sizing:border-box}.clarification-decision-index{width:18px;height:18px;border-radius:999px;display:inline-flex;align-items:center;justify-content:center;font-size:10px;font-weight:700;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 35%,var(--md-sys-color-outline-variant));color:var(--md-sys-color-primary);background:color-mix(in srgb,var(--md-sys-color-primary-container) 68%,transparent)}.clarification-decision-type{font-size:10px;letter-spacing:.08em;text-transform:uppercase;color:var(--md-sys-color-on-surface-variant);opacity:.92}.clarification-decision-state{font-size:10px;font-weight:700;color:var(--md-sys-color-primary)}.clarification-option{border-color:color-mix(in srgb,var(--md-sys-color-primary) 20%,var(--md-sys-color-outline-variant));background:linear-gradient(145deg,color-mix(in srgb,var(--md-sys-color-primary-container) 16%,transparent),transparent 55%),var(--md-sys-color-surface-container-low)}.clarification-option.selected{border-color:color-mix(in srgb,var(--md-sys-color-primary) 56%,var(--md-sys-color-outline-variant));background:linear-gradient(145deg,color-mix(in srgb,var(--md-sys-color-primary-container) 44%,transparent),transparent 62%),var(--md-sys-color-surface-container);box-shadow:0 8px 16px color-mix(in srgb,var(--md-sys-color-primary) 18%,transparent)}.clarification-options-block{overflow:visible;padding-right:4px}@media(max-width:959px){.assistant-thought-plan-actions{grid-template-columns:1fr}}.ai-assistant-panel{width:min(604px,100vw - 18px)}.assistant-section,.assistant-card{margin:0;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 20%,var(--md-sys-color-outline-variant))}.assistant-section{min-height:0;padding:14px 16px;overflow:visible}.assistant-card{min-height:0;padding:14px 16px 16px;overflow:visible}.suggestions-area,.assistant-history,.loading-suggestions{overflow-y:auto;overflow-x:hidden}.section-header{min-width:0;display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:10px}.section-title{min-width:0;font-size:14px;font-weight:700;line-height:1.35;overflow-wrap:anywhere}.suggestions-actions{flex:0 0 auto;display:inline-flex;align-items:center}.review-area,.error-area,.success-area,.clarification-area{padding:0;overflow-y:auto;overflow-x:hidden;scrollbar-gutter:auto}.review-trust{margin:2px 0 4px}.trust-chip{max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.warnings-area,.review-summary,.review-diff,.apply-details,.clarification-options-block,.clarification-manual-toggle{width:100%;max-width:100%;min-width:0}.review-diff{padding:12px 14px}.review-diff-full{padding:10px;overflow-x:auto}.review-diff-block{min-width:0}.review-diff-block pre{overflow-wrap:anywhere;word-break:break-word}.clarification-options-block{padding:4px 2px 10px}.clarification-option{line-height:normal}:host ::ng-deep .clarification-option .mdc-button__label{line-height:1.35!important}.clarification-plain-label{padding:6px 12px 12px;font-size:14px;line-height:1.35}.clarification-manual-toggle{margin-top:10px;padding:10px 2px 0;flex-wrap:wrap;row-gap:6px}.suggestions-content .suggestion-actions{gap:6px}.suggestions-content .suggestion-arrow,.suggestions-content .suggestion-action-btn mat-icon,.suggestions-content .suggestion-arrow mat-icon{display:inline-flex;align-items:center;justify-content:center}:host ::ng-deep .assistant-quick-menu-panel{min-width:244px;max-width:min(90vw,320px);border-radius:14px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 26%,var(--md-sys-color-outline-variant));background:var(--md-sys-color-surface-container-high);box-shadow:0 12px 28px color-mix(in srgb,var(--md-sys-color-shadow, var(--md-sys-color-on-surface)) 32%,transparent),inset 0 1px color-mix(in srgb,var(--md-sys-color-on-surface) 6%,transparent);overflow:hidden;padding:6px}:host ::ng-deep .assistant-quick-menu-panel .mat-mdc-menu-item{min-height:36px;border-radius:10px;color:var(--md-sys-color-on-surface);font-size:12px;font-weight:500;margin:1px 0}:host ::ng-deep .assistant-quick-menu-panel .mat-mdc-menu-item .mat-icon{color:color-mix(in srgb,var(--md-sys-color-on-surface) 82%,var(--md-sys-color-on-surface-variant))}:host ::ng-deep .assistant-quick-menu-panel .mat-mdc-menu-item:hover:not([disabled]){background:color-mix(in srgb,var(--md-sys-color-primary-container) 45%,transparent)}:host ::ng-deep .assistant-quick-menu-panel .mat-mdc-menu-item:focus-visible{outline:2px solid var(--md-sys-color-primary);outline-offset:-2px}:host ::ng-deep .assistant-quick-menu-panel .assistant-quick-menu-danger{color:var(--md-sys-color-error)}:host ::ng-deep .assistant-quick-menu-panel .assistant-quick-menu-danger .mat-icon{color:var(--md-sys-color-error)}@media(max-width:959px){::ng-deep .ai-assistant-overlay-pane{top:12px!important;left:12px!important;width:calc(100vw - 24px)!important;height:calc(100vh - 24px)!important;max-width:calc(100vw - 24px);max-height:calc(100vh - 24px);transform:none!important}.ai-assistant-panel{width:calc(100vw - 48px);min-height:min(620px,100vh - 48px);max-height:calc(100vh - 48px)}.assistant-section,.assistant-card{margin:0}.assistant-card,.assistant-section{padding:12px}}.ai-trigger-btn{--mdc-icon-button-state-layer-size: 36px;width:36px;height:36px;border-radius:8px;background:color-mix(in srgb,var(--md-sys-color-primary) 9%,transparent);border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 22%,transparent);color:var(--md-sys-color-primary);opacity:1}.ai-trigger-btn:hover:not(:disabled){background:color-mix(in srgb,var(--md-sys-color-primary) 16%,transparent);border-color:color-mix(in srgb,var(--md-sys-color-primary) 36%,transparent);color:var(--md-sys-color-on-primary-container)}.ai-trigger-btn:focus-visible,.assistant-close-btn:focus-visible,.assistant-tab:focus-visible{outline:2px solid var(--md-sys-color-primary);outline-offset:2px}.assistant-close-btn{width:28px;height:28px;color:var(--md-sys-color-on-surface-variant)}.assistant-close-btn:hover:not(:disabled){background:var(--md-sys-color-surface-container-high);color:var(--md-sys-color-on-surface)}.assistant-body{padding:12px 16px;overflow:hidden;min-height:0;flex:1;display:flex;flex-direction:column;gap:12px}.assistant-body>*{min-height:0}@media(max-width:959px){.assistant-nav{padding:8px 12px 0}.assistant-body,.assistant-footer{padding:10px 12px}.suggestions-content .suggestion-item{grid-template-columns:1fr;align-items:start}.suggestion-actions{justify-content:flex-start}}\n"] }]
6840
6840
  }], propDecorators: { adapter: [{
6841
6841
  type: Input,
6842
6842
  args: [{ required: true }]
@@ -6857,6 +6857,138 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
6857
6857
  args: ['inputEl']
6858
6858
  }] } });
6859
6859
 
6860
+ class PraxisBrowserSpeechTranscriptionError extends Error {
6861
+ code;
6862
+ constructor(code, message) {
6863
+ super(message);
6864
+ this.code = code;
6865
+ this.name = 'PraxisBrowserSpeechTranscriptionError';
6866
+ }
6867
+ }
6868
+ class PraxisBrowserSpeechTranscriptionService {
6869
+ activeRecognition = null;
6870
+ isSupported() {
6871
+ return this.resolveCtor() !== null;
6872
+ }
6873
+ transcribe(options = {}) {
6874
+ const RecognitionCtor = this.resolveCtor();
6875
+ if (!RecognitionCtor) {
6876
+ return Promise.reject(new PraxisBrowserSpeechTranscriptionError('unsupported', 'Browser speech recognition is not supported.'));
6877
+ }
6878
+ this.cancel();
6879
+ const recognition = new RecognitionCtor();
6880
+ recognition.lang = options.lang?.trim() || this.resolveNavigatorLanguage();
6881
+ recognition.continuous = false;
6882
+ recognition.interimResults = false;
6883
+ recognition.maxAlternatives = 1;
6884
+ this.activeRecognition = recognition;
6885
+ return new Promise((resolve, reject) => {
6886
+ let transcript = '';
6887
+ let failed = false;
6888
+ const cleanup = () => {
6889
+ if (this.activeRecognition === recognition) {
6890
+ this.activeRecognition = null;
6891
+ }
6892
+ recognition.onresult = null;
6893
+ recognition.onerror = null;
6894
+ recognition.onend = null;
6895
+ };
6896
+ recognition.onresult = (event) => {
6897
+ transcript = this.extractTranscript(event).trim();
6898
+ };
6899
+ recognition.onerror = (event) => {
6900
+ failed = true;
6901
+ cleanup();
6902
+ reject(this.toTranscriptionError(event));
6903
+ };
6904
+ recognition.onend = () => {
6905
+ cleanup();
6906
+ if (failed) {
6907
+ return;
6908
+ }
6909
+ if (!transcript) {
6910
+ reject(new PraxisBrowserSpeechTranscriptionError('no-speech', 'No speech was recognized.'));
6911
+ return;
6912
+ }
6913
+ resolve({
6914
+ text: transcript,
6915
+ language: recognition.lang,
6916
+ });
6917
+ };
6918
+ try {
6919
+ recognition.start();
6920
+ }
6921
+ catch (error) {
6922
+ cleanup();
6923
+ reject(new PraxisBrowserSpeechTranscriptionError('error', error instanceof Error ? error.message : 'Failed to start browser speech recognition.'));
6924
+ }
6925
+ });
6926
+ }
6927
+ stop() {
6928
+ this.activeRecognition?.stop();
6929
+ }
6930
+ cancel() {
6931
+ this.activeRecognition?.abort();
6932
+ this.activeRecognition = null;
6933
+ }
6934
+ extractTranscript(event) {
6935
+ const segments = [];
6936
+ for (let resultIndex = 0; resultIndex < event.results.length; resultIndex++) {
6937
+ const result = event.results[resultIndex] ?? event.results.item(resultIndex);
6938
+ if (!result?.length) {
6939
+ continue;
6940
+ }
6941
+ const alternative = result[0] ?? result.item(0);
6942
+ const text = alternative?.transcript?.trim();
6943
+ if (text) {
6944
+ segments.push(text);
6945
+ }
6946
+ }
6947
+ return segments.join(' ');
6948
+ }
6949
+ toTranscriptionError(event) {
6950
+ const error = (event.error || '').toLowerCase();
6951
+ if (error === 'not-allowed' || error === 'service-not-allowed') {
6952
+ return new PraxisBrowserSpeechTranscriptionError('permission-denied', event.message || 'Browser microphone permission was denied.');
6953
+ }
6954
+ if (error === 'no-speech') {
6955
+ return new PraxisBrowserSpeechTranscriptionError('no-speech', event.message || 'No speech was recognized.');
6956
+ }
6957
+ if (error === 'aborted') {
6958
+ return new PraxisBrowserSpeechTranscriptionError('aborted', event.message || 'Browser speech recognition was aborted.');
6959
+ }
6960
+ return new PraxisBrowserSpeechTranscriptionError('error', event.message || 'Browser speech recognition failed.');
6961
+ }
6962
+ resolveCtor() {
6963
+ if (typeof window === 'undefined') {
6964
+ return null;
6965
+ }
6966
+ const speechWindow = window;
6967
+ return speechWindow.SpeechRecognition ?? speechWindow.webkitSpeechRecognition ?? null;
6968
+ }
6969
+ resolveNavigatorLanguage() {
6970
+ if (typeof navigator !== 'undefined' && navigator.language?.trim()) {
6971
+ return navigator.language.trim();
6972
+ }
6973
+ return 'pt-BR';
6974
+ }
6975
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisBrowserSpeechTranscriptionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
6976
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisBrowserSpeechTranscriptionService, providedIn: 'root' });
6977
+ }
6978
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisBrowserSpeechTranscriptionService, decorators: [{
6979
+ type: Injectable,
6980
+ args: [{ providedIn: 'root' }]
6981
+ }] });
6982
+
6983
+ const PRAXIS_ASSISTANT_VOICE_INPUT_MODE = new InjectionToken('PRAXIS_ASSISTANT_VOICE_INPUT_MODE', {
6984
+ providedIn: 'root',
6985
+ factory: () => 'disabled',
6986
+ });
6987
+ const PRAXIS_ASSISTANT_VOICE_LANGUAGE = new InjectionToken('PRAXIS_ASSISTANT_VOICE_LANGUAGE', {
6988
+ providedIn: 'root',
6989
+ factory: () => 'pt-BR',
6990
+ });
6991
+
6860
6992
  const DEFAULT_LAYOUT = {
6861
6993
  left: 24,
6862
6994
  top: 24,
@@ -6875,6 +7007,11 @@ const DEFAULT_LABELS = {
6875
7007
  conversationAria: 'Conversa com IA',
6876
7008
  quickRepliesAria: 'Respostas rápidas',
6877
7009
  quickReplyDetails: 'Detalhes técnicos',
7010
+ recommendedIntentsAria: 'Sugestões iniciais do assistente',
7011
+ recommendedIntentsTitle: 'Você pode começar por aqui',
7012
+ recommendedIntentCta: 'Usar sugestão',
7013
+ recommendedIntentGuidanceCta: 'Entender recurso',
7014
+ recommendedIntentRequiresConfirmation: 'Requer revisão',
6878
7015
  dragHandleAria: 'Mover assistente de IA',
6879
7016
  resizeHandleAria: 'Redimensionar assistente de IA',
6880
7017
  contextAria: 'Contexto ativo',
@@ -6886,6 +7023,12 @@ const DEFAULT_LABELS = {
6886
7023
  feedbackPositive: 'Resposta útil',
6887
7024
  feedbackNegative: 'Resposta com problema',
6888
7025
  feedbackSubmitted: 'Feedback registrado',
7026
+ voiceStart: 'Ditar pedido',
7027
+ voiceStop: 'Parar ditado',
7028
+ voiceListening: 'Ouvindo...',
7029
+ voiceUnsupported: 'Ditado pelo navegador indisponível',
7030
+ voicePermissionDenied: 'Permissão do microfone negada pelo navegador.',
7031
+ voiceNoSpeech: 'Nenhuma fala reconhecida.',
6889
7032
  modeConfig: 'Configuração',
6890
7033
  modeAgenticAuthoring: 'Autoria',
6891
7034
  modeChat: 'Chat',
@@ -6909,6 +7052,7 @@ class PraxisAiAssistantShellComponent {
6909
7052
  attachments = [];
6910
7053
  messages = [];
6911
7054
  quickReplies = [];
7055
+ recommendedIntents = [];
6912
7056
  prompt = '';
6913
7057
  statusText = '';
6914
7058
  errorText = '';
@@ -6928,6 +7072,8 @@ class PraxisAiAssistantShellComponent {
6928
7072
  enableFileAttachments = false;
6929
7073
  attachmentAccept = '';
6930
7074
  attachmentMultiple = true;
7075
+ voiceInputMode = inject(PRAXIS_ASSISTANT_VOICE_INPUT_MODE);
7076
+ voiceLanguage = inject(PRAXIS_ASSISTANT_VOICE_LANGUAGE);
6931
7077
  draggable = true;
6932
7078
  resizable = true;
6933
7079
  minWidth = 360;
@@ -6949,18 +7095,24 @@ class PraxisAiAssistantShellComponent {
6949
7095
  editMessage = new EventEmitter();
6950
7096
  resendMessage = new EventEmitter();
6951
7097
  quickReply = new EventEmitter();
7098
+ recommendedIntent = new EventEmitter();
6952
7099
  layoutChange = new EventEmitter();
6953
7100
  panel;
6954
7101
  conversation;
6955
7102
  cdr = inject(ChangeDetectorRef);
6956
7103
  injector = inject(Injector);
7104
+ browserSpeech = inject(PraxisBrowserSpeechTranscriptionService);
6957
7105
  currentPrompt = '';
6958
7106
  resolvedLabels = DEFAULT_LABELS;
7107
+ voiceCaptureState = 'idle';
7108
+ voiceFeedbackText = '';
6959
7109
  currentLayout = { ...DEFAULT_LAYOUT };
6960
7110
  resizeHandles = ['n', 's', 'e', 'w', 'ne', 'nw', 'se', 'sw'];
6961
7111
  pointerSession = null;
6962
7112
  ownedPreviewUrls = new Set();
6963
7113
  submittedFeedbackObservationIds = new Set();
7114
+ voiceCaptureSequence = 0;
7115
+ destroyed = false;
6964
7116
  onWindowPointerMove = (event) => this.handlePointerMove(event);
6965
7117
  onWindowPointerUp = (event) => this.finishPointerSession(event);
6966
7118
  ngOnChanges(changes) {
@@ -6982,9 +7134,15 @@ class PraxisAiAssistantShellComponent {
6982
7134
  if (changes['attachments']) {
6983
7135
  this.revokeDetachedPastedPreviewUrls();
6984
7136
  }
7137
+ if (changes['voiceInputMode'] && this.voiceInputMode !== 'browser-speech') {
7138
+ this.cancelVoiceCapture();
7139
+ }
6985
7140
  }
6986
7141
  ngOnDestroy() {
7142
+ this.destroyed = true;
7143
+ this.voiceCaptureSequence++;
6987
7144
  this.detachPointerListeners();
7145
+ this.browserSpeech.cancel();
6988
7146
  this.revokeAllOwnedPreviewUrls();
6989
7147
  }
6990
7148
  onPromptInput(value) {
@@ -7017,6 +7175,110 @@ class PraxisAiAssistantShellComponent {
7017
7175
  event.preventDefault();
7018
7176
  this.attachmentsPasted.emit(attachments);
7019
7177
  }
7178
+ onVoiceInputClick() {
7179
+ if (this.isVoiceInputBusy()) {
7180
+ this.voiceCaptureState = 'stopping';
7181
+ this.voiceFeedbackText = this.getVoiceLabel('voiceListening');
7182
+ this.browserSpeech.stop();
7183
+ return;
7184
+ }
7185
+ if (!this.canUseBrowserSpeech()) {
7186
+ this.voiceCaptureState = 'unsupported';
7187
+ this.voiceFeedbackText = this.getVoiceLabel('voiceUnsupported');
7188
+ return;
7189
+ }
7190
+ this.voiceCaptureState = 'listening';
7191
+ this.voiceFeedbackText = this.getVoiceLabel('voiceListening');
7192
+ this.cdr.markForCheck();
7193
+ const captureSequence = ++this.voiceCaptureSequence;
7194
+ void this.browserSpeech.transcribe({ lang: this.voiceLanguage }).then((result) => {
7195
+ if (!this.isCurrentVoiceCapture(captureSequence)) {
7196
+ return;
7197
+ }
7198
+ this.voiceCaptureState = 'idle';
7199
+ this.voiceFeedbackText = '';
7200
+ this.applyVoiceTranscript(result.text);
7201
+ this.cdr.markForCheck();
7202
+ }).catch((error) => {
7203
+ if (!this.isCurrentVoiceCapture(captureSequence)) {
7204
+ return;
7205
+ }
7206
+ if (error instanceof PraxisBrowserSpeechTranscriptionError && error.code === 'aborted') {
7207
+ this.voiceCaptureState = 'idle';
7208
+ this.voiceFeedbackText = '';
7209
+ this.cdr.markForCheck();
7210
+ return;
7211
+ }
7212
+ this.voiceCaptureState = 'error';
7213
+ this.voiceFeedbackText = this.resolveVoiceErrorText(error);
7214
+ this.cdr.markForCheck();
7215
+ });
7216
+ }
7217
+ shouldShowVoiceInput() {
7218
+ return this.voiceInputMode === 'browser-speech';
7219
+ }
7220
+ isVoiceInputDisabled() {
7221
+ return (this.busy && !this.isVoiceInputBusy()) || (!this.isVoiceInputBusy() && !this.canUseBrowserSpeech());
7222
+ }
7223
+ isVoiceInputBusy() {
7224
+ return this.voiceCaptureState === 'listening' || this.voiceCaptureState === 'stopping';
7225
+ }
7226
+ getVoiceActionLabel() {
7227
+ if (!this.canUseBrowserSpeech()) {
7228
+ return this.getVoiceLabel('voiceUnsupported');
7229
+ }
7230
+ return this.isVoiceInputBusy()
7231
+ ? this.getVoiceLabel('voiceStop')
7232
+ : this.getVoiceLabel('voiceStart');
7233
+ }
7234
+ shouldShowVoiceFeedback() {
7235
+ return !!this.voiceFeedbackText.trim();
7236
+ }
7237
+ canUseBrowserSpeech() {
7238
+ return this.voiceInputMode === 'browser-speech' && this.browserSpeech.isSupported();
7239
+ }
7240
+ cancelVoiceCapture() {
7241
+ this.voiceCaptureSequence++;
7242
+ this.browserSpeech.cancel();
7243
+ this.voiceCaptureState = 'idle';
7244
+ this.voiceFeedbackText = '';
7245
+ }
7246
+ isCurrentVoiceCapture(captureSequence) {
7247
+ return !this.destroyed
7248
+ && this.voiceInputMode === 'browser-speech'
7249
+ && captureSequence === this.voiceCaptureSequence;
7250
+ }
7251
+ applyVoiceTranscript(text) {
7252
+ const transcript = text.trim();
7253
+ if (!transcript) {
7254
+ return;
7255
+ }
7256
+ const current = this.currentPrompt.trim();
7257
+ const next = current ? `${current}\n${transcript}` : transcript;
7258
+ this.currentPrompt = next;
7259
+ this.promptChange.emit(next);
7260
+ }
7261
+ resolveVoiceErrorText(error) {
7262
+ if (error instanceof PraxisBrowserSpeechTranscriptionError) {
7263
+ switch (error.code) {
7264
+ case 'permission-denied':
7265
+ return this.getVoiceLabel('voicePermissionDenied');
7266
+ case 'no-speech':
7267
+ return this.getVoiceLabel('voiceNoSpeech');
7268
+ case 'unsupported':
7269
+ return this.getVoiceLabel('voiceUnsupported');
7270
+ case 'aborted':
7271
+ return '';
7272
+ case 'error':
7273
+ default:
7274
+ return this.getVoiceLabel('voiceUnsupported');
7275
+ }
7276
+ }
7277
+ return this.getVoiceLabel('voiceUnsupported');
7278
+ }
7279
+ getVoiceLabel(key) {
7280
+ return this.resolvedLabels[key] ?? DEFAULT_LABELS[key] ?? '';
7281
+ }
7020
7282
  onAttachClick(fileInput) {
7021
7283
  if (this.busy)
7022
7284
  return;
@@ -7280,6 +7542,79 @@ class PraxisAiAssistantShellComponent {
7280
7542
  return;
7281
7543
  this.quickReply.emit(reply);
7282
7544
  }
7545
+ shouldShowRecommendedIntents() {
7546
+ return !this.messages.length && this.recommendedIntents.length > 0;
7547
+ }
7548
+ onRecommendedIntent(intent) {
7549
+ if (this.isRecommendedIntentDisabled(intent))
7550
+ return;
7551
+ this.recommendedIntent.emit(intent);
7552
+ }
7553
+ isRecommendedIntentDisabled(intent) {
7554
+ return this.busy || Boolean(intent.disabledReason?.trim());
7555
+ }
7556
+ getRecommendedIntentAriaLabel(intent) {
7557
+ const description = this.getRecommendedIntentDescription(intent);
7558
+ const group = intent.group?.label?.trim();
7559
+ const state = intent.disabledReason?.trim()
7560
+ || (intent.requiresConfirmation ? this.resolvedLabels.recommendedIntentRequiresConfirmation : '');
7561
+ return [intent.label, description, group, state]
7562
+ .filter((segment) => typeof segment === 'string' && segment.length > 0)
7563
+ .map((segment) => this.trimSentencePunctuation(segment))
7564
+ .join('. ');
7565
+ }
7566
+ getRecommendedIntentDescription(intent) {
7567
+ return intent.presentation?.description?.trim()
7568
+ || intent.description?.trim()
7569
+ || '';
7570
+ }
7571
+ getRecommendedIntentCtaLabel(intent) {
7572
+ if (intent.disabledReason?.trim())
7573
+ return intent.disabledReason.trim();
7574
+ const ctaLabel = intent.presentation?.ctaLabel?.trim();
7575
+ if (ctaLabel)
7576
+ return ctaLabel;
7577
+ if (intent.action.kind === 'open-guidance')
7578
+ return this.resolvedLabels.recommendedIntentGuidanceCta;
7579
+ return this.resolvedLabels.recommendedIntentCta;
7580
+ }
7581
+ getRecommendedIntentIcon(intent) {
7582
+ const presentationIcon = intent.presentation?.icon?.trim();
7583
+ if (presentationIcon)
7584
+ return presentationIcon;
7585
+ const explicitIcon = intent.icon?.trim();
7586
+ if (explicitIcon)
7587
+ return explicitIcon;
7588
+ switch (intent.action.kind) {
7589
+ case 'start-review':
7590
+ return 'rule';
7591
+ case 'open-guidance':
7592
+ return 'help';
7593
+ case 'submit-prompt':
7594
+ return 'chat_bubble';
7595
+ default:
7596
+ return 'auto_awesome';
7597
+ }
7598
+ }
7599
+ getRecommendedIntentTone(intent) {
7600
+ const tone = (intent.presentation?.tone || intent.tone || 'neutral').trim().toLowerCase();
7601
+ switch (tone) {
7602
+ case 'analytics':
7603
+ case 'resource':
7604
+ case 'success':
7605
+ case 'warning':
7606
+ case 'danger':
7607
+ case 'neutral':
7608
+ return tone;
7609
+ case 'primary':
7610
+ return 'analytics';
7611
+ default:
7612
+ return 'neutral';
7613
+ }
7614
+ }
7615
+ getRecommendedIntentGroupLabel(intent) {
7616
+ return intent.group?.label?.trim() || '';
7617
+ }
7283
7618
  getQuickReplyAriaLabel(reply) {
7284
7619
  const label = reply.label?.trim() ?? '';
7285
7620
  const description = this.getQuickReplyDescription(reply);
@@ -7907,6 +8242,9 @@ class PraxisAiAssistantShellComponent {
7907
8242
  trackQuickReply(_index, reply) {
7908
8243
  return reply.id;
7909
8244
  }
8245
+ trackRecommendedIntent(_index, intent) {
8246
+ return intent.id;
8247
+ }
7910
8248
  trackContextItem(_index, item) {
7911
8249
  return item.id;
7912
8250
  }
@@ -8098,7 +8436,7 @@ class PraxisAiAssistantShellComponent {
8098
8436
  this.ownedPreviewUrls.delete(previewUrl);
8099
8437
  }
8100
8438
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisAiAssistantShellComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
8101
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: PraxisAiAssistantShellComponent, isStandalone: true, selector: "praxis-ai-assistant-shell", inputs: { labels: "labels", mode: "mode", state: "state", contextItems: "contextItems", attachments: "attachments", messages: "messages", quickReplies: "quickReplies", prompt: "prompt", statusText: "statusText", errorText: "errorText", testIdPrefix: "testIdPrefix", panelTestId: "panelTestId", submitTestId: "submitTestId", applyTestId: "applyTestId", primaryAction: "primaryAction", secondaryActions: "secondaryActions", governanceActions: "governanceActions", busy: "busy", canSubmit: "canSubmit", canApply: "canApply", submitOnEnter: "submitOnEnter", showAttachAction: "showAttachAction", enablePastedAttachments: "enablePastedAttachments", enableFileAttachments: "enableFileAttachments", attachmentAccept: "attachmentAccept", attachmentMultiple: "attachmentMultiple", draggable: "draggable", resizable: "resizable", minWidth: "minWidth", minHeight: "minHeight", margin: "margin", layout: "layout" }, outputs: { promptChange: "promptChange", submitPrompt: "submitPrompt", apply: "apply", retryTurn: "retryTurn", cancelTurn: "cancelTurn", shellAction: "shellAction", close: "close", attach: "attach", attachmentsPasted: "attachmentsPasted", attachmentsSelected: "attachmentsSelected", removeAttachment: "removeAttachment", messageAction: "messageAction", editMessage: "editMessage", resendMessage: "resendMessage", quickReply: "quickReply", layoutChange: "layoutChange" }, viewQueries: [{ propertyName: "panel", first: true, predicate: ["panel"], descendants: true, static: true }, { propertyName: "conversation", first: true, predicate: ["conversation"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<section\n #panel\n class=\"praxis-ai-assistant-shell\"\n role=\"dialog\"\n [attr.aria-label]=\"resolvedLabels.title\"\n [attr.aria-busy]=\"busy ? 'true' : null\"\n [style.left.px]=\"currentLayout.left\"\n [style.top.px]=\"currentLayout.top\"\n [style.width.px]=\"currentLayout.width\"\n [style.height.px]=\"currentLayout.height\"\n [attr.data-testid]=\"panelTestId || testIdPrefix\"\n >\n <header\n class=\"praxis-ai-assistant-shell__header\"\n [attr.data-testid]=\"testIdPrefix + '-drag-handle'\"\n [attr.aria-label]=\"resolvedLabels.dragHandleAria\"\n (pointerdown)=\"startDrag($event)\"\n >\n <div class=\"praxis-ai-assistant-shell__identity\" aria-hidden=\"true\">\n <mat-icon>auto_awesome</mat-icon>\n </div>\n <div class=\"praxis-ai-assistant-shell__title-group\">\n <div class=\"praxis-ai-assistant-shell__title-row\">\n <strong>{{ resolvedLabels.title }}</strong>\n <div class=\"praxis-ai-assistant-shell__badges\" aria-hidden=\"true\">\n <span class=\"praxis-ai-assistant-shell__badge praxis-ai-assistant-shell__badge--context\">\n {{ getModeLabel() }}\n </span>\n <span\n class=\"praxis-ai-assistant-shell__badge praxis-ai-assistant-shell__badge--state\"\n [class.praxis-ai-assistant-shell__badge--error]=\"state === 'error'\"\n >\n <span class=\"praxis-ai-assistant-shell__state-dot\" aria-hidden=\"true\"></span>\n {{ getStateLabel() }}\n </span>\n </div>\n </div>\n @if (resolvedLabels.subtitle) {\n <p>{{ resolvedLabels.subtitle }}</p>\n }\n </div>\n <div class=\"praxis-ai-assistant-shell__header-actions\">\n <button\n mat-icon-button\n type=\"button\"\n [matTooltip]=\"resolvedLabels.close\"\n [attr.aria-label]=\"resolvedLabels.close\"\n (pointerdown)=\"$event.stopPropagation()\"\n (click)=\"close.emit()\"\n [attr.data-testid]=\"testIdPrefix + '-close'\"\n >\n <mat-icon>{{ getCloseIcon() }}</mat-icon>\n </button>\n </div>\n </header>\n\n <div class=\"praxis-ai-assistant-shell__body\">\n @if (contextItems.length) {\n <div\n class=\"praxis-ai-assistant-shell__context\"\n [attr.aria-label]=\"resolvedLabels.contextAria\"\n [attr.data-testid]=\"testIdPrefix + '-context'\"\n >\n @for (item of contextItems; track trackContextItem($index, item)) {\n <span\n class=\"praxis-ai-assistant-shell__context-item\"\n [attr.data-testid]=\"testIdPrefix + '-context-' + item.id\"\n >\n @if (item.icon) {\n <mat-icon aria-hidden=\"true\">{{ item.icon }}</mat-icon>\n }\n <span class=\"praxis-ai-assistant-shell__context-label\">{{ item.label }}</span>\n @if (item.value) {\n <span class=\"praxis-ai-assistant-shell__context-value\">{{ item.value }}</span>\n }\n </span>\n }\n </div>\n }\n\n <div\n #conversation\n class=\"praxis-ai-assistant-shell__conversation\"\n [attr.data-testid]=\"testIdPrefix + '-conversation'\"\n [attr.aria-label]=\"resolvedLabels.conversationAria\"\n >\n @if (!messages.length) {\n <article\n class=\"praxis-ai-assistant-shell__message praxis-ai-assistant-shell__message--assistant\"\n [attr.data-testid]=\"testIdPrefix + '-message-assistant-empty'\"\n >\n {{ resolvedLabels.emptyConversation }}\n </article>\n }\n @for (message of messages; track trackMessage($index, message)) {\n <article\n class=\"praxis-ai-assistant-shell__message\"\n [class.praxis-ai-assistant-shell__message--user]=\"message.role === 'user'\"\n [class.praxis-ai-assistant-shell__message--assistant]=\"message.role === 'assistant'\"\n [class.praxis-ai-assistant-shell__message--status]=\"message.role === 'status'\"\n [class.praxis-ai-assistant-shell__message--error]=\"message.role === 'error'\"\n [attr.data-testid]=\"testIdPrefix + '-message-' + message.role\"\n >\n <div\n class=\"praxis-ai-assistant-shell__message-content\"\n [innerHTML]=\"renderMessageText(message.text)\"\n ></div>\n @if (message.actions?.length || message.editable || message.resendable) {\n <div\n class=\"praxis-ai-assistant-shell__message-actions\"\n >\n @if (message.editable) {\n <button\n mat-icon-button\n type=\"button\"\n class=\"praxis-ai-assistant-shell__message-action praxis-ai-assistant-shell__message-action--icon\"\n [disabled]=\"busy\"\n [matTooltip]=\"resolvedLabels.editMessage\"\n [attr.aria-label]=\"resolvedLabels.editMessage\"\n [attr.data-testid]=\"testIdPrefix + '-message-edit-' + message.id\"\n (click)=\"onMessageAction(message, { id: 'edit', label: resolvedLabels.editMessage, kind: 'edit' })\"\n >\n <mat-icon aria-hidden=\"true\">edit</mat-icon>\n </button>\n }\n @if (message.resendable) {\n <button\n mat-icon-button\n type=\"button\"\n class=\"praxis-ai-assistant-shell__message-action praxis-ai-assistant-shell__message-action--icon\"\n [disabled]=\"busy\"\n [matTooltip]=\"resolvedLabels.resendMessage\"\n [attr.aria-label]=\"resolvedLabels.resendMessage\"\n [attr.data-testid]=\"testIdPrefix + '-message-resend-' + message.id\"\n (click)=\"onMessageAction(message, { id: 'resend', label: resolvedLabels.resendMessage, kind: 'resend' })\"\n >\n <mat-icon aria-hidden=\"true\">replay</mat-icon>\n </button>\n }\n @for (action of message.actions || []; track trackMessageAction($index, action)) {\n @if (isMessageActionIconOnly(action)) {\n <button\n mat-icon-button\n type=\"button\"\n class=\"praxis-ai-assistant-shell__message-action praxis-ai-assistant-shell__message-action--icon\"\n [disabled]=\"busy || action.disabled\"\n [matTooltip]=\"getMessageActionLabel(action)\"\n [attr.aria-label]=\"getMessageActionLabel(action)\"\n [attr.data-testid]=\"testIdPrefix + '-message-action-' + message.id + '-' + action.id\"\n (click)=\"onMessageAction(message, action)\"\n >\n <mat-icon aria-hidden=\"true\">{{ getMessageActionIcon(action) }}</mat-icon>\n </button>\n } @else {\n <button\n mat-button\n type=\"button\"\n class=\"praxis-ai-assistant-shell__message-action\"\n [disabled]=\"busy || action.disabled\"\n [attr.aria-label]=\"getMessageActionLabel(action)\"\n [attr.data-testid]=\"testIdPrefix + '-message-action-' + message.id + '-' + action.id\"\n (click)=\"onMessageAction(message, action)\"\n >\n {{ action.label }}\n </button>\n }\n }\n </div>\n }\n @if (canSendMessageFeedback(message)) {\n <div class=\"praxis-ai-assistant-shell__message-feedback\">\n <button\n mat-icon-button\n type=\"button\"\n class=\"praxis-ai-assistant-shell__message-feedback-action\"\n [disabled]=\"busy\"\n [matTooltip]=\"resolvedLabels.feedbackPositive\"\n [attr.aria-label]=\"resolvedLabels.feedbackPositive\"\n [attr.data-testid]=\"testIdPrefix + '-message-feedback-positive-' + message.id\"\n (click)=\"sendMessageFeedback(message, 'positive')\"\n >\n <mat-icon aria-hidden=\"true\">thumb_up</mat-icon>\n </button>\n <button\n mat-icon-button\n type=\"button\"\n class=\"praxis-ai-assistant-shell__message-feedback-action\"\n [disabled]=\"busy\"\n [matTooltip]=\"resolvedLabels.feedbackNegative\"\n [attr.aria-label]=\"resolvedLabels.feedbackNegative\"\n [attr.data-testid]=\"testIdPrefix + '-message-feedback-negative-' + message.id\"\n (click)=\"sendMessageFeedback(message, 'negative')\"\n >\n <mat-icon aria-hidden=\"true\">thumb_down</mat-icon>\n </button>\n </div>\n } @else if (isMessageFeedbackSubmitted(message)) {\n <div\n class=\"praxis-ai-assistant-shell__message-feedback-submitted\"\n [attr.data-testid]=\"testIdPrefix + '-message-feedback-submitted-' + message.id\"\n >\n <mat-icon aria-hidden=\"true\">check</mat-icon>\n <span>{{ resolvedLabels.feedbackSubmitted }}</span>\n </div>\n }\n </article>\n }\n </div>\n\n @if (attachments.length) {\n <div\n class=\"praxis-ai-assistant-shell__attachments\"\n [attr.aria-label]=\"resolvedLabels.attachmentsAria\"\n [attr.data-testid]=\"testIdPrefix + '-attachments'\"\n >\n @for (attachment of attachments; track trackAttachment($index, attachment)) {\n <div\n class=\"praxis-ai-assistant-shell__attachment\"\n [class.praxis-ai-assistant-shell__attachment--error]=\"attachment.status === 'error'\"\n [attr.data-testid]=\"testIdPrefix + '-attachment-' + attachment.id\"\n >\n @if (attachment.previewUrl && attachment.kind === 'image') {\n <img\n class=\"praxis-ai-assistant-shell__attachment-preview\"\n [src]=\"attachment.previewUrl\"\n [alt]=\"attachment.name\"\n >\n }\n <span class=\"praxis-ai-assistant-shell__attachment-name\">{{ attachment.name }}</span>\n <span class=\"praxis-ai-assistant-shell__attachment-kind\">{{ attachment.kind }}</span>\n <button\n mat-icon-button\n type=\"button\"\n [disabled]=\"busy\"\n [matTooltip]=\"resolvedLabels.removeAttachment\"\n [attr.aria-label]=\"resolvedLabels.removeAttachment + ': ' + attachment.name\"\n [attr.data-testid]=\"testIdPrefix + '-attachment-remove-' + attachment.id\"\n (click)=\"onRemoveAttachment(attachment)\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </div>\n }\n </div>\n }\n\n @if (quickReplies.length) {\n <div\n class=\"praxis-ai-assistant-shell__quick-replies\"\n [class.praxis-ai-assistant-shell__quick-replies--inline]=\"shouldUseInlineQuickReplies()\"\n [attr.data-testid]=\"testIdPrefix + '-quick-replies'\"\n [attr.aria-label]=\"resolvedLabels.quickRepliesAria\"\n >\n @for (reply of quickReplies; track trackQuickReply($index, reply)) {\n <button\n mat-stroked-button\n type=\"button\"\n class=\"praxis-ai-assistant-shell__quick-reply\"\n [class.praxis-ai-assistant-shell__quick-reply--compact]=\"!isRichQuickReply(reply)\"\n [class.praxis-ai-assistant-shell__quick-reply--guided-action]=\"isGuidedActionQuickReply(reply)\"\n [class.praxis-ai-assistant-shell__quick-reply--contextual-action]=\"isContextualPreviewActionQuickReply(reply)\"\n [ngClass]=\"'praxis-ai-assistant-shell__quick-reply--tone-' + getQuickReplyTone(reply)\"\n [attr.data-testid]=\"testIdPrefix + '-quick-reply-' + (reply.id || reply.kind)\"\n [attr.aria-label]=\"getQuickReplyAriaLabel(reply)\"\n [disabled]=\"busy\"\n (click)=\"onQuickReply(reply)\"\n >\n <span class=\"praxis-ai-assistant-shell__quick-reply-ambient\" aria-hidden=\"true\"></span>\n <span class=\"praxis-ai-assistant-shell__quick-reply-icon-frame\" aria-hidden=\"true\">\n <mat-icon\n class=\"praxis-ai-assistant-shell__quick-reply-icon\"\n >\n {{ getQuickReplyIcon(reply) }}\n </mat-icon>\n </span>\n <span class=\"praxis-ai-assistant-shell__quick-reply-copy\">\n <span class=\"praxis-ai-assistant-shell__quick-reply-header\">\n <span class=\"praxis-ai-assistant-shell__quick-reply-heading\">\n <span class=\"praxis-ai-assistant-shell__quick-reply-label\">{{ reply.label }}</span>\n @if (getQuickReplyDescription(reply)) {\n <span\n class=\"praxis-ai-assistant-shell__quick-reply-description\"\n >\n {{ getQuickReplyDescription(reply) }}\n </span>\n }\n </span>\n <span class=\"praxis-ai-assistant-shell__quick-reply-actions\">\n <span class=\"praxis-ai-assistant-shell__quick-reply-badge\">\n {{ getQuickReplyCategoryLabel(reply) }}\n </span>\n @if (getQuickReplyTechnicalDetails(reply)) {\n <mat-icon\n class=\"praxis-ai-assistant-shell__quick-reply-details\"\n [matTooltip]=\"getQuickReplyTechnicalDetails(reply)\"\n [attr.aria-label]=\"resolvedLabels.quickReplyDetails\"\n >\n info\n </mat-icon>\n }\n </span>\n </span>\n @if (getQuickReplyContextChips(reply).length) {\n <span\n class=\"praxis-ai-assistant-shell__quick-reply-context\"\n >\n @for (chip of getQuickReplyContextChips(reply); track chip) {\n <span\n class=\"praxis-ai-assistant-shell__quick-reply-context-chip\"\n [attr.aria-label]=\"chip.ariaLabel\"\n >\n <mat-icon aria-hidden=\"true\">{{ chip.icon }}</mat-icon>\n <span>{{ chip.value }}</span>\n </span>\n }\n </span>\n }\n @if (getQuickReplyPresentationItems(reply).length) {\n <span\n class=\"praxis-ai-assistant-shell__quick-reply-insights\"\n >\n @for (item of getQuickReplyPresentationItems(reply); track item) {\n <span\n class=\"praxis-ai-assistant-shell__quick-reply-insight\"\n >\n <mat-icon aria-hidden=\"true\">{{ item.icon }}</mat-icon>\n <span class=\"praxis-ai-assistant-shell__quick-reply-insight-copy\">\n <span class=\"praxis-ai-assistant-shell__quick-reply-insight-label\">\n {{ item.label }}\n </span>\n <span class=\"praxis-ai-assistant-shell__quick-reply-insight-value\">\n {{ item.value }}\n </span>\n </span>\n </span>\n }\n </span>\n }\n <span class=\"praxis-ai-assistant-shell__quick-reply-cta\">\n {{ getQuickReplyCtaLabel(reply) }}\n <mat-icon aria-hidden=\"true\">arrow_forward</mat-icon>\n </span>\n </span>\n </button>\n }\n </div>\n }\n @if (shouldShowStatusText()) {\n <p\n class=\"praxis-ai-assistant-shell__status\"\n [attr.data-testid]=\"testIdPrefix + '-status'\"\n >\n {{ statusText }}\n </p>\n }\n @if (shouldShowErrorText()) {\n <p\n class=\"praxis-ai-assistant-shell__error\"\n [attr.data-testid]=\"testIdPrefix + '-error'\"\n >\n {{ errorText }}\n </p>\n }\n </div>\n\n <footer class=\"praxis-ai-assistant-shell__footer\">\n <label class=\"praxis-ai-assistant-shell__label\" for=\"praxis-ai-assistant-shell-prompt\">\n {{ resolvedLabels.prompt }}\n </label>\n <div class=\"praxis-ai-assistant-shell__composer\">\n <textarea\n id=\"praxis-ai-assistant-shell-prompt\"\n class=\"praxis-ai-assistant-shell__prompt\"\n [attr.data-testid]=\"testIdPrefix + '-prompt'\"\n [placeholder]=\"resolvedLabels.promptPlaceholder\"\n [ngModel]=\"currentPrompt\"\n [disabled]=\"busy\"\n (ngModelChange)=\"onPromptInput($event)\"\n (keydown)=\"onPromptKeydown($event)\"\n (paste)=\"onPromptPaste($event)\"\n ></textarea>\n <div class=\"praxis-ai-assistant-shell__composer-actions\">\n @if (showAttachAction) {\n <input\n #attachmentInput\n type=\"file\"\n hidden\n [attr.accept]=\"attachmentAccept || null\"\n [attr.multiple]=\"attachmentMultiple ? '' : null\"\n [attr.data-testid]=\"testIdPrefix + '-attachment-input'\"\n (change)=\"onAttachmentFilesSelected($event)\"\n >\n <button\n mat-stroked-button\n type=\"button\"\n [disabled]=\"busy\"\n (click)=\"onAttachClick(attachmentInput)\"\n [attr.data-testid]=\"testIdPrefix + '-attach'\"\n >\n <mat-icon>attach_file</mat-icon>\n {{ resolvedLabels.attach }}\n </button>\n }\n <button\n mat-flat-button\n color=\"primary\"\n type=\"button\"\n class=\"praxis-ai-assistant-shell__action praxis-ai-assistant-shell__action--primary\"\n [class.praxis-ai-assistant-shell__action--icon-only]=\"getPrimaryAction().iconOnly\"\n [matTooltip]=\"getPrimaryActionTooltip(getPrimaryAction())\"\n [ngClass]=\"'praxis-ai-assistant-shell__action--tone-' + getShellActionTone(getPrimaryAction())\"\n [disabled]=\"isShellActionDisabled(getPrimaryAction())\"\n (click)=\"onShellAction(getPrimaryAction())\"\n [attr.data-testid]=\"getPrimaryAction().testId || (submitTestId || (testIdPrefix + '-submit'))\"\n [attr.aria-label]=\"getPrimaryAction().ariaLabel || getPrimaryAction().label\"\n >\n @if (getPrimaryAction().icon) {\n <mat-icon aria-hidden=\"true\">{{ getPrimaryAction().icon }}</mat-icon>\n }\n @if (!getPrimaryAction().iconOnly) {\n <span>{{ getPrimaryAction().label }}</span>\n }\n </button>\n @for (action of getSecondaryActions(); track trackShellAction($index, action)) {\n <button\n mat-button\n type=\"button\"\n class=\"praxis-ai-assistant-shell__action praxis-ai-assistant-shell__action--secondary\"\n [ngClass]=\"'praxis-ai-assistant-shell__action--tone-' + getShellActionTone(action)\"\n [disabled]=\"isShellActionDisabled(action)\"\n (click)=\"onShellAction(action)\"\n [attr.data-testid]=\"action.testId || (testIdPrefix + '-action-' + action.id)\"\n [attr.aria-label]=\"action.ariaLabel || action.label\"\n >\n @if (action.icon) {\n <mat-icon aria-hidden=\"true\">{{ action.icon }}</mat-icon>\n }\n {{ action.label }}\n </button>\n }\n @if (busy) {\n <mat-spinner diameter=\"20\" [attr.data-testid]=\"testIdPrefix + '-spinner'\"></mat-spinner>\n }\n </div>\n </div>\n </footer>\n\n @if (resizable) {\n @for (direction of resizeHandles; track trackResizeHandle($index, direction)) {\n <span\n class=\"praxis-ai-assistant-shell__resize-handle praxis-ai-assistant-shell__resize-handle--{{ direction }}\"\n [attr.data-testid]=\"direction === 'se' ? testIdPrefix + '-resize-handle' : testIdPrefix + '-resize-handle-' + direction\"\n aria-hidden=\"true\"\n role=\"presentation\"\n (pointerdown)=\"startResize(direction, $event)\"\n ></span>\n }\n }\n</section>\n", styles: [":host{display:block}.praxis-ai-assistant-shell{--praxis-ai-assistant-shell-shadow-color: var(--md-sys-color-shadow);--praxis-ai-assistant-shell-highlight-color: var(--md-sys-color-on-surface);--praxis-ai-assistant-shell-tone-analytics: var(--md-sys-color-primary);--praxis-ai-assistant-shell-tone-resource: var(--md-sys-color-tertiary);--praxis-ai-assistant-shell-tone-success: var(--md-sys-color-tertiary);--praxis-ai-assistant-shell-tone-warning: var(--md-sys-color-secondary);--praxis-ai-assistant-shell-tone-danger: var(--md-sys-color-error);--praxis-ai-assistant-shell-tone-neutral: var(--md-sys-color-outline);position:fixed;box-sizing:border-box;min-width:360px;min-height:360px;display:flex;flex-direction:column;overflow:hidden;color:var(--md-sys-color-on-surface);border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant) 70%,transparent);border-radius:8px;background:var(--md-sys-color-surface);box-shadow:0 24px 60px color-mix(in srgb,var(--praxis-ai-assistant-shell-shadow-color) 40%,transparent);z-index:var(--praxis-ai-assistant-shell-z-index, 1200)}.praxis-ai-assistant-shell__header{flex:0 0 auto;display:flex;align-items:flex-start;gap:9px;padding:10px 10px 9px;border-color:color-mix(in srgb,var(--md-sys-color-outline-variant) 72%,transparent);background:var(--md-sys-color-surface-container)}.praxis-ai-assistant-shell__header{justify-content:flex-start;border-bottom:1px solid;cursor:move;touch-action:none}.praxis-ai-assistant-shell__identity{flex:0 0 auto;display:grid;place-items:center;width:30px;height:30px;border-radius:8px;background:var(--md-sys-color-primary);color:var(--md-sys-color-on-primary);box-shadow:0 6px 16px color-mix(in srgb,var(--md-sys-color-primary) 22%,transparent)}.praxis-ai-assistant-shell__identity mat-icon{width:18px;height:18px;font-size:18px}.praxis-ai-assistant-shell__title-group{min-width:0;flex:1 1 auto;display:grid;gap:4px}.praxis-ai-assistant-shell__title-row{min-width:0;display:flex;align-items:center;gap:8px}.praxis-ai-assistant-shell__badges{flex:0 0 auto;display:flex;align-items:center;justify-content:flex-end;gap:4px;min-width:0;flex-wrap:wrap}.praxis-ai-assistant-shell__badge{display:inline-flex;align-items:center;gap:5px;min-height:20px;max-width:120px;padding:2px 7px;border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant) 80%,transparent);border-radius:8px;color:var(--md-sys-color-on-surface-variant);background:var(--md-sys-color-surface-container-high);font-size:11px;line-height:1.2;overflow-wrap:anywhere}.praxis-ai-assistant-shell__badge--context{color:var(--md-sys-color-on-surface);background:color-mix(in srgb,var(--md-sys-color-primary) 9%,var(--md-sys-color-surface-container-high))}.praxis-ai-assistant-shell__badge--state{border-color:transparent;background:transparent;color:var(--md-sys-color-on-surface-variant);padding-inline:3px}.praxis-ai-assistant-shell__badge--error{color:var(--md-sys-color-error);border-color:color-mix(in srgb,var(--md-sys-color-error) 60%,transparent)}.praxis-ai-assistant-shell__state-dot{flex:0 0 auto;width:6px;height:6px;border-radius:999px;background:var(--md-sys-color-primary);box-shadow:0 0 0 2px color-mix(in srgb,var(--md-sys-color-primary) 16%,transparent)}.praxis-ai-assistant-shell__badge--error .praxis-ai-assistant-shell__state-dot{background:var(--md-sys-color-error);box-shadow:0 0 0 2px color-mix(in srgb,var(--md-sys-color-error) 16%,transparent)}.praxis-ai-assistant-shell__title-group strong,.praxis-ai-assistant-shell__title-group p{min-width:0;margin:0;overflow-wrap:anywhere}.praxis-ai-assistant-shell__title-group strong{flex:1 1 auto;font-size:13px;line-height:1.2}.praxis-ai-assistant-shell__title-group p{color:var(--md-sys-color-on-surface-variant);font-size:11.5px;line-height:1.3}.praxis-ai-assistant-shell__header-actions{flex:0 0 auto;display:flex;align-items:center;gap:2px;margin-top:-3px}.praxis-ai-assistant-shell__header-actions button{display:inline-grid;place-items:center;width:34px;height:34px;padding:0;color:var(--md-sys-color-on-surface-variant);line-height:1;opacity:.78}.praxis-ai-assistant-shell__header-actions button:hover,.praxis-ai-assistant-shell__header-actions button:focus-visible{opacity:1}.praxis-ai-assistant-shell__header-actions mat-icon{display:block;width:18px;height:18px;font-size:18px;line-height:18px}.praxis-ai-assistant-shell__body{min-height:0;flex:1 1 auto;display:flex;flex-direction:column;gap:10px;padding:12px 12px 10px;overflow:auto;background:linear-gradient(180deg,var(--md-sys-color-surface-container-low),var(--md-sys-color-surface))}.praxis-ai-assistant-shell__context,.praxis-ai-assistant-shell__attachments{flex:0 0 auto;display:flex;align-items:center;gap:8px;overflow-x:auto}.praxis-ai-assistant-shell__context-item{flex:0 0 auto;display:inline-flex;align-items:center;gap:5px;max-width:240px;padding:5px 8px;border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant) 70%,transparent);border-radius:8px;background:var(--md-sys-color-surface-container-high);font-size:12px;line-height:1.25}.praxis-ai-assistant-shell__context-item mat-icon{width:16px;height:16px;font-size:16px}.praxis-ai-assistant-shell__context-label,.praxis-ai-assistant-shell__context-value{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.praxis-ai-assistant-shell__context-label{color:var(--md-sys-color-on-surface)}.praxis-ai-assistant-shell__context-value{color:var(--md-sys-color-on-surface-variant)}.praxis-ai-assistant-shell__label{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}.praxis-ai-assistant-shell__prompt{box-sizing:border-box;width:100%;min-height:46px;max-height:96px;resize:none;border:0;padding:10px 12px 8px;color:var(--md-sys-color-on-surface);background:transparent;font:inherit;line-height:1.45;outline:none}.praxis-ai-assistant-shell__conversation{min-height:0;flex:1 1 auto;display:flex;flex-direction:column;gap:8px;overflow:auto;padding:2px}.praxis-ai-assistant-shell__message{max-width:86%;align-self:flex-start;padding:9px 11px;border-radius:8px;background:var(--md-sys-color-surface-container-high);color:var(--md-sys-color-on-surface);font-size:13px;line-height:1.35;overflow-wrap:anywhere}.praxis-ai-assistant-shell__message-content{white-space:normal}.praxis-ai-assistant-shell__message-content :where(p,ul,h3,h4,h5){margin:0}.praxis-ai-assistant-shell__message-content :where(p,ul,h3,h4,h5)+:where(p,ul,h3,h4,h5){margin-top:8px}.praxis-ai-assistant-shell__message-content ul{padding-left:18px}.praxis-ai-assistant-shell__message-content li+li{margin-top:4px}.praxis-ai-assistant-shell__message-content code{padding:1px 4px;border-radius:4px;background:color-mix(in srgb,var(--md-sys-color-on-surface) 10%,transparent);font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:.94em}.praxis-ai-assistant-shell__message-actions{display:flex;align-items:center;gap:4px;flex-wrap:wrap;margin-top:8px}.praxis-ai-assistant-shell__message-action{min-height:28px;padding:0 8px;border-radius:8px;font-size:12px}.praxis-ai-assistant-shell__message-action--icon{width:30px;min-width:30px;height:30px;padding:0;color:var(--md-sys-color-on-surface-variant)}.praxis-ai-assistant-shell__message-action--icon mat-icon{width:17px;height:17px;font-size:17px}.praxis-ai-assistant-shell__message-feedback,.praxis-ai-assistant-shell__message-feedback-submitted{display:flex;align-items:center;gap:4px;margin-top:8px}.praxis-ai-assistant-shell__message-feedback-action{--mdc-icon-button-state-layer-size: 30px;--mat-icon-button-state-layer-size: 30px;display:inline-grid;place-items:center;width:30px;min-width:30px;height:30px;padding:0;color:var(--md-sys-color-on-surface-variant);line-height:1}.praxis-ai-assistant-shell__message-feedback-action mat-icon,.praxis-ai-assistant-shell__message-feedback-submitted mat-icon{display:block;width:17px;height:17px;font-size:17px;line-height:17px}.praxis-ai-assistant-shell__message-feedback-submitted{color:var(--md-sys-color-on-surface-variant);font-size:12px}.praxis-ai-assistant-shell__message--assistant{border-bottom-left-radius:2px}.praxis-ai-assistant-shell__message--user{align-self:flex-end;border-bottom-right-radius:2px;background:var(--md-sys-color-primary-container);color:var(--md-sys-color-on-primary-container)}.praxis-ai-assistant-shell__message--status{color:var(--md-sys-color-on-surface-variant)}.praxis-ai-assistant-shell__message--error,.praxis-ai-assistant-shell__error{color:var(--md-sys-color-error)}.praxis-ai-assistant-shell__quick-replies{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,520px),1fr));gap:8px;align-items:stretch;padding-bottom:4px}.praxis-ai-assistant-shell__quick-replies--inline{display:flex;flex-wrap:wrap;align-items:center;gap:6px}.praxis-ai-assistant-shell__attachment{flex:0 0 auto;display:inline-flex;align-items:center;gap:7px;max-width:260px;min-height:34px;padding:4px 4px 4px 8px;border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant) 70%,transparent);border-radius:8px;background:var(--md-sys-color-surface-container-high)}.praxis-ai-assistant-shell__attachment--error{border-color:color-mix(in srgb,var(--md-sys-color-error) 60%,transparent)}.praxis-ai-assistant-shell__attachment-preview{flex:0 0 auto;width:28px;height:28px;border-radius:6px;object-fit:cover}.praxis-ai-assistant-shell__attachment-name,.praxis-ai-assistant-shell__attachment-kind{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:12px}.praxis-ai-assistant-shell__attachment-name{color:var(--md-sys-color-on-surface)}.praxis-ai-assistant-shell__attachment-kind{color:var(--md-sys-color-on-surface-variant)}.praxis-ai-assistant-shell__quick-reply{--praxis-ai-assistant-shell-quick-reply-accent: var(--md-sys-color-primary);--praxis-ai-assistant-shell-quick-reply-background: color-mix( in srgb, var(--praxis-ai-assistant-shell-quick-reply-accent) 7%, var(--md-sys-color-surface-container-high) );--praxis-ai-assistant-shell-quick-reply-foreground: var(--md-sys-color-on-surface);width:100%;max-width:100%;height:auto;min-height:0;position:relative;overflow:hidden;padding:15px 16px;align-items:stretch;border-color:color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 36%,transparent);border-radius:22px;color:var(--praxis-ai-assistant-shell-quick-reply-foreground);background:linear-gradient(135deg,color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 16%,transparent),transparent 46%),radial-gradient(circle at 92% 10%,color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 22%,transparent),transparent 32%),var(--praxis-ai-assistant-shell-quick-reply-background);box-shadow:0 18px 42px color-mix(in srgb,var(--praxis-ai-assistant-shell-shadow-color) 22%,transparent),inset 0 1px color-mix(in srgb,var(--praxis-ai-assistant-shell-highlight-color) 16%,transparent);letter-spacing:normal;white-space:normal;text-align:left;text-transform:none;-webkit-user-select:none;user-select:none;transition:border-color .16s ease,box-shadow .16s ease,transform .16s ease,background .16s ease;--mdc-outlined-button-container-height: auto;--mat-outlined-button-horizontal-padding: 0}.praxis-ai-assistant-shell__quick-reply:hover:not(:disabled),.praxis-ai-assistant-shell__quick-reply:focus-visible{border-color:color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 74%,transparent);box-shadow:0 18px 42px color-mix(in srgb,var(--praxis-ai-assistant-shell-shadow-color) 24%,transparent),0 0 0 3px color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 18%,transparent),inset 0 1px color-mix(in srgb,var(--praxis-ai-assistant-shell-highlight-color) 18%,transparent);transform:translateY(-1px)}.praxis-ai-assistant-shell__quick-reply--contextual-action{padding:10px 12px;border-color:color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 34%,transparent);border-radius:8px;background:linear-gradient(90deg,color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 15%,transparent),color-mix(in srgb,var(--md-sys-color-surface-container-high) 92%,transparent)),var(--md-sys-color-surface-container-high);box-shadow:none}.praxis-ai-assistant-shell__quick-reply--guided-action{padding:10px 12px;border-color:color-mix(in srgb,var(--md-sys-color-outline-variant) 82%,transparent);border-radius:8px;background:var(--md-sys-color-surface-container-high);box-shadow:none}.praxis-ai-assistant-shell__quick-reply--contextual-action:hover:not(:disabled),.praxis-ai-assistant-shell__quick-reply--contextual-action:focus-visible{border-color:color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 62%,transparent);box-shadow:0 0 0 2px color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 15%,transparent);transform:none}.praxis-ai-assistant-shell__quick-reply--guided-action:hover:not(:disabled),.praxis-ai-assistant-shell__quick-reply--guided-action:focus-visible{border-color:color-mix(in srgb,var(--md-sys-color-primary) 64%,var(--md-sys-color-outline-variant));background:color-mix(in srgb,var(--md-sys-color-primary-container) 18%,var(--md-sys-color-surface-container-high));box-shadow:0 0 0 2px color-mix(in srgb,var(--md-sys-color-primary) 14%,transparent);transform:none}.praxis-ai-assistant-shell__quick-reply--contextual-action .praxis-ai-assistant-shell__quick-reply-ambient,.praxis-ai-assistant-shell__quick-reply--guided-action .praxis-ai-assistant-shell__quick-reply-ambient{display:none}.praxis-ai-assistant-shell__quick-reply--contextual-action ::ng-deep .mdc-button__label,.praxis-ai-assistant-shell__quick-reply--guided-action ::ng-deep .mdc-button__label{gap:10px}.praxis-ai-assistant-shell__quick-reply--contextual-action .praxis-ai-assistant-shell__quick-reply-icon-frame,.praxis-ai-assistant-shell__quick-reply--guided-action .praxis-ai-assistant-shell__quick-reply-icon-frame{width:34px;height:34px;border-radius:8px;box-shadow:none}.praxis-ai-assistant-shell__quick-reply--guided-action .praxis-ai-assistant-shell__quick-reply-icon-frame{border-color:color-mix(in srgb,var(--md-sys-color-primary) 24%,var(--md-sys-color-outline-variant));color:var(--md-sys-color-primary);background:color-mix(in srgb,var(--md-sys-color-primary-container) 34%,var(--md-sys-color-surface-container-high))}.praxis-ai-assistant-shell__quick-reply--contextual-action .praxis-ai-assistant-shell__quick-reply-icon,.praxis-ai-assistant-shell__quick-reply--guided-action .praxis-ai-assistant-shell__quick-reply-icon{width:19px;height:19px;font-size:19px}.praxis-ai-assistant-shell__quick-reply--contextual-action .praxis-ai-assistant-shell__quick-reply-copy,.praxis-ai-assistant-shell__quick-reply--guided-action .praxis-ai-assistant-shell__quick-reply-copy{gap:6px}.praxis-ai-assistant-shell__quick-reply--contextual-action .praxis-ai-assistant-shell__quick-reply-label,.praxis-ai-assistant-shell__quick-reply--guided-action .praxis-ai-assistant-shell__quick-reply-label{font-size:13.5px;font-weight:760;letter-spacing:0}.praxis-ai-assistant-shell__quick-reply--contextual-action .praxis-ai-assistant-shell__quick-reply-description,.praxis-ai-assistant-shell__quick-reply--guided-action .praxis-ai-assistant-shell__quick-reply-description{display:-webkit-box;overflow:hidden;font-size:12px;line-height:1.34;-webkit-box-orient:vertical;-webkit-line-clamp:2}.praxis-ai-assistant-shell__quick-reply--guided-action .praxis-ai-assistant-shell__quick-reply-description{color:var(--md-sys-color-on-surface-variant)}.praxis-ai-assistant-shell__quick-reply--contextual-action .praxis-ai-assistant-shell__quick-reply-badge,.praxis-ai-assistant-shell__quick-reply--guided-action .praxis-ai-assistant-shell__quick-reply-badge{border-radius:8px;font-size:10px;letter-spacing:0}.praxis-ai-assistant-shell__quick-reply--guided-action .praxis-ai-assistant-shell__quick-reply-badge{border-color:color-mix(in srgb,var(--md-sys-color-outline-variant) 76%,transparent);color:var(--md-sys-color-on-surface-variant);background:color-mix(in srgb,var(--md-sys-color-surface-container-lowest) 62%,transparent)}.praxis-ai-assistant-shell__quick-reply--guided-action .praxis-ai-assistant-shell__quick-reply-cta{color:var(--md-sys-color-primary)}.praxis-ai-assistant-shell__quick-reply--contextual-action .praxis-ai-assistant-shell__quick-reply-context-chip{border-radius:8px;padding:4px 7px;font-size:10.5px;font-weight:650}.praxis-ai-assistant-shell__quick-reply--contextual-action .praxis-ai-assistant-shell__quick-reply-cta,.praxis-ai-assistant-shell__quick-reply--guided-action .praxis-ai-assistant-shell__quick-reply-cta{font-size:11.5px}.praxis-ai-assistant-shell__quick-reply--compact{justify-self:start;width:fit-content;min-width:min(100%,210px);max-width:min(100%,320px);padding:9px 11px;border-radius:16px;background:linear-gradient(135deg,color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 10%,transparent),transparent 55%),var(--md-sys-color-surface-container-high);box-shadow:0 8px 18px color-mix(in srgb,var(--praxis-ai-assistant-shell-shadow-color) 16%,transparent),inset 0 1px color-mix(in srgb,var(--praxis-ai-assistant-shell-highlight-color) 10%,transparent)}.praxis-ai-assistant-shell__quick-reply.praxis-ai-assistant-shell__quick-reply--compact ::ng-deep .mdc-button__label{align-items:center;gap:10px}.praxis-ai-assistant-shell__quick-reply--compact .praxis-ai-assistant-shell__quick-reply-icon-frame{width:34px;height:34px;border-radius:12px}.praxis-ai-assistant-shell__quick-reply--compact .praxis-ai-assistant-shell__quick-reply-icon{width:19px;height:19px;font-size:19px}.praxis-ai-assistant-shell__quick-reply--compact .praxis-ai-assistant-shell__quick-reply-copy{gap:4px}.praxis-ai-assistant-shell__quick-reply--compact .praxis-ai-assistant-shell__quick-reply-header{align-items:center}.praxis-ai-assistant-shell__quick-reply--compact .praxis-ai-assistant-shell__quick-reply-label{font-size:13px;line-height:1.2}.praxis-ai-assistant-shell__quick-reply--compact .praxis-ai-assistant-shell__quick-reply-badge,.praxis-ai-assistant-shell__quick-reply--compact .praxis-ai-assistant-shell__quick-reply-cta{display:none}.praxis-ai-assistant-shell__quick-replies--inline .praxis-ai-assistant-shell__quick-reply{width:auto;min-width:0;max-width:100%;padding:6px 10px;border-radius:999px;box-shadow:none}.praxis-ai-assistant-shell__quick-replies--inline .praxis-ai-assistant-shell__quick-reply--guided-action{border-color:color-mix(in srgb,var(--md-sys-color-outline-variant) 76%,transparent);background:color-mix(in srgb,var(--md-sys-color-surface-container-high) 96%,transparent)}.praxis-ai-assistant-shell__quick-replies--inline .praxis-ai-assistant-shell__quick-reply--guided-action:hover:not(:disabled),.praxis-ai-assistant-shell__quick-replies--inline .praxis-ai-assistant-shell__quick-reply--guided-action:focus-visible{border-color:color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 52%,transparent);background:color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 9%,var(--md-sys-color-surface-container-high));box-shadow:0 0 0 2px color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 12%,transparent)}.praxis-ai-assistant-shell__quick-replies--inline .praxis-ai-assistant-shell__quick-reply ::ng-deep .mdc-button__label{display:inline-flex;grid-template-columns:none;align-items:center;gap:6px;width:auto}.praxis-ai-assistant-shell__quick-replies--inline .praxis-ai-assistant-shell__quick-reply ::ng-deep .mat-mdc-button-touch-target{min-height:34px}.praxis-ai-assistant-shell__quick-replies--inline .praxis-ai-assistant-shell__quick-reply-icon-frame{width:18px;height:18px;border:0;border-radius:0;background:transparent;box-shadow:none}.praxis-ai-assistant-shell__quick-replies--inline .praxis-ai-assistant-shell__quick-reply-icon{width:16px;height:16px;color:var(--praxis-ai-assistant-shell-quick-reply-accent);font-size:16px}.praxis-ai-assistant-shell__quick-replies--inline .praxis-ai-assistant-shell__quick-reply-copy,.praxis-ai-assistant-shell__quick-replies--inline .praxis-ai-assistant-shell__quick-reply-heading,.praxis-ai-assistant-shell__quick-replies--inline .praxis-ai-assistant-shell__quick-reply-header{display:inline-flex;align-items:center;gap:0}.praxis-ai-assistant-shell__quick-replies--inline .praxis-ai-assistant-shell__quick-reply-label{color:var(--md-sys-color-on-surface);font-size:12.5px;font-weight:650;line-height:1.2;white-space:nowrap}.praxis-ai-assistant-shell__quick-replies--inline .praxis-ai-assistant-shell__quick-reply-description,.praxis-ai-assistant-shell__quick-replies--inline .praxis-ai-assistant-shell__quick-reply-actions,.praxis-ai-assistant-shell__quick-replies--inline .praxis-ai-assistant-shell__quick-reply-badge,.praxis-ai-assistant-shell__quick-replies--inline .praxis-ai-assistant-shell__quick-reply-cta{display:none}.praxis-ai-assistant-shell__quick-reply ::ng-deep .mdc-button__label{position:relative;z-index:1;min-width:0;display:grid;grid-template-columns:auto minmax(0,1fr);align-items:flex-start;gap:14px;width:100%;height:auto;line-height:normal}.praxis-ai-assistant-shell__quick-reply-ambient{position:absolute;inset:0;pointer-events:none}.praxis-ai-assistant-shell__quick-reply-ambient:before{content:\"\";position:absolute;inset:0 18px auto;height:1px;border-radius:999px;background:linear-gradient(90deg,transparent,color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 90%,var(--praxis-ai-assistant-shell-highlight-color)),transparent);opacity:.58}.praxis-ai-assistant-shell__quick-reply-ambient:after{content:\"\";position:absolute;top:-34px;right:-44px;width:150px;height:150px;border-radius:999px;background:color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 13%,transparent);filter:blur(18px)}.praxis-ai-assistant-shell__quick-reply ::ng-deep .mat-mdc-button-touch-target{height:100%;min-height:48px}.praxis-ai-assistant-shell__quick-reply-icon-frame{flex:0 0 auto;width:46px;height:46px;display:inline-grid;place-items:center;border:1px solid color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 34%,transparent);border-radius:17px;color:var(--praxis-ai-assistant-shell-quick-reply-accent);background:linear-gradient(145deg,color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 24%,transparent),color-mix(in srgb,var(--praxis-ai-assistant-shell-highlight-color) 6%,transparent));box-shadow:inset 0 1px color-mix(in srgb,var(--praxis-ai-assistant-shell-highlight-color) 18%,transparent),0 10px 24px color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 12%,transparent)}.praxis-ai-assistant-shell__quick-reply-icon{width:24px;height:24px;font-size:24px}.praxis-ai-assistant-shell__quick-reply-details{flex:0 0 auto;width:24px;height:24px;display:inline-grid;place-items:center;border:1px solid color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 14%,transparent);border-radius:50%;color:var(--md-sys-color-on-surface-variant);background:color-mix(in srgb,var(--md-sys-color-outline) 14%,transparent);font-size:17px;opacity:.9}.praxis-ai-assistant-shell__quick-reply-copy{min-width:0;display:grid;gap:10px;flex:1 1 auto}.praxis-ai-assistant-shell__quick-reply-header{min-width:0;display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.praxis-ai-assistant-shell__quick-reply-heading{min-width:0;display:grid;gap:5px}.praxis-ai-assistant-shell__quick-reply-actions{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:flex-end;gap:7px;max-width:46%}.praxis-ai-assistant-shell__quick-reply-label,.praxis-ai-assistant-shell__quick-reply-description{min-width:0;overflow-wrap:anywhere}.praxis-ai-assistant-shell__quick-reply-label{color:var(--md-sys-color-on-surface);font-size:17px;font-weight:760;letter-spacing:.005em;line-height:1.18;text-transform:none}.praxis-ai-assistant-shell__quick-reply-badge{flex:0 0 auto;max-width:100%;padding:4px 8px;border:1px solid color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 28%,transparent);border-radius:999px;color:color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 86%,var(--praxis-ai-assistant-shell-highlight-color));background:color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 11%,transparent);font-size:10.5px;font-weight:700;letter-spacing:.02em;line-height:1.1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.praxis-ai-assistant-shell__quick-reply-description{color:color-mix(in srgb,var(--md-sys-color-on-surface) 80%,transparent);font-size:13px;line-height:1.46}.praxis-ai-assistant-shell__quick-reply-context{display:flex;flex-wrap:wrap;gap:7px;align-items:center}.praxis-ai-assistant-shell__quick-reply-context-chip{min-width:0;display:inline-flex;align-items:center;gap:4px;max-width:100%;padding:5px 8px;border:1px solid color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 22%,transparent);border-radius:999px;color:color-mix(in srgb,var(--md-sys-color-on-surface) 82%,transparent);background:color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 9%,transparent);font-size:11px;font-weight:650;line-height:1.15}.praxis-ai-assistant-shell__quick-reply-context-chip mat-icon{width:14px;height:14px;color:var(--praxis-ai-assistant-shell-quick-reply-accent);font-size:14px}.praxis-ai-assistant-shell__quick-reply-context-chip span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.praxis-ai-assistant-shell__quick-reply-insights{display:grid;grid-template-columns:repeat(auto-fit,minmax(145px,1fr));gap:8px;padding:8px;border:1px solid color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 16%,transparent);border-radius:16px;background:linear-gradient(180deg,color-mix(in srgb,var(--praxis-ai-assistant-shell-highlight-color) 5%,transparent),color-mix(in srgb,var(--md-sys-color-surface-container-lowest) 26%,transparent))}.praxis-ai-assistant-shell__quick-reply-insight{min-width:0;display:grid;grid-template-columns:20px minmax(0,1fr);gap:8px;align-items:start;padding:8px;border:1px solid color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 10%,transparent);border-radius:13px;color:color-mix(in srgb,var(--md-sys-color-on-surface) 86%,transparent);background:color-mix(in srgb,var(--md-sys-color-surface-container-high) 44%,transparent);font-size:12px;line-height:1.35}.praxis-ai-assistant-shell__quick-reply-insight mat-icon{width:17px;height:17px;color:var(--praxis-ai-assistant-shell-quick-reply-accent);font-size:17px;opacity:.9}.praxis-ai-assistant-shell__quick-reply-insight-copy{min-width:0;display:grid;gap:1px}.praxis-ai-assistant-shell__quick-reply-insight-label{color:color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 82%,var(--praxis-ai-assistant-shell-highlight-color));font-size:10.5px;font-weight:760;letter-spacing:.045em;line-height:1.2;text-transform:uppercase}.praxis-ai-assistant-shell__quick-reply-insight-value{min-width:0;overflow-wrap:anywhere}.praxis-ai-assistant-shell__quick-reply-cta{display:inline-flex;align-items:center;justify-self:start;gap:5px;padding:3px 0;color:color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 84%,var(--praxis-ai-assistant-shell-highlight-color));font-size:12px;font-weight:760;letter-spacing:.01em;line-height:1.2}.praxis-ai-assistant-shell__quick-reply-cta mat-icon{width:15px;height:15px;font-size:15px;transition:transform .16s ease}.praxis-ai-assistant-shell__quick-reply:hover:not(:disabled) .praxis-ai-assistant-shell__quick-reply-cta mat-icon,.praxis-ai-assistant-shell__quick-reply:focus-visible .praxis-ai-assistant-shell__quick-reply-cta mat-icon{transform:translate(2px)}.praxis-ai-assistant-shell__quick-reply--tone-analytics{--praxis-ai-assistant-shell-quick-reply-accent: var(--praxis-ai-assistant-shell-tone-analytics)}.praxis-ai-assistant-shell__quick-reply--tone-resource{--praxis-ai-assistant-shell-quick-reply-accent: var(--praxis-ai-assistant-shell-tone-resource)}.praxis-ai-assistant-shell__quick-reply--tone-warning{--praxis-ai-assistant-shell-quick-reply-accent: var(--praxis-ai-assistant-shell-tone-warning)}.praxis-ai-assistant-shell__quick-reply--tone-success{--praxis-ai-assistant-shell-quick-reply-accent: var(--praxis-ai-assistant-shell-tone-success)}.praxis-ai-assistant-shell__quick-reply--tone-danger{--praxis-ai-assistant-shell-quick-reply-accent: var(--praxis-ai-assistant-shell-tone-danger)}.praxis-ai-assistant-shell__quick-reply--tone-neutral{--praxis-ai-assistant-shell-quick-reply-accent: var(--praxis-ai-assistant-shell-tone-neutral)}@media(max-width:640px){.praxis-ai-assistant-shell__quick-reply{padding:13px;border-radius:19px}.praxis-ai-assistant-shell__quick-reply ::ng-deep .mdc-button__label{grid-template-columns:minmax(0,1fr);gap:10px}.praxis-ai-assistant-shell__quick-reply-icon-frame{width:38px;height:38px;border-radius:14px}.praxis-ai-assistant-shell__quick-reply-header{display:grid}.praxis-ai-assistant-shell__quick-reply-actions{justify-content:flex-start;max-width:100%}.praxis-ai-assistant-shell__quick-reply-insights{grid-template-columns:minmax(0,1fr)}}.praxis-ai-assistant-shell__status,.praxis-ai-assistant-shell__error{margin:0;font-size:13px;line-height:1.35;overflow-wrap:anywhere}.praxis-ai-assistant-shell__footer{flex:0 0 auto;padding:8px 10px 10px;border-top:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant) 72%,transparent);background:var(--md-sys-color-surface-container-low)}.praxis-ai-assistant-shell__composer{display:grid;gap:8px;border:1px solid var(--md-sys-color-outline-variant);border-radius:8px;background:var(--md-sys-color-surface-container-lowest);box-shadow:inset 0 1px color-mix(in srgb,var(--praxis-ai-assistant-shell-highlight-color) 4%,transparent)}.praxis-ai-assistant-shell__composer:focus-within{border-color:var(--md-sys-color-primary);box-shadow:0 0 0 2px color-mix(in srgb,var(--md-sys-color-primary) 16%,transparent)}.praxis-ai-assistant-shell__composer-actions{display:flex;align-items:center;justify-content:flex-end;gap:8px;padding:0 8px 7px;flex-wrap:wrap}.praxis-ai-assistant-shell__action{min-height:36px;border-radius:10px;font-weight:650}.praxis-ai-assistant-shell__action mat-icon{width:18px;height:18px;margin-right:6px;font-size:18px}.praxis-ai-assistant-shell__action--icon-only{width:40px;min-width:40px;height:40px;padding-inline:0;border-radius:50%}.praxis-ai-assistant-shell__action--icon-only mat-icon{margin-right:0}.praxis-ai-assistant-shell__action--secondary{color:var(--md-sys-color-on-surface-variant)}.praxis-ai-assistant-shell__action--tone-governance{color:var(--md-sys-color-primary);background:color-mix(in srgb,var(--md-sys-color-primary) 10%,transparent)}.praxis-ai-assistant-shell__action--tone-success{color:var(--praxis-ai-assistant-shell-tone-success);background:color-mix(in srgb,var(--praxis-ai-assistant-shell-tone-success) 10%,transparent)}.praxis-ai-assistant-shell__action--tone-warning{color:var(--praxis-ai-assistant-shell-tone-warning);background:color-mix(in srgb,var(--praxis-ai-assistant-shell-tone-warning) 10%,transparent)}.praxis-ai-assistant-shell__action--tone-danger{color:var(--md-sys-color-error);background:color-mix(in srgb,var(--md-sys-color-error) 10%,transparent)}.praxis-ai-assistant-shell__resize-handle{position:absolute;z-index:2;border:0;background:transparent;touch-action:none}.praxis-ai-assistant-shell__resize-handle--n,.praxis-ai-assistant-shell__resize-handle--s{left:16px;right:16px;height:10px;cursor:ns-resize}.praxis-ai-assistant-shell__resize-handle--n{top:-5px}.praxis-ai-assistant-shell__resize-handle--s{bottom:-5px}.praxis-ai-assistant-shell__resize-handle--e,.praxis-ai-assistant-shell__resize-handle--w{top:16px;bottom:16px;width:10px;cursor:ew-resize}.praxis-ai-assistant-shell__resize-handle--e{right:-5px}.praxis-ai-assistant-shell__resize-handle--w{left:-5px}.praxis-ai-assistant-shell__resize-handle--ne,.praxis-ai-assistant-shell__resize-handle--nw,.praxis-ai-assistant-shell__resize-handle--se,.praxis-ai-assistant-shell__resize-handle--sw{width:22px;height:22px}.praxis-ai-assistant-shell__resize-handle--ne{top:-5px;right:-5px;cursor:nesw-resize}.praxis-ai-assistant-shell__resize-handle--nw{top:-5px;left:-5px;cursor:nwse-resize}.praxis-ai-assistant-shell__resize-handle--se{right:-5px;bottom:-5px;cursor:nwse-resize}.praxis-ai-assistant-shell__resize-handle--sw{bottom:-5px;left:-5px;cursor:nesw-resize}.praxis-ai-assistant-shell__resize-handle--se:after{content:\"\";position:absolute;right:8px;bottom:8px;width:10px;height:10px;border-right:2px solid var(--md-sys-color-outline);border-bottom:2px solid var(--md-sys-color-outline)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i1.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i7.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i8.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
8439
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: PraxisAiAssistantShellComponent, isStandalone: true, selector: "praxis-ai-assistant-shell", inputs: { labels: "labels", mode: "mode", state: "state", contextItems: "contextItems", attachments: "attachments", messages: "messages", quickReplies: "quickReplies", recommendedIntents: "recommendedIntents", prompt: "prompt", statusText: "statusText", errorText: "errorText", testIdPrefix: "testIdPrefix", panelTestId: "panelTestId", submitTestId: "submitTestId", applyTestId: "applyTestId", primaryAction: "primaryAction", secondaryActions: "secondaryActions", governanceActions: "governanceActions", busy: "busy", canSubmit: "canSubmit", canApply: "canApply", submitOnEnter: "submitOnEnter", showAttachAction: "showAttachAction", enablePastedAttachments: "enablePastedAttachments", enableFileAttachments: "enableFileAttachments", attachmentAccept: "attachmentAccept", attachmentMultiple: "attachmentMultiple", voiceInputMode: "voiceInputMode", voiceLanguage: "voiceLanguage", draggable: "draggable", resizable: "resizable", minWidth: "minWidth", minHeight: "minHeight", margin: "margin", layout: "layout" }, outputs: { promptChange: "promptChange", submitPrompt: "submitPrompt", apply: "apply", retryTurn: "retryTurn", cancelTurn: "cancelTurn", shellAction: "shellAction", close: "close", attach: "attach", attachmentsPasted: "attachmentsPasted", attachmentsSelected: "attachmentsSelected", removeAttachment: "removeAttachment", messageAction: "messageAction", editMessage: "editMessage", resendMessage: "resendMessage", quickReply: "quickReply", recommendedIntent: "recommendedIntent", layoutChange: "layoutChange" }, providers: [PraxisBrowserSpeechTranscriptionService], viewQueries: [{ propertyName: "panel", first: true, predicate: ["panel"], descendants: true, static: true }, { propertyName: "conversation", first: true, predicate: ["conversation"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<section\n #panel\n class=\"praxis-ai-assistant-shell\"\n role=\"dialog\"\n [attr.aria-label]=\"resolvedLabels.title\"\n [attr.aria-busy]=\"busy ? 'true' : null\"\n [style.left.px]=\"currentLayout.left\"\n [style.top.px]=\"currentLayout.top\"\n [style.width.px]=\"currentLayout.width\"\n [style.height.px]=\"currentLayout.height\"\n [attr.data-testid]=\"panelTestId || testIdPrefix\"\n >\n <header\n class=\"praxis-ai-assistant-shell__header\"\n [attr.data-testid]=\"testIdPrefix + '-drag-handle'\"\n [attr.aria-label]=\"resolvedLabels.dragHandleAria\"\n (pointerdown)=\"startDrag($event)\"\n >\n <div class=\"praxis-ai-assistant-shell__identity\" aria-hidden=\"true\">\n <mat-icon>auto_awesome</mat-icon>\n </div>\n <div class=\"praxis-ai-assistant-shell__title-group\">\n <div class=\"praxis-ai-assistant-shell__title-row\">\n <strong>{{ resolvedLabels.title }}</strong>\n <div class=\"praxis-ai-assistant-shell__badges\" aria-hidden=\"true\">\n <span class=\"praxis-ai-assistant-shell__badge praxis-ai-assistant-shell__badge--context\">\n {{ getModeLabel() }}\n </span>\n <span\n class=\"praxis-ai-assistant-shell__badge praxis-ai-assistant-shell__badge--state\"\n [class.praxis-ai-assistant-shell__badge--error]=\"state === 'error'\"\n >\n <span class=\"praxis-ai-assistant-shell__state-dot\" aria-hidden=\"true\"></span>\n {{ getStateLabel() }}\n </span>\n </div>\n </div>\n @if (resolvedLabels.subtitle) {\n <p>{{ resolvedLabels.subtitle }}</p>\n }\n </div>\n <div class=\"praxis-ai-assistant-shell__header-actions\">\n <button\n mat-icon-button\n type=\"button\"\n [matTooltip]=\"resolvedLabels.close\"\n [attr.aria-label]=\"resolvedLabels.close\"\n (pointerdown)=\"$event.stopPropagation()\"\n (click)=\"close.emit()\"\n [attr.data-testid]=\"testIdPrefix + '-close'\"\n >\n <mat-icon>{{ getCloseIcon() }}</mat-icon>\n </button>\n </div>\n </header>\n\n <div class=\"praxis-ai-assistant-shell__body\">\n @if (contextItems.length) {\n <div\n class=\"praxis-ai-assistant-shell__context\"\n [attr.aria-label]=\"resolvedLabels.contextAria\"\n [attr.data-testid]=\"testIdPrefix + '-context'\"\n >\n @for (item of contextItems; track trackContextItem($index, item)) {\n <span\n class=\"praxis-ai-assistant-shell__context-item\"\n [attr.data-testid]=\"testIdPrefix + '-context-' + item.id\"\n >\n @if (item.icon) {\n <mat-icon aria-hidden=\"true\">{{ item.icon }}</mat-icon>\n }\n <span class=\"praxis-ai-assistant-shell__context-label\">{{ item.label }}</span>\n @if (item.value) {\n <span class=\"praxis-ai-assistant-shell__context-value\">{{ item.value }}</span>\n }\n </span>\n }\n </div>\n }\n\n @if (shouldShowRecommendedIntents()) {\n <section\n class=\"praxis-ai-assistant-shell__recommended\"\n [attr.aria-label]=\"resolvedLabels.recommendedIntentsAria\"\n [attr.data-testid]=\"testIdPrefix + '-recommended-intents'\"\n >\n <div class=\"praxis-ai-assistant-shell__recommended-header\">\n <mat-icon aria-hidden=\"true\">auto_awesome</mat-icon>\n <span>{{ resolvedLabels.recommendedIntentsTitle }}</span>\n </div>\n <div class=\"praxis-ai-assistant-shell__recommended-list\">\n @for (intent of recommendedIntents; track trackRecommendedIntent($index, intent)) {\n <button\n type=\"button\"\n class=\"praxis-ai-assistant-shell__recommended-intent\"\n [ngClass]=\"'praxis-ai-assistant-shell__recommended-intent--tone-' + getRecommendedIntentTone(intent)\"\n [attr.data-testid]=\"testIdPrefix + '-recommended-intent-' + intent.id\"\n [attr.aria-label]=\"getRecommendedIntentAriaLabel(intent)\"\n [disabled]=\"isRecommendedIntentDisabled(intent)\"\n (click)=\"onRecommendedIntent(intent)\"\n >\n <span class=\"praxis-ai-assistant-shell__recommended-icon\" aria-hidden=\"true\">\n <mat-icon>{{ getRecommendedIntentIcon(intent) }}</mat-icon>\n </span>\n <span class=\"praxis-ai-assistant-shell__recommended-copy\">\n <span class=\"praxis-ai-assistant-shell__recommended-title-row\">\n <span class=\"praxis-ai-assistant-shell__recommended-title\">{{ intent.label }}</span>\n @if (getRecommendedIntentGroupLabel(intent)) {\n <span class=\"praxis-ai-assistant-shell__recommended-group\">\n {{ getRecommendedIntentGroupLabel(intent) }}\n </span>\n }\n </span>\n @if (getRecommendedIntentDescription(intent)) {\n <span class=\"praxis-ai-assistant-shell__recommended-description\">\n {{ getRecommendedIntentDescription(intent) }}\n </span>\n }\n <span class=\"praxis-ai-assistant-shell__recommended-cta\">\n @if (intent.requiresConfirmation && !intent.disabledReason) {\n <span>{{ resolvedLabels.recommendedIntentRequiresConfirmation }}</span>\n }\n <span>{{ getRecommendedIntentCtaLabel(intent) }}</span>\n <mat-icon aria-hidden=\"true\">arrow_forward</mat-icon>\n </span>\n </span>\n </button>\n }\n </div>\n </section>\n }\n\n <div\n #conversation\n class=\"praxis-ai-assistant-shell__conversation\"\n [attr.data-testid]=\"testIdPrefix + '-conversation'\"\n [attr.aria-label]=\"resolvedLabels.conversationAria\"\n >\n @if (!messages.length) {\n <article\n class=\"praxis-ai-assistant-shell__message praxis-ai-assistant-shell__message--assistant\"\n [attr.data-testid]=\"testIdPrefix + '-message-assistant-empty'\"\n >\n {{ resolvedLabels.emptyConversation }}\n </article>\n }\n @for (message of messages; track trackMessage($index, message)) {\n <article\n class=\"praxis-ai-assistant-shell__message\"\n [class.praxis-ai-assistant-shell__message--user]=\"message.role === 'user'\"\n [class.praxis-ai-assistant-shell__message--assistant]=\"message.role === 'assistant'\"\n [class.praxis-ai-assistant-shell__message--status]=\"message.role === 'status'\"\n [class.praxis-ai-assistant-shell__message--error]=\"message.role === 'error'\"\n [attr.data-testid]=\"testIdPrefix + '-message-' + message.role\"\n >\n <div\n class=\"praxis-ai-assistant-shell__message-content\"\n [innerHTML]=\"renderMessageText(message.text)\"\n ></div>\n @if (message.actions?.length || message.editable || message.resendable) {\n <div\n class=\"praxis-ai-assistant-shell__message-actions\"\n >\n @if (message.editable) {\n <button\n mat-icon-button\n type=\"button\"\n class=\"praxis-ai-assistant-shell__message-action praxis-ai-assistant-shell__message-action--icon\"\n [disabled]=\"busy\"\n [matTooltip]=\"resolvedLabels.editMessage\"\n [attr.aria-label]=\"resolvedLabels.editMessage\"\n [attr.data-testid]=\"testIdPrefix + '-message-edit-' + message.id\"\n (click)=\"onMessageAction(message, { id: 'edit', label: resolvedLabels.editMessage, kind: 'edit' })\"\n >\n <mat-icon aria-hidden=\"true\">edit</mat-icon>\n </button>\n }\n @if (message.resendable) {\n <button\n mat-icon-button\n type=\"button\"\n class=\"praxis-ai-assistant-shell__message-action praxis-ai-assistant-shell__message-action--icon\"\n [disabled]=\"busy\"\n [matTooltip]=\"resolvedLabels.resendMessage\"\n [attr.aria-label]=\"resolvedLabels.resendMessage\"\n [attr.data-testid]=\"testIdPrefix + '-message-resend-' + message.id\"\n (click)=\"onMessageAction(message, { id: 'resend', label: resolvedLabels.resendMessage, kind: 'resend' })\"\n >\n <mat-icon aria-hidden=\"true\">replay</mat-icon>\n </button>\n }\n @for (action of message.actions || []; track trackMessageAction($index, action)) {\n @if (isMessageActionIconOnly(action)) {\n <button\n mat-icon-button\n type=\"button\"\n class=\"praxis-ai-assistant-shell__message-action praxis-ai-assistant-shell__message-action--icon\"\n [disabled]=\"busy || action.disabled\"\n [matTooltip]=\"getMessageActionLabel(action)\"\n [attr.aria-label]=\"getMessageActionLabel(action)\"\n [attr.data-testid]=\"testIdPrefix + '-message-action-' + message.id + '-' + action.id\"\n (click)=\"onMessageAction(message, action)\"\n >\n <mat-icon aria-hidden=\"true\">{{ getMessageActionIcon(action) }}</mat-icon>\n </button>\n } @else {\n <button\n mat-button\n type=\"button\"\n class=\"praxis-ai-assistant-shell__message-action\"\n [disabled]=\"busy || action.disabled\"\n [attr.aria-label]=\"getMessageActionLabel(action)\"\n [attr.data-testid]=\"testIdPrefix + '-message-action-' + message.id + '-' + action.id\"\n (click)=\"onMessageAction(message, action)\"\n >\n {{ action.label }}\n </button>\n }\n }\n </div>\n }\n @if (canSendMessageFeedback(message)) {\n <div class=\"praxis-ai-assistant-shell__message-feedback\">\n <button\n mat-icon-button\n type=\"button\"\n class=\"praxis-ai-assistant-shell__message-feedback-action\"\n [disabled]=\"busy\"\n [matTooltip]=\"resolvedLabels.feedbackPositive\"\n [attr.aria-label]=\"resolvedLabels.feedbackPositive\"\n [attr.data-testid]=\"testIdPrefix + '-message-feedback-positive-' + message.id\"\n (click)=\"sendMessageFeedback(message, 'positive')\"\n >\n <mat-icon aria-hidden=\"true\">thumb_up</mat-icon>\n </button>\n <button\n mat-icon-button\n type=\"button\"\n class=\"praxis-ai-assistant-shell__message-feedback-action\"\n [disabled]=\"busy\"\n [matTooltip]=\"resolvedLabels.feedbackNegative\"\n [attr.aria-label]=\"resolvedLabels.feedbackNegative\"\n [attr.data-testid]=\"testIdPrefix + '-message-feedback-negative-' + message.id\"\n (click)=\"sendMessageFeedback(message, 'negative')\"\n >\n <mat-icon aria-hidden=\"true\">thumb_down</mat-icon>\n </button>\n </div>\n } @else if (isMessageFeedbackSubmitted(message)) {\n <div\n class=\"praxis-ai-assistant-shell__message-feedback-submitted\"\n [attr.data-testid]=\"testIdPrefix + '-message-feedback-submitted-' + message.id\"\n >\n <mat-icon aria-hidden=\"true\">check</mat-icon>\n <span>{{ resolvedLabels.feedbackSubmitted }}</span>\n </div>\n }\n </article>\n }\n </div>\n\n @if (attachments.length) {\n <div\n class=\"praxis-ai-assistant-shell__attachments\"\n [attr.aria-label]=\"resolvedLabels.attachmentsAria\"\n [attr.data-testid]=\"testIdPrefix + '-attachments'\"\n >\n @for (attachment of attachments; track trackAttachment($index, attachment)) {\n <div\n class=\"praxis-ai-assistant-shell__attachment\"\n [class.praxis-ai-assistant-shell__attachment--error]=\"attachment.status === 'error'\"\n [attr.data-testid]=\"testIdPrefix + '-attachment-' + attachment.id\"\n >\n @if (attachment.previewUrl && attachment.kind === 'image') {\n <img\n class=\"praxis-ai-assistant-shell__attachment-preview\"\n [src]=\"attachment.previewUrl\"\n [alt]=\"attachment.name\"\n >\n }\n <span class=\"praxis-ai-assistant-shell__attachment-name\">{{ attachment.name }}</span>\n <span class=\"praxis-ai-assistant-shell__attachment-kind\">{{ attachment.kind }}</span>\n <button\n mat-icon-button\n type=\"button\"\n [disabled]=\"busy\"\n [matTooltip]=\"resolvedLabels.removeAttachment\"\n [attr.aria-label]=\"resolvedLabels.removeAttachment + ': ' + attachment.name\"\n [attr.data-testid]=\"testIdPrefix + '-attachment-remove-' + attachment.id\"\n (click)=\"onRemoveAttachment(attachment)\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </div>\n }\n </div>\n }\n\n @if (quickReplies.length) {\n <div\n class=\"praxis-ai-assistant-shell__quick-replies\"\n [class.praxis-ai-assistant-shell__quick-replies--inline]=\"shouldUseInlineQuickReplies()\"\n [attr.data-testid]=\"testIdPrefix + '-quick-replies'\"\n [attr.aria-label]=\"resolvedLabels.quickRepliesAria\"\n >\n @for (reply of quickReplies; track trackQuickReply($index, reply)) {\n <button\n mat-stroked-button\n type=\"button\"\n class=\"praxis-ai-assistant-shell__quick-reply\"\n [class.praxis-ai-assistant-shell__quick-reply--compact]=\"!isRichQuickReply(reply)\"\n [class.praxis-ai-assistant-shell__quick-reply--guided-action]=\"isGuidedActionQuickReply(reply)\"\n [class.praxis-ai-assistant-shell__quick-reply--contextual-action]=\"isContextualPreviewActionQuickReply(reply)\"\n [ngClass]=\"'praxis-ai-assistant-shell__quick-reply--tone-' + getQuickReplyTone(reply)\"\n [attr.data-testid]=\"testIdPrefix + '-quick-reply-' + (reply.id || reply.kind)\"\n [attr.aria-label]=\"getQuickReplyAriaLabel(reply)\"\n [disabled]=\"busy\"\n (click)=\"onQuickReply(reply)\"\n >\n <span class=\"praxis-ai-assistant-shell__quick-reply-ambient\" aria-hidden=\"true\"></span>\n <span class=\"praxis-ai-assistant-shell__quick-reply-icon-frame\" aria-hidden=\"true\">\n <mat-icon\n class=\"praxis-ai-assistant-shell__quick-reply-icon\"\n >\n {{ getQuickReplyIcon(reply) }}\n </mat-icon>\n </span>\n <span class=\"praxis-ai-assistant-shell__quick-reply-copy\">\n <span class=\"praxis-ai-assistant-shell__quick-reply-header\">\n <span class=\"praxis-ai-assistant-shell__quick-reply-heading\">\n <span class=\"praxis-ai-assistant-shell__quick-reply-label\">{{ reply.label }}</span>\n @if (getQuickReplyDescription(reply)) {\n <span\n class=\"praxis-ai-assistant-shell__quick-reply-description\"\n >\n {{ getQuickReplyDescription(reply) }}\n </span>\n }\n </span>\n <span class=\"praxis-ai-assistant-shell__quick-reply-actions\">\n <span class=\"praxis-ai-assistant-shell__quick-reply-badge\">\n {{ getQuickReplyCategoryLabel(reply) }}\n </span>\n @if (getQuickReplyTechnicalDetails(reply)) {\n <mat-icon\n class=\"praxis-ai-assistant-shell__quick-reply-details\"\n [matTooltip]=\"getQuickReplyTechnicalDetails(reply)\"\n [attr.aria-label]=\"resolvedLabels.quickReplyDetails\"\n >\n info\n </mat-icon>\n }\n </span>\n </span>\n @if (getQuickReplyContextChips(reply).length) {\n <span\n class=\"praxis-ai-assistant-shell__quick-reply-context\"\n >\n @for (chip of getQuickReplyContextChips(reply); track chip.ariaLabel + ':' + chip.value) {\n <span\n class=\"praxis-ai-assistant-shell__quick-reply-context-chip\"\n [attr.aria-label]=\"chip.ariaLabel\"\n >\n <mat-icon aria-hidden=\"true\">{{ chip.icon }}</mat-icon>\n <span>{{ chip.value }}</span>\n </span>\n }\n </span>\n }\n @if (getQuickReplyPresentationItems(reply).length) {\n <span\n class=\"praxis-ai-assistant-shell__quick-reply-insights\"\n >\n @for (item of getQuickReplyPresentationItems(reply); track item.key) {\n <span\n class=\"praxis-ai-assistant-shell__quick-reply-insight\"\n >\n <mat-icon aria-hidden=\"true\">{{ item.icon }}</mat-icon>\n <span class=\"praxis-ai-assistant-shell__quick-reply-insight-copy\">\n <span class=\"praxis-ai-assistant-shell__quick-reply-insight-label\">\n {{ item.label }}\n </span>\n <span class=\"praxis-ai-assistant-shell__quick-reply-insight-value\">\n {{ item.value }}\n </span>\n </span>\n </span>\n }\n </span>\n }\n <span class=\"praxis-ai-assistant-shell__quick-reply-cta\">\n {{ getQuickReplyCtaLabel(reply) }}\n <mat-icon aria-hidden=\"true\">arrow_forward</mat-icon>\n </span>\n </span>\n </button>\n }\n </div>\n }\n @if (shouldShowStatusText()) {\n <p\n class=\"praxis-ai-assistant-shell__status\"\n [attr.data-testid]=\"testIdPrefix + '-status'\"\n >\n {{ statusText }}\n </p>\n }\n @if (shouldShowErrorText()) {\n <p\n class=\"praxis-ai-assistant-shell__error\"\n [attr.data-testid]=\"testIdPrefix + '-error'\"\n >\n {{ errorText }}\n </p>\n }\n </div>\n\n <footer class=\"praxis-ai-assistant-shell__footer\">\n <label class=\"praxis-ai-assistant-shell__label\" for=\"praxis-ai-assistant-shell-prompt\">\n {{ resolvedLabels.prompt }}\n </label>\n <div class=\"praxis-ai-assistant-shell__composer\">\n <textarea\n id=\"praxis-ai-assistant-shell-prompt\"\n class=\"praxis-ai-assistant-shell__prompt\"\n [attr.data-testid]=\"testIdPrefix + '-prompt'\"\n [placeholder]=\"resolvedLabels.promptPlaceholder\"\n [ngModel]=\"currentPrompt\"\n [disabled]=\"busy\"\n (ngModelChange)=\"onPromptInput($event)\"\n (keydown)=\"onPromptKeydown($event)\"\n (paste)=\"onPromptPaste($event)\"\n ></textarea>\n <div class=\"praxis-ai-assistant-shell__composer-actions\">\n @if (shouldShowVoiceInput()) {\n <button\n mat-icon-button\n type=\"button\"\n class=\"praxis-ai-assistant-shell__voice-action\"\n [class.praxis-ai-assistant-shell__voice-action--active]=\"isVoiceInputBusy()\"\n [class.praxis-ai-assistant-shell__voice-action--error]=\"voiceCaptureState === 'error' || voiceCaptureState === 'unsupported'\"\n [disabled]=\"isVoiceInputDisabled()\"\n [matTooltip]=\"getVoiceActionLabel()\"\n [attr.aria-label]=\"getVoiceActionLabel()\"\n [attr.aria-pressed]=\"isVoiceInputBusy() ? 'true' : 'false'\"\n [attr.data-testid]=\"testIdPrefix + '-voice'\"\n (click)=\"onVoiceInputClick()\"\n >\n <mat-icon aria-hidden=\"true\">{{ isVoiceInputBusy() ? 'stop_circle' : 'mic' }}</mat-icon>\n </button>\n }\n @if (showAttachAction) {\n <input\n #attachmentInput\n type=\"file\"\n hidden\n [attr.accept]=\"attachmentAccept || null\"\n [attr.multiple]=\"attachmentMultiple ? '' : null\"\n [attr.data-testid]=\"testIdPrefix + '-attachment-input'\"\n (change)=\"onAttachmentFilesSelected($event)\"\n >\n <button\n mat-stroked-button\n type=\"button\"\n [disabled]=\"busy\"\n (click)=\"onAttachClick(attachmentInput)\"\n [attr.data-testid]=\"testIdPrefix + '-attach'\"\n >\n <mat-icon>attach_file</mat-icon>\n {{ resolvedLabels.attach }}\n </button>\n }\n <button\n mat-flat-button\n color=\"primary\"\n type=\"button\"\n class=\"praxis-ai-assistant-shell__action praxis-ai-assistant-shell__action--primary\"\n [class.praxis-ai-assistant-shell__action--icon-only]=\"getPrimaryAction().iconOnly\"\n [matTooltip]=\"getPrimaryActionTooltip(getPrimaryAction())\"\n [ngClass]=\"'praxis-ai-assistant-shell__action--tone-' + getShellActionTone(getPrimaryAction())\"\n [disabled]=\"isShellActionDisabled(getPrimaryAction())\"\n (click)=\"onShellAction(getPrimaryAction())\"\n [attr.data-testid]=\"getPrimaryAction().testId || (submitTestId || (testIdPrefix + '-submit'))\"\n [attr.aria-label]=\"getPrimaryAction().ariaLabel || getPrimaryAction().label\"\n >\n @if (getPrimaryAction().icon) {\n <mat-icon aria-hidden=\"true\">{{ getPrimaryAction().icon }}</mat-icon>\n }\n @if (!getPrimaryAction().iconOnly) {\n <span>{{ getPrimaryAction().label }}</span>\n }\n </button>\n @for (action of getSecondaryActions(); track trackShellAction($index, action)) {\n <button\n mat-button\n type=\"button\"\n class=\"praxis-ai-assistant-shell__action praxis-ai-assistant-shell__action--secondary\"\n [ngClass]=\"'praxis-ai-assistant-shell__action--tone-' + getShellActionTone(action)\"\n [disabled]=\"isShellActionDisabled(action)\"\n (click)=\"onShellAction(action)\"\n [attr.data-testid]=\"action.testId || (testIdPrefix + '-action-' + action.id)\"\n [attr.aria-label]=\"action.ariaLabel || action.label\"\n >\n @if (action.icon) {\n <mat-icon aria-hidden=\"true\">{{ action.icon }}</mat-icon>\n }\n {{ action.label }}\n </button>\n }\n @if (busy) {\n <mat-spinner diameter=\"20\" [attr.data-testid]=\"testIdPrefix + '-spinner'\"></mat-spinner>\n }\n </div>\n @if (shouldShowVoiceFeedback()) {\n <p\n class=\"praxis-ai-assistant-shell__voice-status\"\n aria-live=\"polite\"\n [attr.data-testid]=\"testIdPrefix + '-voice-status'\"\n >\n {{ voiceFeedbackText }}\n </p>\n }\n </div>\n </footer>\n\n @if (resizable) {\n @for (direction of resizeHandles; track trackResizeHandle($index, direction)) {\n <span\n class=\"praxis-ai-assistant-shell__resize-handle praxis-ai-assistant-shell__resize-handle--{{ direction }}\"\n [attr.data-testid]=\"direction === 'se' ? testIdPrefix + '-resize-handle' : testIdPrefix + '-resize-handle-' + direction\"\n aria-hidden=\"true\"\n role=\"presentation\"\n (pointerdown)=\"startResize(direction, $event)\"\n ></span>\n }\n }\n</section>\n", styles: [":host{display:block}.praxis-ai-assistant-shell{--praxis-ai-assistant-shell-shadow-color: var(--md-sys-color-shadow);--praxis-ai-assistant-shell-highlight-color: var(--md-sys-color-on-surface);--praxis-ai-assistant-shell-tone-analytics: var(--md-sys-color-primary);--praxis-ai-assistant-shell-tone-resource: var(--md-sys-color-tertiary);--praxis-ai-assistant-shell-tone-success: var(--md-sys-color-tertiary);--praxis-ai-assistant-shell-tone-warning: var(--md-sys-color-secondary);--praxis-ai-assistant-shell-tone-danger: var(--md-sys-color-error);--praxis-ai-assistant-shell-tone-neutral: var(--md-sys-color-outline);position:fixed;box-sizing:border-box;min-width:360px;min-height:360px;display:flex;flex-direction:column;overflow:hidden;color:var(--md-sys-color-on-surface);border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant) 70%,transparent);border-radius:8px;background:var(--md-sys-color-surface);box-shadow:0 24px 60px color-mix(in srgb,var(--praxis-ai-assistant-shell-shadow-color) 40%,transparent);z-index:var(--praxis-ai-assistant-shell-z-index, 1200)}.praxis-ai-assistant-shell__header{flex:0 0 auto;display:flex;align-items:flex-start;gap:9px;padding:10px 10px 9px;border-color:color-mix(in srgb,var(--md-sys-color-outline-variant) 72%,transparent);background:var(--md-sys-color-surface-container)}.praxis-ai-assistant-shell__header{justify-content:flex-start;border-bottom:1px solid;cursor:move;touch-action:none}.praxis-ai-assistant-shell__identity{flex:0 0 auto;display:grid;place-items:center;width:30px;height:30px;border-radius:8px;background:var(--md-sys-color-primary);color:var(--md-sys-color-on-primary);box-shadow:0 6px 16px color-mix(in srgb,var(--md-sys-color-primary) 22%,transparent)}.praxis-ai-assistant-shell__identity mat-icon{width:18px;height:18px;font-size:18px}.praxis-ai-assistant-shell__title-group{min-width:0;flex:1 1 auto;display:grid;gap:4px}.praxis-ai-assistant-shell__title-row{min-width:0;display:flex;align-items:center;gap:8px}.praxis-ai-assistant-shell__badges{flex:0 0 auto;display:flex;align-items:center;justify-content:flex-end;gap:4px;min-width:0;flex-wrap:wrap}.praxis-ai-assistant-shell__badge{display:inline-flex;align-items:center;gap:5px;min-height:20px;max-width:120px;padding:2px 7px;border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant) 80%,transparent);border-radius:8px;color:var(--md-sys-color-on-surface-variant);background:var(--md-sys-color-surface-container-high);font-size:11px;line-height:1.2;overflow-wrap:anywhere}.praxis-ai-assistant-shell__badge--context{color:var(--md-sys-color-on-surface);background:color-mix(in srgb,var(--md-sys-color-primary) 9%,var(--md-sys-color-surface-container-high))}.praxis-ai-assistant-shell__badge--state{border-color:transparent;background:transparent;color:var(--md-sys-color-on-surface-variant);padding-inline:3px}.praxis-ai-assistant-shell__badge--error{color:var(--md-sys-color-error);border-color:color-mix(in srgb,var(--md-sys-color-error) 60%,transparent)}.praxis-ai-assistant-shell__state-dot{flex:0 0 auto;width:6px;height:6px;border-radius:999px;background:var(--md-sys-color-primary);box-shadow:0 0 0 2px color-mix(in srgb,var(--md-sys-color-primary) 16%,transparent)}.praxis-ai-assistant-shell__badge--error .praxis-ai-assistant-shell__state-dot{background:var(--md-sys-color-error);box-shadow:0 0 0 2px color-mix(in srgb,var(--md-sys-color-error) 16%,transparent)}.praxis-ai-assistant-shell__title-group strong,.praxis-ai-assistant-shell__title-group p{min-width:0;margin:0;overflow-wrap:anywhere}.praxis-ai-assistant-shell__title-group strong{flex:1 1 auto;font-size:13px;line-height:1.2}.praxis-ai-assistant-shell__title-group p{color:var(--md-sys-color-on-surface-variant);font-size:11.5px;line-height:1.3}.praxis-ai-assistant-shell__header-actions{flex:0 0 auto;display:flex;align-items:center;gap:2px;margin-top:-3px}.praxis-ai-assistant-shell__header-actions button{display:inline-grid;place-items:center;width:34px;height:34px;padding:0;color:var(--md-sys-color-on-surface-variant);line-height:1;opacity:.78}.praxis-ai-assistant-shell__header-actions button:hover,.praxis-ai-assistant-shell__header-actions button:focus-visible{opacity:1}.praxis-ai-assistant-shell__header-actions mat-icon{display:block;width:18px;height:18px;font-size:18px;line-height:18px}.praxis-ai-assistant-shell__body{min-height:0;flex:1 1 auto;display:flex;flex-direction:column;gap:10px;padding:12px 12px 10px;overflow:auto;background:linear-gradient(180deg,var(--md-sys-color-surface-container-low),var(--md-sys-color-surface))}.praxis-ai-assistant-shell__context,.praxis-ai-assistant-shell__attachments{flex:0 0 auto;display:flex;align-items:center;gap:8px;overflow-x:auto}.praxis-ai-assistant-shell__context-item{flex:0 0 auto;display:inline-flex;align-items:center;gap:5px;max-width:240px;padding:5px 8px;border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant) 70%,transparent);border-radius:8px;background:var(--md-sys-color-surface-container-high);font-size:12px;line-height:1.25}.praxis-ai-assistant-shell__context-item mat-icon{width:16px;height:16px;font-size:16px}.praxis-ai-assistant-shell__context-label,.praxis-ai-assistant-shell__context-value{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.praxis-ai-assistant-shell__context-label{color:var(--md-sys-color-on-surface)}.praxis-ai-assistant-shell__context-value{color:var(--md-sys-color-on-surface-variant)}.praxis-ai-assistant-shell__label{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}.praxis-ai-assistant-shell__prompt{box-sizing:border-box;width:100%;min-height:46px;max-height:96px;resize:none;border:0;padding:10px 12px 8px;color:var(--md-sys-color-on-surface);background:transparent;font:inherit;line-height:1.45;outline:none}.praxis-ai-assistant-shell__recommended{flex:0 0 auto;display:grid;gap:8px}.praxis-ai-assistant-shell__recommended-header{display:inline-flex;align-items:center;gap:6px;color:var(--md-sys-color-on-surface-variant);font-size:12px;font-weight:600;line-height:1.25}.praxis-ai-assistant-shell__recommended-header mat-icon{width:16px;height:16px;color:var(--md-sys-color-primary);font-size:16px;line-height:16px}.praxis-ai-assistant-shell__recommended-list{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,210px),1fr));gap:8px}.praxis-ai-assistant-shell__recommended-intent{--praxis-ai-assistant-shell-recommended-accent: var(--praxis-ai-assistant-shell-tone-neutral);appearance:none;border:1px solid color-mix(in srgb,var(--praxis-ai-assistant-shell-recommended-accent) 34%,transparent);border-radius:8px;background:linear-gradient(180deg,color-mix(in srgb,var(--praxis-ai-assistant-shell-recommended-accent) 8%,transparent),transparent),var(--md-sys-color-surface-container-high);color:var(--md-sys-color-on-surface);cursor:pointer;display:flex;gap:9px;min-width:0;min-height:86px;padding:10px;text-align:left;transition:border-color .16s ease,box-shadow .16s ease,background-color .16s ease}.praxis-ai-assistant-shell__recommended-intent:hover:not(:disabled),.praxis-ai-assistant-shell__recommended-intent:focus-visible{border-color:color-mix(in srgb,var(--praxis-ai-assistant-shell-recommended-accent) 68%,transparent);box-shadow:0 0 0 3px color-mix(in srgb,var(--praxis-ai-assistant-shell-recommended-accent) 15%,transparent);outline:none}.praxis-ai-assistant-shell__recommended-intent:disabled{cursor:default;opacity:.62}.praxis-ai-assistant-shell__recommended-icon{flex:0 0 auto;display:grid;place-items:center;width:30px;height:30px;border:1px solid color-mix(in srgb,var(--praxis-ai-assistant-shell-recommended-accent) 28%,transparent);border-radius:8px;background:color-mix(in srgb,var(--praxis-ai-assistant-shell-recommended-accent) 12%,transparent);color:var(--praxis-ai-assistant-shell-recommended-accent)}.praxis-ai-assistant-shell__recommended-icon mat-icon{width:18px;height:18px;font-size:18px;line-height:18px}.praxis-ai-assistant-shell__recommended-copy{min-width:0;display:grid;gap:5px}.praxis-ai-assistant-shell__recommended-title-row{min-width:0;display:flex;align-items:flex-start;justify-content:space-between;gap:8px}.praxis-ai-assistant-shell__recommended-title,.praxis-ai-assistant-shell__recommended-description,.praxis-ai-assistant-shell__recommended-group{min-width:0;overflow-wrap:anywhere}.praxis-ai-assistant-shell__recommended-title{color:var(--md-sys-color-on-surface);font-size:13px;font-weight:700;line-height:1.25}.praxis-ai-assistant-shell__recommended-group{flex:0 1 auto;max-width:44%;border-radius:8px;padding:2px 6px;background:color-mix(in srgb,var(--praxis-ai-assistant-shell-recommended-accent) 10%,transparent);color:color-mix(in srgb,var(--praxis-ai-assistant-shell-recommended-accent) 84%,var(--praxis-ai-assistant-shell-highlight-color));font-size:10.5px;font-weight:700;line-height:1.25}.praxis-ai-assistant-shell__recommended-description{color:var(--md-sys-color-on-surface-variant);font-size:12px;line-height:1.35}.praxis-ai-assistant-shell__recommended-cta{display:inline-flex;align-items:center;gap:5px;flex-wrap:wrap;color:color-mix(in srgb,var(--praxis-ai-assistant-shell-recommended-accent) 84%,var(--praxis-ai-assistant-shell-highlight-color));font-size:11.5px;font-weight:700;line-height:1.25}.praxis-ai-assistant-shell__recommended-cta mat-icon{width:15px;height:15px;font-size:15px;line-height:15px}.praxis-ai-assistant-shell__recommended-intent--tone-analytics{--praxis-ai-assistant-shell-recommended-accent: var(--praxis-ai-assistant-shell-tone-analytics)}.praxis-ai-assistant-shell__recommended-intent--tone-resource{--praxis-ai-assistant-shell-recommended-accent: var(--praxis-ai-assistant-shell-tone-resource)}.praxis-ai-assistant-shell__recommended-intent--tone-success{--praxis-ai-assistant-shell-recommended-accent: var(--praxis-ai-assistant-shell-tone-success)}.praxis-ai-assistant-shell__recommended-intent--tone-warning{--praxis-ai-assistant-shell-recommended-accent: var(--praxis-ai-assistant-shell-tone-warning)}.praxis-ai-assistant-shell__recommended-intent--tone-danger{--praxis-ai-assistant-shell-recommended-accent: var(--praxis-ai-assistant-shell-tone-danger)}.praxis-ai-assistant-shell__recommended-intent--tone-neutral{--praxis-ai-assistant-shell-recommended-accent: var(--praxis-ai-assistant-shell-tone-neutral)}.praxis-ai-assistant-shell__conversation{min-height:0;flex:1 1 auto;display:flex;flex-direction:column;gap:8px;overflow:auto;padding:2px}.praxis-ai-assistant-shell__message{max-width:86%;align-self:flex-start;padding:9px 11px;border-radius:8px;background:var(--md-sys-color-surface-container-high);color:var(--md-sys-color-on-surface);font-size:13px;line-height:1.35;overflow-wrap:anywhere}.praxis-ai-assistant-shell__message-content{white-space:normal}.praxis-ai-assistant-shell__message-content :where(p,ul,h3,h4,h5){margin:0}.praxis-ai-assistant-shell__message-content :where(p,ul,h3,h4,h5)+:where(p,ul,h3,h4,h5){margin-top:8px}.praxis-ai-assistant-shell__message-content ul{padding-left:18px}.praxis-ai-assistant-shell__message-content li+li{margin-top:4px}.praxis-ai-assistant-shell__message-content code{padding:1px 4px;border-radius:4px;background:color-mix(in srgb,var(--md-sys-color-on-surface) 10%,transparent);font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:.94em}.praxis-ai-assistant-shell__message-actions{display:flex;align-items:center;gap:4px;flex-wrap:wrap;margin-top:8px}.praxis-ai-assistant-shell__message-action{min-height:28px;padding:0 8px;border-radius:8px;font-size:12px}.praxis-ai-assistant-shell__message-action--icon{width:30px;min-width:30px;height:30px;padding:0;color:var(--md-sys-color-on-surface-variant)}.praxis-ai-assistant-shell__message-action--icon mat-icon{width:17px;height:17px;font-size:17px}.praxis-ai-assistant-shell__message-feedback,.praxis-ai-assistant-shell__message-feedback-submitted{display:flex;align-items:center;gap:4px;margin-top:8px}.praxis-ai-assistant-shell__message-feedback-action{--mdc-icon-button-state-layer-size: 30px;--mat-icon-button-state-layer-size: 30px;display:inline-grid;place-items:center;width:30px;min-width:30px;height:30px;padding:0;color:var(--md-sys-color-on-surface-variant);line-height:1}.praxis-ai-assistant-shell__message-feedback-action mat-icon,.praxis-ai-assistant-shell__message-feedback-submitted mat-icon{display:block;width:17px;height:17px;font-size:17px;line-height:17px}.praxis-ai-assistant-shell__message-feedback-submitted{color:var(--md-sys-color-on-surface-variant);font-size:12px}.praxis-ai-assistant-shell__message--assistant{border-bottom-left-radius:2px}.praxis-ai-assistant-shell__message--user{align-self:flex-end;border-bottom-right-radius:2px;background:var(--md-sys-color-primary-container);color:var(--md-sys-color-on-primary-container)}.praxis-ai-assistant-shell__message--status{color:var(--md-sys-color-on-surface-variant)}.praxis-ai-assistant-shell__message--error,.praxis-ai-assistant-shell__error{color:var(--md-sys-color-error)}.praxis-ai-assistant-shell__quick-replies{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,520px),1fr));gap:8px;align-items:stretch;padding-bottom:4px}.praxis-ai-assistant-shell__quick-replies--inline{display:flex;flex-wrap:wrap;align-items:center;gap:6px}.praxis-ai-assistant-shell__attachment{flex:0 0 auto;display:inline-flex;align-items:center;gap:7px;max-width:260px;min-height:34px;padding:4px 4px 4px 8px;border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant) 70%,transparent);border-radius:8px;background:var(--md-sys-color-surface-container-high)}.praxis-ai-assistant-shell__attachment--error{border-color:color-mix(in srgb,var(--md-sys-color-error) 60%,transparent)}.praxis-ai-assistant-shell__attachment-preview{flex:0 0 auto;width:28px;height:28px;border-radius:6px;object-fit:cover}.praxis-ai-assistant-shell__attachment-name,.praxis-ai-assistant-shell__attachment-kind{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:12px}.praxis-ai-assistant-shell__attachment-name{color:var(--md-sys-color-on-surface)}.praxis-ai-assistant-shell__attachment-kind{color:var(--md-sys-color-on-surface-variant)}.praxis-ai-assistant-shell__quick-reply{--praxis-ai-assistant-shell-quick-reply-accent: var(--md-sys-color-primary);--praxis-ai-assistant-shell-quick-reply-background: color-mix( in srgb, var(--praxis-ai-assistant-shell-quick-reply-accent) 7%, var(--md-sys-color-surface-container-high) );--praxis-ai-assistant-shell-quick-reply-foreground: var(--md-sys-color-on-surface);width:100%;max-width:100%;height:auto;min-height:0;position:relative;overflow:hidden;padding:15px 16px;align-items:stretch;border-color:color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 36%,transparent);border-radius:22px;color:var(--praxis-ai-assistant-shell-quick-reply-foreground);background:linear-gradient(135deg,color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 16%,transparent),transparent 46%),radial-gradient(circle at 92% 10%,color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 22%,transparent),transparent 32%),var(--praxis-ai-assistant-shell-quick-reply-background);box-shadow:0 18px 42px color-mix(in srgb,var(--praxis-ai-assistant-shell-shadow-color) 22%,transparent),inset 0 1px color-mix(in srgb,var(--praxis-ai-assistant-shell-highlight-color) 16%,transparent);letter-spacing:normal;white-space:normal;text-align:left;text-transform:none;-webkit-user-select:none;user-select:none;transition:border-color .16s ease,box-shadow .16s ease,transform .16s ease,background .16s ease;--mdc-outlined-button-container-height: auto;--mat-outlined-button-horizontal-padding: 0}.praxis-ai-assistant-shell__quick-reply:hover:not(:disabled),.praxis-ai-assistant-shell__quick-reply:focus-visible{border-color:color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 74%,transparent);box-shadow:0 18px 42px color-mix(in srgb,var(--praxis-ai-assistant-shell-shadow-color) 24%,transparent),0 0 0 3px color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 18%,transparent),inset 0 1px color-mix(in srgb,var(--praxis-ai-assistant-shell-highlight-color) 18%,transparent);transform:translateY(-1px)}.praxis-ai-assistant-shell__quick-reply--contextual-action{padding:10px 12px;border-color:color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 34%,transparent);border-radius:8px;background:linear-gradient(90deg,color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 15%,transparent),color-mix(in srgb,var(--md-sys-color-surface-container-high) 92%,transparent)),var(--md-sys-color-surface-container-high);box-shadow:none}.praxis-ai-assistant-shell__quick-reply--guided-action{padding:10px 12px;border-color:color-mix(in srgb,var(--md-sys-color-outline-variant) 82%,transparent);border-radius:8px;background:var(--md-sys-color-surface-container-high);box-shadow:none}.praxis-ai-assistant-shell__quick-reply--contextual-action:hover:not(:disabled),.praxis-ai-assistant-shell__quick-reply--contextual-action:focus-visible{border-color:color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 62%,transparent);box-shadow:0 0 0 2px color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 15%,transparent);transform:none}.praxis-ai-assistant-shell__quick-reply--guided-action:hover:not(:disabled),.praxis-ai-assistant-shell__quick-reply--guided-action:focus-visible{border-color:color-mix(in srgb,var(--md-sys-color-primary) 64%,var(--md-sys-color-outline-variant));background:color-mix(in srgb,var(--md-sys-color-primary-container) 18%,var(--md-sys-color-surface-container-high));box-shadow:0 0 0 2px color-mix(in srgb,var(--md-sys-color-primary) 14%,transparent);transform:none}.praxis-ai-assistant-shell__quick-reply--contextual-action .praxis-ai-assistant-shell__quick-reply-ambient,.praxis-ai-assistant-shell__quick-reply--guided-action .praxis-ai-assistant-shell__quick-reply-ambient{display:none}.praxis-ai-assistant-shell__quick-reply--contextual-action ::ng-deep .mdc-button__label,.praxis-ai-assistant-shell__quick-reply--guided-action ::ng-deep .mdc-button__label{gap:10px}.praxis-ai-assistant-shell__quick-reply--contextual-action .praxis-ai-assistant-shell__quick-reply-icon-frame,.praxis-ai-assistant-shell__quick-reply--guided-action .praxis-ai-assistant-shell__quick-reply-icon-frame{width:34px;height:34px;border-radius:8px;box-shadow:none}.praxis-ai-assistant-shell__quick-reply--guided-action .praxis-ai-assistant-shell__quick-reply-icon-frame{border-color:color-mix(in srgb,var(--md-sys-color-primary) 24%,var(--md-sys-color-outline-variant));color:var(--md-sys-color-primary);background:color-mix(in srgb,var(--md-sys-color-primary-container) 34%,var(--md-sys-color-surface-container-high))}.praxis-ai-assistant-shell__quick-reply--contextual-action .praxis-ai-assistant-shell__quick-reply-icon,.praxis-ai-assistant-shell__quick-reply--guided-action .praxis-ai-assistant-shell__quick-reply-icon{width:19px;height:19px;font-size:19px}.praxis-ai-assistant-shell__quick-reply--contextual-action .praxis-ai-assistant-shell__quick-reply-copy,.praxis-ai-assistant-shell__quick-reply--guided-action .praxis-ai-assistant-shell__quick-reply-copy{gap:6px}.praxis-ai-assistant-shell__quick-reply--contextual-action .praxis-ai-assistant-shell__quick-reply-label,.praxis-ai-assistant-shell__quick-reply--guided-action .praxis-ai-assistant-shell__quick-reply-label{font-size:13.5px;font-weight:760;letter-spacing:0}.praxis-ai-assistant-shell__quick-reply--contextual-action .praxis-ai-assistant-shell__quick-reply-description,.praxis-ai-assistant-shell__quick-reply--guided-action .praxis-ai-assistant-shell__quick-reply-description{display:-webkit-box;overflow:hidden;font-size:12px;line-height:1.34;-webkit-box-orient:vertical;-webkit-line-clamp:2}.praxis-ai-assistant-shell__quick-reply--guided-action .praxis-ai-assistant-shell__quick-reply-description{color:var(--md-sys-color-on-surface-variant)}.praxis-ai-assistant-shell__quick-reply--contextual-action .praxis-ai-assistant-shell__quick-reply-badge,.praxis-ai-assistant-shell__quick-reply--guided-action .praxis-ai-assistant-shell__quick-reply-badge{border-radius:8px;font-size:10px;letter-spacing:0}.praxis-ai-assistant-shell__quick-reply--guided-action .praxis-ai-assistant-shell__quick-reply-badge{border-color:color-mix(in srgb,var(--md-sys-color-outline-variant) 76%,transparent);color:var(--md-sys-color-on-surface-variant);background:color-mix(in srgb,var(--md-sys-color-surface-container-lowest) 62%,transparent)}.praxis-ai-assistant-shell__quick-reply--guided-action .praxis-ai-assistant-shell__quick-reply-cta{color:var(--md-sys-color-primary)}.praxis-ai-assistant-shell__quick-reply--contextual-action .praxis-ai-assistant-shell__quick-reply-context-chip{border-radius:8px;padding:4px 7px;font-size:10.5px;font-weight:650}.praxis-ai-assistant-shell__quick-reply--contextual-action .praxis-ai-assistant-shell__quick-reply-cta,.praxis-ai-assistant-shell__quick-reply--guided-action .praxis-ai-assistant-shell__quick-reply-cta{font-size:11.5px}.praxis-ai-assistant-shell__quick-reply--compact{justify-self:start;width:fit-content;min-width:min(100%,210px);max-width:min(100%,320px);padding:9px 11px;border-radius:16px;background:linear-gradient(135deg,color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 10%,transparent),transparent 55%),var(--md-sys-color-surface-container-high);box-shadow:0 8px 18px color-mix(in srgb,var(--praxis-ai-assistant-shell-shadow-color) 16%,transparent),inset 0 1px color-mix(in srgb,var(--praxis-ai-assistant-shell-highlight-color) 10%,transparent)}.praxis-ai-assistant-shell__quick-reply.praxis-ai-assistant-shell__quick-reply--compact ::ng-deep .mdc-button__label{align-items:center;gap:10px}.praxis-ai-assistant-shell__quick-reply--compact .praxis-ai-assistant-shell__quick-reply-icon-frame{width:34px;height:34px;border-radius:12px}.praxis-ai-assistant-shell__quick-reply--compact .praxis-ai-assistant-shell__quick-reply-icon{width:19px;height:19px;font-size:19px}.praxis-ai-assistant-shell__quick-reply--compact .praxis-ai-assistant-shell__quick-reply-copy{gap:4px}.praxis-ai-assistant-shell__quick-reply--compact .praxis-ai-assistant-shell__quick-reply-header{align-items:center}.praxis-ai-assistant-shell__quick-reply--compact .praxis-ai-assistant-shell__quick-reply-label{font-size:13px;line-height:1.2}.praxis-ai-assistant-shell__quick-reply--compact .praxis-ai-assistant-shell__quick-reply-badge,.praxis-ai-assistant-shell__quick-reply--compact .praxis-ai-assistant-shell__quick-reply-cta{display:none}.praxis-ai-assistant-shell__quick-replies--inline .praxis-ai-assistant-shell__quick-reply{width:auto;min-width:0;max-width:100%;padding:6px 10px;border-radius:999px;box-shadow:none}.praxis-ai-assistant-shell__quick-replies--inline .praxis-ai-assistant-shell__quick-reply--guided-action{border-color:color-mix(in srgb,var(--md-sys-color-outline-variant) 76%,transparent);background:color-mix(in srgb,var(--md-sys-color-surface-container-high) 96%,transparent)}.praxis-ai-assistant-shell__quick-replies--inline .praxis-ai-assistant-shell__quick-reply--guided-action:hover:not(:disabled),.praxis-ai-assistant-shell__quick-replies--inline .praxis-ai-assistant-shell__quick-reply--guided-action:focus-visible{border-color:color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 52%,transparent);background:color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 9%,var(--md-sys-color-surface-container-high));box-shadow:0 0 0 2px color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 12%,transparent)}.praxis-ai-assistant-shell__quick-replies--inline .praxis-ai-assistant-shell__quick-reply ::ng-deep .mdc-button__label{display:inline-flex;grid-template-columns:none;align-items:center;gap:6px;width:auto}.praxis-ai-assistant-shell__quick-replies--inline .praxis-ai-assistant-shell__quick-reply ::ng-deep .mat-mdc-button-touch-target{min-height:34px}.praxis-ai-assistant-shell__quick-replies--inline .praxis-ai-assistant-shell__quick-reply-icon-frame{width:18px;height:18px;border:0;border-radius:0;background:transparent;box-shadow:none}.praxis-ai-assistant-shell__quick-replies--inline .praxis-ai-assistant-shell__quick-reply-icon{width:16px;height:16px;color:var(--praxis-ai-assistant-shell-quick-reply-accent);font-size:16px}.praxis-ai-assistant-shell__quick-replies--inline .praxis-ai-assistant-shell__quick-reply-copy,.praxis-ai-assistant-shell__quick-replies--inline .praxis-ai-assistant-shell__quick-reply-heading,.praxis-ai-assistant-shell__quick-replies--inline .praxis-ai-assistant-shell__quick-reply-header{display:inline-flex;align-items:center;gap:0}.praxis-ai-assistant-shell__quick-replies--inline .praxis-ai-assistant-shell__quick-reply-label{color:var(--md-sys-color-on-surface);font-size:12.5px;font-weight:650;line-height:1.2;white-space:nowrap}.praxis-ai-assistant-shell__quick-replies--inline .praxis-ai-assistant-shell__quick-reply-description,.praxis-ai-assistant-shell__quick-replies--inline .praxis-ai-assistant-shell__quick-reply-actions,.praxis-ai-assistant-shell__quick-replies--inline .praxis-ai-assistant-shell__quick-reply-badge,.praxis-ai-assistant-shell__quick-replies--inline .praxis-ai-assistant-shell__quick-reply-cta{display:none}.praxis-ai-assistant-shell__quick-reply ::ng-deep .mdc-button__label{position:relative;z-index:1;min-width:0;display:grid;grid-template-columns:auto minmax(0,1fr);align-items:flex-start;gap:14px;width:100%;height:auto;line-height:normal}.praxis-ai-assistant-shell__quick-reply-ambient{position:absolute;inset:0;pointer-events:none}.praxis-ai-assistant-shell__quick-reply-ambient:before{content:\"\";position:absolute;inset:0 18px auto;height:1px;border-radius:999px;background:linear-gradient(90deg,transparent,color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 90%,var(--praxis-ai-assistant-shell-highlight-color)),transparent);opacity:.58}.praxis-ai-assistant-shell__quick-reply-ambient:after{content:\"\";position:absolute;top:-34px;right:-44px;width:150px;height:150px;border-radius:999px;background:color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 13%,transparent);filter:blur(18px)}.praxis-ai-assistant-shell__quick-reply ::ng-deep .mat-mdc-button-touch-target{height:100%;min-height:48px}.praxis-ai-assistant-shell__quick-reply-icon-frame{flex:0 0 auto;width:46px;height:46px;display:inline-grid;place-items:center;border:1px solid color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 34%,transparent);border-radius:17px;color:var(--praxis-ai-assistant-shell-quick-reply-accent);background:linear-gradient(145deg,color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 24%,transparent),color-mix(in srgb,var(--praxis-ai-assistant-shell-highlight-color) 6%,transparent));box-shadow:inset 0 1px color-mix(in srgb,var(--praxis-ai-assistant-shell-highlight-color) 18%,transparent),0 10px 24px color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 12%,transparent)}.praxis-ai-assistant-shell__quick-reply-icon{width:24px;height:24px;font-size:24px}.praxis-ai-assistant-shell__quick-reply-details{flex:0 0 auto;width:24px;height:24px;display:inline-grid;place-items:center;border:1px solid color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 14%,transparent);border-radius:50%;color:var(--md-sys-color-on-surface-variant);background:color-mix(in srgb,var(--md-sys-color-outline) 14%,transparent);font-size:17px;opacity:.9}.praxis-ai-assistant-shell__quick-reply-copy{min-width:0;display:grid;gap:10px;flex:1 1 auto}.praxis-ai-assistant-shell__quick-reply-header{min-width:0;display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.praxis-ai-assistant-shell__quick-reply-heading{min-width:0;display:grid;gap:5px}.praxis-ai-assistant-shell__quick-reply-actions{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:flex-end;gap:7px;max-width:46%}.praxis-ai-assistant-shell__quick-reply-label,.praxis-ai-assistant-shell__quick-reply-description{min-width:0;overflow-wrap:anywhere}.praxis-ai-assistant-shell__quick-reply-label{color:var(--md-sys-color-on-surface);font-size:17px;font-weight:760;letter-spacing:.005em;line-height:1.18;text-transform:none}.praxis-ai-assistant-shell__quick-reply-badge{flex:0 0 auto;max-width:100%;padding:4px 8px;border:1px solid color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 28%,transparent);border-radius:999px;color:color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 86%,var(--praxis-ai-assistant-shell-highlight-color));background:color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 11%,transparent);font-size:10.5px;font-weight:700;letter-spacing:.02em;line-height:1.1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.praxis-ai-assistant-shell__quick-reply-description{color:color-mix(in srgb,var(--md-sys-color-on-surface) 80%,transparent);font-size:13px;line-height:1.46}.praxis-ai-assistant-shell__quick-reply-context{display:flex;flex-wrap:wrap;gap:7px;align-items:center}.praxis-ai-assistant-shell__quick-reply-context-chip{min-width:0;display:inline-flex;align-items:center;gap:4px;max-width:100%;padding:5px 8px;border:1px solid color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 22%,transparent);border-radius:999px;color:color-mix(in srgb,var(--md-sys-color-on-surface) 82%,transparent);background:color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 9%,transparent);font-size:11px;font-weight:650;line-height:1.15}.praxis-ai-assistant-shell__quick-reply-context-chip mat-icon{width:14px;height:14px;color:var(--praxis-ai-assistant-shell-quick-reply-accent);font-size:14px}.praxis-ai-assistant-shell__quick-reply-context-chip span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.praxis-ai-assistant-shell__quick-reply-insights{display:grid;grid-template-columns:repeat(auto-fit,minmax(145px,1fr));gap:8px;padding:8px;border:1px solid color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 16%,transparent);border-radius:16px;background:linear-gradient(180deg,color-mix(in srgb,var(--praxis-ai-assistant-shell-highlight-color) 5%,transparent),color-mix(in srgb,var(--md-sys-color-surface-container-lowest) 26%,transparent))}.praxis-ai-assistant-shell__quick-reply-insight{min-width:0;display:grid;grid-template-columns:20px minmax(0,1fr);gap:8px;align-items:start;padding:8px;border:1px solid color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 10%,transparent);border-radius:13px;color:color-mix(in srgb,var(--md-sys-color-on-surface) 86%,transparent);background:color-mix(in srgb,var(--md-sys-color-surface-container-high) 44%,transparent);font-size:12px;line-height:1.35}.praxis-ai-assistant-shell__quick-reply-insight mat-icon{width:17px;height:17px;color:var(--praxis-ai-assistant-shell-quick-reply-accent);font-size:17px;opacity:.9}.praxis-ai-assistant-shell__quick-reply-insight-copy{min-width:0;display:grid;gap:1px}.praxis-ai-assistant-shell__quick-reply-insight-label{color:color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 82%,var(--praxis-ai-assistant-shell-highlight-color));font-size:10.5px;font-weight:760;letter-spacing:.045em;line-height:1.2;text-transform:uppercase}.praxis-ai-assistant-shell__quick-reply-insight-value{min-width:0;overflow-wrap:anywhere}.praxis-ai-assistant-shell__quick-reply-cta{display:inline-flex;align-items:center;justify-self:start;gap:5px;padding:3px 0;color:color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 84%,var(--praxis-ai-assistant-shell-highlight-color));font-size:12px;font-weight:760;letter-spacing:.01em;line-height:1.2}.praxis-ai-assistant-shell__quick-reply-cta mat-icon{width:15px;height:15px;font-size:15px;transition:transform .16s ease}.praxis-ai-assistant-shell__quick-reply:hover:not(:disabled) .praxis-ai-assistant-shell__quick-reply-cta mat-icon,.praxis-ai-assistant-shell__quick-reply:focus-visible .praxis-ai-assistant-shell__quick-reply-cta mat-icon{transform:translate(2px)}.praxis-ai-assistant-shell__quick-reply--tone-analytics{--praxis-ai-assistant-shell-quick-reply-accent: var(--praxis-ai-assistant-shell-tone-analytics)}.praxis-ai-assistant-shell__quick-reply--tone-resource{--praxis-ai-assistant-shell-quick-reply-accent: var(--praxis-ai-assistant-shell-tone-resource)}.praxis-ai-assistant-shell__quick-reply--tone-warning{--praxis-ai-assistant-shell-quick-reply-accent: var(--praxis-ai-assistant-shell-tone-warning)}.praxis-ai-assistant-shell__quick-reply--tone-success{--praxis-ai-assistant-shell-quick-reply-accent: var(--praxis-ai-assistant-shell-tone-success)}.praxis-ai-assistant-shell__quick-reply--tone-danger{--praxis-ai-assistant-shell-quick-reply-accent: var(--praxis-ai-assistant-shell-tone-danger)}.praxis-ai-assistant-shell__quick-reply--tone-neutral{--praxis-ai-assistant-shell-quick-reply-accent: var(--praxis-ai-assistant-shell-tone-neutral)}@media(max-width:640px){.praxis-ai-assistant-shell__quick-reply{padding:13px;border-radius:19px}.praxis-ai-assistant-shell__quick-reply ::ng-deep .mdc-button__label{grid-template-columns:minmax(0,1fr);gap:10px}.praxis-ai-assistant-shell__quick-reply-icon-frame{width:38px;height:38px;border-radius:14px}.praxis-ai-assistant-shell__quick-reply-header{display:grid}.praxis-ai-assistant-shell__quick-reply-actions{justify-content:flex-start;max-width:100%}.praxis-ai-assistant-shell__quick-reply-insights{grid-template-columns:minmax(0,1fr)}}.praxis-ai-assistant-shell__status,.praxis-ai-assistant-shell__error{margin:0;font-size:13px;line-height:1.35;overflow-wrap:anywhere}.praxis-ai-assistant-shell__footer{flex:0 0 auto;padding:8px 10px 10px;border-top:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant) 72%,transparent);background:var(--md-sys-color-surface-container-low)}.praxis-ai-assistant-shell__composer{display:grid;gap:8px;border:1px solid var(--md-sys-color-outline-variant);border-radius:8px;background:var(--md-sys-color-surface-container-lowest);box-shadow:inset 0 1px color-mix(in srgb,var(--praxis-ai-assistant-shell-highlight-color) 4%,transparent)}.praxis-ai-assistant-shell__composer:focus-within{border-color:var(--md-sys-color-primary);box-shadow:0 0 0 2px color-mix(in srgb,var(--md-sys-color-primary) 16%,transparent)}.praxis-ai-assistant-shell__composer-actions{display:flex;align-items:center;justify-content:flex-end;gap:8px;padding:0 8px 7px;flex-wrap:wrap}.praxis-ai-assistant-shell__voice-action{color:var(--md-sys-color-on-surface-variant)}.praxis-ai-assistant-shell__voice-action--active{color:var(--md-sys-color-error);background:color-mix(in srgb,var(--md-sys-color-error) 10%,transparent)}.praxis-ai-assistant-shell__voice-action--error{color:var(--praxis-ai-assistant-shell-tone-warning)}.praxis-ai-assistant-shell__voice-status{margin:-2px 10px 8px;color:var(--md-sys-color-on-surface-variant);font-size:12px;line-height:1.3}.praxis-ai-assistant-shell__action{min-height:36px;border-radius:10px;font-weight:650}.praxis-ai-assistant-shell__action mat-icon{width:18px;height:18px;margin-right:6px;font-size:18px}.praxis-ai-assistant-shell__action--icon-only{width:40px;min-width:40px;height:40px;padding-inline:0;border-radius:50%}.praxis-ai-assistant-shell__action--icon-only mat-icon{margin-right:0}.praxis-ai-assistant-shell__action--secondary{color:var(--md-sys-color-on-surface-variant)}.praxis-ai-assistant-shell__action--tone-governance{color:var(--md-sys-color-primary);background:color-mix(in srgb,var(--md-sys-color-primary) 10%,transparent)}.praxis-ai-assistant-shell__action--tone-success{color:var(--praxis-ai-assistant-shell-tone-success);background:color-mix(in srgb,var(--praxis-ai-assistant-shell-tone-success) 10%,transparent)}.praxis-ai-assistant-shell__action--tone-warning{color:var(--praxis-ai-assistant-shell-tone-warning);background:color-mix(in srgb,var(--praxis-ai-assistant-shell-tone-warning) 10%,transparent)}.praxis-ai-assistant-shell__action--tone-danger{color:var(--md-sys-color-error);background:color-mix(in srgb,var(--md-sys-color-error) 10%,transparent)}.praxis-ai-assistant-shell__resize-handle{position:absolute;z-index:2;border:0;background:transparent;touch-action:none}.praxis-ai-assistant-shell__resize-handle--n,.praxis-ai-assistant-shell__resize-handle--s{left:16px;right:16px;height:10px;cursor:ns-resize}.praxis-ai-assistant-shell__resize-handle--n{top:-5px}.praxis-ai-assistant-shell__resize-handle--s{bottom:-5px}.praxis-ai-assistant-shell__resize-handle--e,.praxis-ai-assistant-shell__resize-handle--w{top:16px;bottom:16px;width:10px;cursor:ew-resize}.praxis-ai-assistant-shell__resize-handle--e{right:-5px}.praxis-ai-assistant-shell__resize-handle--w{left:-5px}.praxis-ai-assistant-shell__resize-handle--ne,.praxis-ai-assistant-shell__resize-handle--nw,.praxis-ai-assistant-shell__resize-handle--se,.praxis-ai-assistant-shell__resize-handle--sw{width:22px;height:22px}.praxis-ai-assistant-shell__resize-handle--ne{top:-5px;right:-5px;cursor:nesw-resize}.praxis-ai-assistant-shell__resize-handle--nw{top:-5px;left:-5px;cursor:nwse-resize}.praxis-ai-assistant-shell__resize-handle--se{right:-5px;bottom:-5px;cursor:nwse-resize}.praxis-ai-assistant-shell__resize-handle--sw{bottom:-5px;left:-5px;cursor:nesw-resize}.praxis-ai-assistant-shell__resize-handle--se:after{content:\"\";position:absolute;right:8px;bottom:8px;width:10px;height:10px;border-right:2px solid var(--md-sys-color-outline);border-bottom:2px solid var(--md-sys-color-outline)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i1.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i7.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i8.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
8102
8440
  }
8103
8441
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisAiAssistantShellComponent, decorators: [{
8104
8442
  type: Component,
@@ -8109,7 +8447,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
8109
8447
  MatIconModule,
8110
8448
  MatProgressSpinnerModule,
8111
8449
  MatTooltipModule,
8112
- ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<section\n #panel\n class=\"praxis-ai-assistant-shell\"\n role=\"dialog\"\n [attr.aria-label]=\"resolvedLabels.title\"\n [attr.aria-busy]=\"busy ? 'true' : null\"\n [style.left.px]=\"currentLayout.left\"\n [style.top.px]=\"currentLayout.top\"\n [style.width.px]=\"currentLayout.width\"\n [style.height.px]=\"currentLayout.height\"\n [attr.data-testid]=\"panelTestId || testIdPrefix\"\n >\n <header\n class=\"praxis-ai-assistant-shell__header\"\n [attr.data-testid]=\"testIdPrefix + '-drag-handle'\"\n [attr.aria-label]=\"resolvedLabels.dragHandleAria\"\n (pointerdown)=\"startDrag($event)\"\n >\n <div class=\"praxis-ai-assistant-shell__identity\" aria-hidden=\"true\">\n <mat-icon>auto_awesome</mat-icon>\n </div>\n <div class=\"praxis-ai-assistant-shell__title-group\">\n <div class=\"praxis-ai-assistant-shell__title-row\">\n <strong>{{ resolvedLabels.title }}</strong>\n <div class=\"praxis-ai-assistant-shell__badges\" aria-hidden=\"true\">\n <span class=\"praxis-ai-assistant-shell__badge praxis-ai-assistant-shell__badge--context\">\n {{ getModeLabel() }}\n </span>\n <span\n class=\"praxis-ai-assistant-shell__badge praxis-ai-assistant-shell__badge--state\"\n [class.praxis-ai-assistant-shell__badge--error]=\"state === 'error'\"\n >\n <span class=\"praxis-ai-assistant-shell__state-dot\" aria-hidden=\"true\"></span>\n {{ getStateLabel() }}\n </span>\n </div>\n </div>\n @if (resolvedLabels.subtitle) {\n <p>{{ resolvedLabels.subtitle }}</p>\n }\n </div>\n <div class=\"praxis-ai-assistant-shell__header-actions\">\n <button\n mat-icon-button\n type=\"button\"\n [matTooltip]=\"resolvedLabels.close\"\n [attr.aria-label]=\"resolvedLabels.close\"\n (pointerdown)=\"$event.stopPropagation()\"\n (click)=\"close.emit()\"\n [attr.data-testid]=\"testIdPrefix + '-close'\"\n >\n <mat-icon>{{ getCloseIcon() }}</mat-icon>\n </button>\n </div>\n </header>\n\n <div class=\"praxis-ai-assistant-shell__body\">\n @if (contextItems.length) {\n <div\n class=\"praxis-ai-assistant-shell__context\"\n [attr.aria-label]=\"resolvedLabels.contextAria\"\n [attr.data-testid]=\"testIdPrefix + '-context'\"\n >\n @for (item of contextItems; track trackContextItem($index, item)) {\n <span\n class=\"praxis-ai-assistant-shell__context-item\"\n [attr.data-testid]=\"testIdPrefix + '-context-' + item.id\"\n >\n @if (item.icon) {\n <mat-icon aria-hidden=\"true\">{{ item.icon }}</mat-icon>\n }\n <span class=\"praxis-ai-assistant-shell__context-label\">{{ item.label }}</span>\n @if (item.value) {\n <span class=\"praxis-ai-assistant-shell__context-value\">{{ item.value }}</span>\n }\n </span>\n }\n </div>\n }\n\n <div\n #conversation\n class=\"praxis-ai-assistant-shell__conversation\"\n [attr.data-testid]=\"testIdPrefix + '-conversation'\"\n [attr.aria-label]=\"resolvedLabels.conversationAria\"\n >\n @if (!messages.length) {\n <article\n class=\"praxis-ai-assistant-shell__message praxis-ai-assistant-shell__message--assistant\"\n [attr.data-testid]=\"testIdPrefix + '-message-assistant-empty'\"\n >\n {{ resolvedLabels.emptyConversation }}\n </article>\n }\n @for (message of messages; track trackMessage($index, message)) {\n <article\n class=\"praxis-ai-assistant-shell__message\"\n [class.praxis-ai-assistant-shell__message--user]=\"message.role === 'user'\"\n [class.praxis-ai-assistant-shell__message--assistant]=\"message.role === 'assistant'\"\n [class.praxis-ai-assistant-shell__message--status]=\"message.role === 'status'\"\n [class.praxis-ai-assistant-shell__message--error]=\"message.role === 'error'\"\n [attr.data-testid]=\"testIdPrefix + '-message-' + message.role\"\n >\n <div\n class=\"praxis-ai-assistant-shell__message-content\"\n [innerHTML]=\"renderMessageText(message.text)\"\n ></div>\n @if (message.actions?.length || message.editable || message.resendable) {\n <div\n class=\"praxis-ai-assistant-shell__message-actions\"\n >\n @if (message.editable) {\n <button\n mat-icon-button\n type=\"button\"\n class=\"praxis-ai-assistant-shell__message-action praxis-ai-assistant-shell__message-action--icon\"\n [disabled]=\"busy\"\n [matTooltip]=\"resolvedLabels.editMessage\"\n [attr.aria-label]=\"resolvedLabels.editMessage\"\n [attr.data-testid]=\"testIdPrefix + '-message-edit-' + message.id\"\n (click)=\"onMessageAction(message, { id: 'edit', label: resolvedLabels.editMessage, kind: 'edit' })\"\n >\n <mat-icon aria-hidden=\"true\">edit</mat-icon>\n </button>\n }\n @if (message.resendable) {\n <button\n mat-icon-button\n type=\"button\"\n class=\"praxis-ai-assistant-shell__message-action praxis-ai-assistant-shell__message-action--icon\"\n [disabled]=\"busy\"\n [matTooltip]=\"resolvedLabels.resendMessage\"\n [attr.aria-label]=\"resolvedLabels.resendMessage\"\n [attr.data-testid]=\"testIdPrefix + '-message-resend-' + message.id\"\n (click)=\"onMessageAction(message, { id: 'resend', label: resolvedLabels.resendMessage, kind: 'resend' })\"\n >\n <mat-icon aria-hidden=\"true\">replay</mat-icon>\n </button>\n }\n @for (action of message.actions || []; track trackMessageAction($index, action)) {\n @if (isMessageActionIconOnly(action)) {\n <button\n mat-icon-button\n type=\"button\"\n class=\"praxis-ai-assistant-shell__message-action praxis-ai-assistant-shell__message-action--icon\"\n [disabled]=\"busy || action.disabled\"\n [matTooltip]=\"getMessageActionLabel(action)\"\n [attr.aria-label]=\"getMessageActionLabel(action)\"\n [attr.data-testid]=\"testIdPrefix + '-message-action-' + message.id + '-' + action.id\"\n (click)=\"onMessageAction(message, action)\"\n >\n <mat-icon aria-hidden=\"true\">{{ getMessageActionIcon(action) }}</mat-icon>\n </button>\n } @else {\n <button\n mat-button\n type=\"button\"\n class=\"praxis-ai-assistant-shell__message-action\"\n [disabled]=\"busy || action.disabled\"\n [attr.aria-label]=\"getMessageActionLabel(action)\"\n [attr.data-testid]=\"testIdPrefix + '-message-action-' + message.id + '-' + action.id\"\n (click)=\"onMessageAction(message, action)\"\n >\n {{ action.label }}\n </button>\n }\n }\n </div>\n }\n @if (canSendMessageFeedback(message)) {\n <div class=\"praxis-ai-assistant-shell__message-feedback\">\n <button\n mat-icon-button\n type=\"button\"\n class=\"praxis-ai-assistant-shell__message-feedback-action\"\n [disabled]=\"busy\"\n [matTooltip]=\"resolvedLabels.feedbackPositive\"\n [attr.aria-label]=\"resolvedLabels.feedbackPositive\"\n [attr.data-testid]=\"testIdPrefix + '-message-feedback-positive-' + message.id\"\n (click)=\"sendMessageFeedback(message, 'positive')\"\n >\n <mat-icon aria-hidden=\"true\">thumb_up</mat-icon>\n </button>\n <button\n mat-icon-button\n type=\"button\"\n class=\"praxis-ai-assistant-shell__message-feedback-action\"\n [disabled]=\"busy\"\n [matTooltip]=\"resolvedLabels.feedbackNegative\"\n [attr.aria-label]=\"resolvedLabels.feedbackNegative\"\n [attr.data-testid]=\"testIdPrefix + '-message-feedback-negative-' + message.id\"\n (click)=\"sendMessageFeedback(message, 'negative')\"\n >\n <mat-icon aria-hidden=\"true\">thumb_down</mat-icon>\n </button>\n </div>\n } @else if (isMessageFeedbackSubmitted(message)) {\n <div\n class=\"praxis-ai-assistant-shell__message-feedback-submitted\"\n [attr.data-testid]=\"testIdPrefix + '-message-feedback-submitted-' + message.id\"\n >\n <mat-icon aria-hidden=\"true\">check</mat-icon>\n <span>{{ resolvedLabels.feedbackSubmitted }}</span>\n </div>\n }\n </article>\n }\n </div>\n\n @if (attachments.length) {\n <div\n class=\"praxis-ai-assistant-shell__attachments\"\n [attr.aria-label]=\"resolvedLabels.attachmentsAria\"\n [attr.data-testid]=\"testIdPrefix + '-attachments'\"\n >\n @for (attachment of attachments; track trackAttachment($index, attachment)) {\n <div\n class=\"praxis-ai-assistant-shell__attachment\"\n [class.praxis-ai-assistant-shell__attachment--error]=\"attachment.status === 'error'\"\n [attr.data-testid]=\"testIdPrefix + '-attachment-' + attachment.id\"\n >\n @if (attachment.previewUrl && attachment.kind === 'image') {\n <img\n class=\"praxis-ai-assistant-shell__attachment-preview\"\n [src]=\"attachment.previewUrl\"\n [alt]=\"attachment.name\"\n >\n }\n <span class=\"praxis-ai-assistant-shell__attachment-name\">{{ attachment.name }}</span>\n <span class=\"praxis-ai-assistant-shell__attachment-kind\">{{ attachment.kind }}</span>\n <button\n mat-icon-button\n type=\"button\"\n [disabled]=\"busy\"\n [matTooltip]=\"resolvedLabels.removeAttachment\"\n [attr.aria-label]=\"resolvedLabels.removeAttachment + ': ' + attachment.name\"\n [attr.data-testid]=\"testIdPrefix + '-attachment-remove-' + attachment.id\"\n (click)=\"onRemoveAttachment(attachment)\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </div>\n }\n </div>\n }\n\n @if (quickReplies.length) {\n <div\n class=\"praxis-ai-assistant-shell__quick-replies\"\n [class.praxis-ai-assistant-shell__quick-replies--inline]=\"shouldUseInlineQuickReplies()\"\n [attr.data-testid]=\"testIdPrefix + '-quick-replies'\"\n [attr.aria-label]=\"resolvedLabels.quickRepliesAria\"\n >\n @for (reply of quickReplies; track trackQuickReply($index, reply)) {\n <button\n mat-stroked-button\n type=\"button\"\n class=\"praxis-ai-assistant-shell__quick-reply\"\n [class.praxis-ai-assistant-shell__quick-reply--compact]=\"!isRichQuickReply(reply)\"\n [class.praxis-ai-assistant-shell__quick-reply--guided-action]=\"isGuidedActionQuickReply(reply)\"\n [class.praxis-ai-assistant-shell__quick-reply--contextual-action]=\"isContextualPreviewActionQuickReply(reply)\"\n [ngClass]=\"'praxis-ai-assistant-shell__quick-reply--tone-' + getQuickReplyTone(reply)\"\n [attr.data-testid]=\"testIdPrefix + '-quick-reply-' + (reply.id || reply.kind)\"\n [attr.aria-label]=\"getQuickReplyAriaLabel(reply)\"\n [disabled]=\"busy\"\n (click)=\"onQuickReply(reply)\"\n >\n <span class=\"praxis-ai-assistant-shell__quick-reply-ambient\" aria-hidden=\"true\"></span>\n <span class=\"praxis-ai-assistant-shell__quick-reply-icon-frame\" aria-hidden=\"true\">\n <mat-icon\n class=\"praxis-ai-assistant-shell__quick-reply-icon\"\n >\n {{ getQuickReplyIcon(reply) }}\n </mat-icon>\n </span>\n <span class=\"praxis-ai-assistant-shell__quick-reply-copy\">\n <span class=\"praxis-ai-assistant-shell__quick-reply-header\">\n <span class=\"praxis-ai-assistant-shell__quick-reply-heading\">\n <span class=\"praxis-ai-assistant-shell__quick-reply-label\">{{ reply.label }}</span>\n @if (getQuickReplyDescription(reply)) {\n <span\n class=\"praxis-ai-assistant-shell__quick-reply-description\"\n >\n {{ getQuickReplyDescription(reply) }}\n </span>\n }\n </span>\n <span class=\"praxis-ai-assistant-shell__quick-reply-actions\">\n <span class=\"praxis-ai-assistant-shell__quick-reply-badge\">\n {{ getQuickReplyCategoryLabel(reply) }}\n </span>\n @if (getQuickReplyTechnicalDetails(reply)) {\n <mat-icon\n class=\"praxis-ai-assistant-shell__quick-reply-details\"\n [matTooltip]=\"getQuickReplyTechnicalDetails(reply)\"\n [attr.aria-label]=\"resolvedLabels.quickReplyDetails\"\n >\n info\n </mat-icon>\n }\n </span>\n </span>\n @if (getQuickReplyContextChips(reply).length) {\n <span\n class=\"praxis-ai-assistant-shell__quick-reply-context\"\n >\n @for (chip of getQuickReplyContextChips(reply); track chip) {\n <span\n class=\"praxis-ai-assistant-shell__quick-reply-context-chip\"\n [attr.aria-label]=\"chip.ariaLabel\"\n >\n <mat-icon aria-hidden=\"true\">{{ chip.icon }}</mat-icon>\n <span>{{ chip.value }}</span>\n </span>\n }\n </span>\n }\n @if (getQuickReplyPresentationItems(reply).length) {\n <span\n class=\"praxis-ai-assistant-shell__quick-reply-insights\"\n >\n @for (item of getQuickReplyPresentationItems(reply); track item) {\n <span\n class=\"praxis-ai-assistant-shell__quick-reply-insight\"\n >\n <mat-icon aria-hidden=\"true\">{{ item.icon }}</mat-icon>\n <span class=\"praxis-ai-assistant-shell__quick-reply-insight-copy\">\n <span class=\"praxis-ai-assistant-shell__quick-reply-insight-label\">\n {{ item.label }}\n </span>\n <span class=\"praxis-ai-assistant-shell__quick-reply-insight-value\">\n {{ item.value }}\n </span>\n </span>\n </span>\n }\n </span>\n }\n <span class=\"praxis-ai-assistant-shell__quick-reply-cta\">\n {{ getQuickReplyCtaLabel(reply) }}\n <mat-icon aria-hidden=\"true\">arrow_forward</mat-icon>\n </span>\n </span>\n </button>\n }\n </div>\n }\n @if (shouldShowStatusText()) {\n <p\n class=\"praxis-ai-assistant-shell__status\"\n [attr.data-testid]=\"testIdPrefix + '-status'\"\n >\n {{ statusText }}\n </p>\n }\n @if (shouldShowErrorText()) {\n <p\n class=\"praxis-ai-assistant-shell__error\"\n [attr.data-testid]=\"testIdPrefix + '-error'\"\n >\n {{ errorText }}\n </p>\n }\n </div>\n\n <footer class=\"praxis-ai-assistant-shell__footer\">\n <label class=\"praxis-ai-assistant-shell__label\" for=\"praxis-ai-assistant-shell-prompt\">\n {{ resolvedLabels.prompt }}\n </label>\n <div class=\"praxis-ai-assistant-shell__composer\">\n <textarea\n id=\"praxis-ai-assistant-shell-prompt\"\n class=\"praxis-ai-assistant-shell__prompt\"\n [attr.data-testid]=\"testIdPrefix + '-prompt'\"\n [placeholder]=\"resolvedLabels.promptPlaceholder\"\n [ngModel]=\"currentPrompt\"\n [disabled]=\"busy\"\n (ngModelChange)=\"onPromptInput($event)\"\n (keydown)=\"onPromptKeydown($event)\"\n (paste)=\"onPromptPaste($event)\"\n ></textarea>\n <div class=\"praxis-ai-assistant-shell__composer-actions\">\n @if (showAttachAction) {\n <input\n #attachmentInput\n type=\"file\"\n hidden\n [attr.accept]=\"attachmentAccept || null\"\n [attr.multiple]=\"attachmentMultiple ? '' : null\"\n [attr.data-testid]=\"testIdPrefix + '-attachment-input'\"\n (change)=\"onAttachmentFilesSelected($event)\"\n >\n <button\n mat-stroked-button\n type=\"button\"\n [disabled]=\"busy\"\n (click)=\"onAttachClick(attachmentInput)\"\n [attr.data-testid]=\"testIdPrefix + '-attach'\"\n >\n <mat-icon>attach_file</mat-icon>\n {{ resolvedLabels.attach }}\n </button>\n }\n <button\n mat-flat-button\n color=\"primary\"\n type=\"button\"\n class=\"praxis-ai-assistant-shell__action praxis-ai-assistant-shell__action--primary\"\n [class.praxis-ai-assistant-shell__action--icon-only]=\"getPrimaryAction().iconOnly\"\n [matTooltip]=\"getPrimaryActionTooltip(getPrimaryAction())\"\n [ngClass]=\"'praxis-ai-assistant-shell__action--tone-' + getShellActionTone(getPrimaryAction())\"\n [disabled]=\"isShellActionDisabled(getPrimaryAction())\"\n (click)=\"onShellAction(getPrimaryAction())\"\n [attr.data-testid]=\"getPrimaryAction().testId || (submitTestId || (testIdPrefix + '-submit'))\"\n [attr.aria-label]=\"getPrimaryAction().ariaLabel || getPrimaryAction().label\"\n >\n @if (getPrimaryAction().icon) {\n <mat-icon aria-hidden=\"true\">{{ getPrimaryAction().icon }}</mat-icon>\n }\n @if (!getPrimaryAction().iconOnly) {\n <span>{{ getPrimaryAction().label }}</span>\n }\n </button>\n @for (action of getSecondaryActions(); track trackShellAction($index, action)) {\n <button\n mat-button\n type=\"button\"\n class=\"praxis-ai-assistant-shell__action praxis-ai-assistant-shell__action--secondary\"\n [ngClass]=\"'praxis-ai-assistant-shell__action--tone-' + getShellActionTone(action)\"\n [disabled]=\"isShellActionDisabled(action)\"\n (click)=\"onShellAction(action)\"\n [attr.data-testid]=\"action.testId || (testIdPrefix + '-action-' + action.id)\"\n [attr.aria-label]=\"action.ariaLabel || action.label\"\n >\n @if (action.icon) {\n <mat-icon aria-hidden=\"true\">{{ action.icon }}</mat-icon>\n }\n {{ action.label }}\n </button>\n }\n @if (busy) {\n <mat-spinner diameter=\"20\" [attr.data-testid]=\"testIdPrefix + '-spinner'\"></mat-spinner>\n }\n </div>\n </div>\n </footer>\n\n @if (resizable) {\n @for (direction of resizeHandles; track trackResizeHandle($index, direction)) {\n <span\n class=\"praxis-ai-assistant-shell__resize-handle praxis-ai-assistant-shell__resize-handle--{{ direction }}\"\n [attr.data-testid]=\"direction === 'se' ? testIdPrefix + '-resize-handle' : testIdPrefix + '-resize-handle-' + direction\"\n aria-hidden=\"true\"\n role=\"presentation\"\n (pointerdown)=\"startResize(direction, $event)\"\n ></span>\n }\n }\n</section>\n", styles: [":host{display:block}.praxis-ai-assistant-shell{--praxis-ai-assistant-shell-shadow-color: var(--md-sys-color-shadow);--praxis-ai-assistant-shell-highlight-color: var(--md-sys-color-on-surface);--praxis-ai-assistant-shell-tone-analytics: var(--md-sys-color-primary);--praxis-ai-assistant-shell-tone-resource: var(--md-sys-color-tertiary);--praxis-ai-assistant-shell-tone-success: var(--md-sys-color-tertiary);--praxis-ai-assistant-shell-tone-warning: var(--md-sys-color-secondary);--praxis-ai-assistant-shell-tone-danger: var(--md-sys-color-error);--praxis-ai-assistant-shell-tone-neutral: var(--md-sys-color-outline);position:fixed;box-sizing:border-box;min-width:360px;min-height:360px;display:flex;flex-direction:column;overflow:hidden;color:var(--md-sys-color-on-surface);border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant) 70%,transparent);border-radius:8px;background:var(--md-sys-color-surface);box-shadow:0 24px 60px color-mix(in srgb,var(--praxis-ai-assistant-shell-shadow-color) 40%,transparent);z-index:var(--praxis-ai-assistant-shell-z-index, 1200)}.praxis-ai-assistant-shell__header{flex:0 0 auto;display:flex;align-items:flex-start;gap:9px;padding:10px 10px 9px;border-color:color-mix(in srgb,var(--md-sys-color-outline-variant) 72%,transparent);background:var(--md-sys-color-surface-container)}.praxis-ai-assistant-shell__header{justify-content:flex-start;border-bottom:1px solid;cursor:move;touch-action:none}.praxis-ai-assistant-shell__identity{flex:0 0 auto;display:grid;place-items:center;width:30px;height:30px;border-radius:8px;background:var(--md-sys-color-primary);color:var(--md-sys-color-on-primary);box-shadow:0 6px 16px color-mix(in srgb,var(--md-sys-color-primary) 22%,transparent)}.praxis-ai-assistant-shell__identity mat-icon{width:18px;height:18px;font-size:18px}.praxis-ai-assistant-shell__title-group{min-width:0;flex:1 1 auto;display:grid;gap:4px}.praxis-ai-assistant-shell__title-row{min-width:0;display:flex;align-items:center;gap:8px}.praxis-ai-assistant-shell__badges{flex:0 0 auto;display:flex;align-items:center;justify-content:flex-end;gap:4px;min-width:0;flex-wrap:wrap}.praxis-ai-assistant-shell__badge{display:inline-flex;align-items:center;gap:5px;min-height:20px;max-width:120px;padding:2px 7px;border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant) 80%,transparent);border-radius:8px;color:var(--md-sys-color-on-surface-variant);background:var(--md-sys-color-surface-container-high);font-size:11px;line-height:1.2;overflow-wrap:anywhere}.praxis-ai-assistant-shell__badge--context{color:var(--md-sys-color-on-surface);background:color-mix(in srgb,var(--md-sys-color-primary) 9%,var(--md-sys-color-surface-container-high))}.praxis-ai-assistant-shell__badge--state{border-color:transparent;background:transparent;color:var(--md-sys-color-on-surface-variant);padding-inline:3px}.praxis-ai-assistant-shell__badge--error{color:var(--md-sys-color-error);border-color:color-mix(in srgb,var(--md-sys-color-error) 60%,transparent)}.praxis-ai-assistant-shell__state-dot{flex:0 0 auto;width:6px;height:6px;border-radius:999px;background:var(--md-sys-color-primary);box-shadow:0 0 0 2px color-mix(in srgb,var(--md-sys-color-primary) 16%,transparent)}.praxis-ai-assistant-shell__badge--error .praxis-ai-assistant-shell__state-dot{background:var(--md-sys-color-error);box-shadow:0 0 0 2px color-mix(in srgb,var(--md-sys-color-error) 16%,transparent)}.praxis-ai-assistant-shell__title-group strong,.praxis-ai-assistant-shell__title-group p{min-width:0;margin:0;overflow-wrap:anywhere}.praxis-ai-assistant-shell__title-group strong{flex:1 1 auto;font-size:13px;line-height:1.2}.praxis-ai-assistant-shell__title-group p{color:var(--md-sys-color-on-surface-variant);font-size:11.5px;line-height:1.3}.praxis-ai-assistant-shell__header-actions{flex:0 0 auto;display:flex;align-items:center;gap:2px;margin-top:-3px}.praxis-ai-assistant-shell__header-actions button{display:inline-grid;place-items:center;width:34px;height:34px;padding:0;color:var(--md-sys-color-on-surface-variant);line-height:1;opacity:.78}.praxis-ai-assistant-shell__header-actions button:hover,.praxis-ai-assistant-shell__header-actions button:focus-visible{opacity:1}.praxis-ai-assistant-shell__header-actions mat-icon{display:block;width:18px;height:18px;font-size:18px;line-height:18px}.praxis-ai-assistant-shell__body{min-height:0;flex:1 1 auto;display:flex;flex-direction:column;gap:10px;padding:12px 12px 10px;overflow:auto;background:linear-gradient(180deg,var(--md-sys-color-surface-container-low),var(--md-sys-color-surface))}.praxis-ai-assistant-shell__context,.praxis-ai-assistant-shell__attachments{flex:0 0 auto;display:flex;align-items:center;gap:8px;overflow-x:auto}.praxis-ai-assistant-shell__context-item{flex:0 0 auto;display:inline-flex;align-items:center;gap:5px;max-width:240px;padding:5px 8px;border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant) 70%,transparent);border-radius:8px;background:var(--md-sys-color-surface-container-high);font-size:12px;line-height:1.25}.praxis-ai-assistant-shell__context-item mat-icon{width:16px;height:16px;font-size:16px}.praxis-ai-assistant-shell__context-label,.praxis-ai-assistant-shell__context-value{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.praxis-ai-assistant-shell__context-label{color:var(--md-sys-color-on-surface)}.praxis-ai-assistant-shell__context-value{color:var(--md-sys-color-on-surface-variant)}.praxis-ai-assistant-shell__label{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}.praxis-ai-assistant-shell__prompt{box-sizing:border-box;width:100%;min-height:46px;max-height:96px;resize:none;border:0;padding:10px 12px 8px;color:var(--md-sys-color-on-surface);background:transparent;font:inherit;line-height:1.45;outline:none}.praxis-ai-assistant-shell__conversation{min-height:0;flex:1 1 auto;display:flex;flex-direction:column;gap:8px;overflow:auto;padding:2px}.praxis-ai-assistant-shell__message{max-width:86%;align-self:flex-start;padding:9px 11px;border-radius:8px;background:var(--md-sys-color-surface-container-high);color:var(--md-sys-color-on-surface);font-size:13px;line-height:1.35;overflow-wrap:anywhere}.praxis-ai-assistant-shell__message-content{white-space:normal}.praxis-ai-assistant-shell__message-content :where(p,ul,h3,h4,h5){margin:0}.praxis-ai-assistant-shell__message-content :where(p,ul,h3,h4,h5)+:where(p,ul,h3,h4,h5){margin-top:8px}.praxis-ai-assistant-shell__message-content ul{padding-left:18px}.praxis-ai-assistant-shell__message-content li+li{margin-top:4px}.praxis-ai-assistant-shell__message-content code{padding:1px 4px;border-radius:4px;background:color-mix(in srgb,var(--md-sys-color-on-surface) 10%,transparent);font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:.94em}.praxis-ai-assistant-shell__message-actions{display:flex;align-items:center;gap:4px;flex-wrap:wrap;margin-top:8px}.praxis-ai-assistant-shell__message-action{min-height:28px;padding:0 8px;border-radius:8px;font-size:12px}.praxis-ai-assistant-shell__message-action--icon{width:30px;min-width:30px;height:30px;padding:0;color:var(--md-sys-color-on-surface-variant)}.praxis-ai-assistant-shell__message-action--icon mat-icon{width:17px;height:17px;font-size:17px}.praxis-ai-assistant-shell__message-feedback,.praxis-ai-assistant-shell__message-feedback-submitted{display:flex;align-items:center;gap:4px;margin-top:8px}.praxis-ai-assistant-shell__message-feedback-action{--mdc-icon-button-state-layer-size: 30px;--mat-icon-button-state-layer-size: 30px;display:inline-grid;place-items:center;width:30px;min-width:30px;height:30px;padding:0;color:var(--md-sys-color-on-surface-variant);line-height:1}.praxis-ai-assistant-shell__message-feedback-action mat-icon,.praxis-ai-assistant-shell__message-feedback-submitted mat-icon{display:block;width:17px;height:17px;font-size:17px;line-height:17px}.praxis-ai-assistant-shell__message-feedback-submitted{color:var(--md-sys-color-on-surface-variant);font-size:12px}.praxis-ai-assistant-shell__message--assistant{border-bottom-left-radius:2px}.praxis-ai-assistant-shell__message--user{align-self:flex-end;border-bottom-right-radius:2px;background:var(--md-sys-color-primary-container);color:var(--md-sys-color-on-primary-container)}.praxis-ai-assistant-shell__message--status{color:var(--md-sys-color-on-surface-variant)}.praxis-ai-assistant-shell__message--error,.praxis-ai-assistant-shell__error{color:var(--md-sys-color-error)}.praxis-ai-assistant-shell__quick-replies{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,520px),1fr));gap:8px;align-items:stretch;padding-bottom:4px}.praxis-ai-assistant-shell__quick-replies--inline{display:flex;flex-wrap:wrap;align-items:center;gap:6px}.praxis-ai-assistant-shell__attachment{flex:0 0 auto;display:inline-flex;align-items:center;gap:7px;max-width:260px;min-height:34px;padding:4px 4px 4px 8px;border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant) 70%,transparent);border-radius:8px;background:var(--md-sys-color-surface-container-high)}.praxis-ai-assistant-shell__attachment--error{border-color:color-mix(in srgb,var(--md-sys-color-error) 60%,transparent)}.praxis-ai-assistant-shell__attachment-preview{flex:0 0 auto;width:28px;height:28px;border-radius:6px;object-fit:cover}.praxis-ai-assistant-shell__attachment-name,.praxis-ai-assistant-shell__attachment-kind{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:12px}.praxis-ai-assistant-shell__attachment-name{color:var(--md-sys-color-on-surface)}.praxis-ai-assistant-shell__attachment-kind{color:var(--md-sys-color-on-surface-variant)}.praxis-ai-assistant-shell__quick-reply{--praxis-ai-assistant-shell-quick-reply-accent: var(--md-sys-color-primary);--praxis-ai-assistant-shell-quick-reply-background: color-mix( in srgb, var(--praxis-ai-assistant-shell-quick-reply-accent) 7%, var(--md-sys-color-surface-container-high) );--praxis-ai-assistant-shell-quick-reply-foreground: var(--md-sys-color-on-surface);width:100%;max-width:100%;height:auto;min-height:0;position:relative;overflow:hidden;padding:15px 16px;align-items:stretch;border-color:color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 36%,transparent);border-radius:22px;color:var(--praxis-ai-assistant-shell-quick-reply-foreground);background:linear-gradient(135deg,color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 16%,transparent),transparent 46%),radial-gradient(circle at 92% 10%,color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 22%,transparent),transparent 32%),var(--praxis-ai-assistant-shell-quick-reply-background);box-shadow:0 18px 42px color-mix(in srgb,var(--praxis-ai-assistant-shell-shadow-color) 22%,transparent),inset 0 1px color-mix(in srgb,var(--praxis-ai-assistant-shell-highlight-color) 16%,transparent);letter-spacing:normal;white-space:normal;text-align:left;text-transform:none;-webkit-user-select:none;user-select:none;transition:border-color .16s ease,box-shadow .16s ease,transform .16s ease,background .16s ease;--mdc-outlined-button-container-height: auto;--mat-outlined-button-horizontal-padding: 0}.praxis-ai-assistant-shell__quick-reply:hover:not(:disabled),.praxis-ai-assistant-shell__quick-reply:focus-visible{border-color:color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 74%,transparent);box-shadow:0 18px 42px color-mix(in srgb,var(--praxis-ai-assistant-shell-shadow-color) 24%,transparent),0 0 0 3px color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 18%,transparent),inset 0 1px color-mix(in srgb,var(--praxis-ai-assistant-shell-highlight-color) 18%,transparent);transform:translateY(-1px)}.praxis-ai-assistant-shell__quick-reply--contextual-action{padding:10px 12px;border-color:color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 34%,transparent);border-radius:8px;background:linear-gradient(90deg,color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 15%,transparent),color-mix(in srgb,var(--md-sys-color-surface-container-high) 92%,transparent)),var(--md-sys-color-surface-container-high);box-shadow:none}.praxis-ai-assistant-shell__quick-reply--guided-action{padding:10px 12px;border-color:color-mix(in srgb,var(--md-sys-color-outline-variant) 82%,transparent);border-radius:8px;background:var(--md-sys-color-surface-container-high);box-shadow:none}.praxis-ai-assistant-shell__quick-reply--contextual-action:hover:not(:disabled),.praxis-ai-assistant-shell__quick-reply--contextual-action:focus-visible{border-color:color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 62%,transparent);box-shadow:0 0 0 2px color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 15%,transparent);transform:none}.praxis-ai-assistant-shell__quick-reply--guided-action:hover:not(:disabled),.praxis-ai-assistant-shell__quick-reply--guided-action:focus-visible{border-color:color-mix(in srgb,var(--md-sys-color-primary) 64%,var(--md-sys-color-outline-variant));background:color-mix(in srgb,var(--md-sys-color-primary-container) 18%,var(--md-sys-color-surface-container-high));box-shadow:0 0 0 2px color-mix(in srgb,var(--md-sys-color-primary) 14%,transparent);transform:none}.praxis-ai-assistant-shell__quick-reply--contextual-action .praxis-ai-assistant-shell__quick-reply-ambient,.praxis-ai-assistant-shell__quick-reply--guided-action .praxis-ai-assistant-shell__quick-reply-ambient{display:none}.praxis-ai-assistant-shell__quick-reply--contextual-action ::ng-deep .mdc-button__label,.praxis-ai-assistant-shell__quick-reply--guided-action ::ng-deep .mdc-button__label{gap:10px}.praxis-ai-assistant-shell__quick-reply--contextual-action .praxis-ai-assistant-shell__quick-reply-icon-frame,.praxis-ai-assistant-shell__quick-reply--guided-action .praxis-ai-assistant-shell__quick-reply-icon-frame{width:34px;height:34px;border-radius:8px;box-shadow:none}.praxis-ai-assistant-shell__quick-reply--guided-action .praxis-ai-assistant-shell__quick-reply-icon-frame{border-color:color-mix(in srgb,var(--md-sys-color-primary) 24%,var(--md-sys-color-outline-variant));color:var(--md-sys-color-primary);background:color-mix(in srgb,var(--md-sys-color-primary-container) 34%,var(--md-sys-color-surface-container-high))}.praxis-ai-assistant-shell__quick-reply--contextual-action .praxis-ai-assistant-shell__quick-reply-icon,.praxis-ai-assistant-shell__quick-reply--guided-action .praxis-ai-assistant-shell__quick-reply-icon{width:19px;height:19px;font-size:19px}.praxis-ai-assistant-shell__quick-reply--contextual-action .praxis-ai-assistant-shell__quick-reply-copy,.praxis-ai-assistant-shell__quick-reply--guided-action .praxis-ai-assistant-shell__quick-reply-copy{gap:6px}.praxis-ai-assistant-shell__quick-reply--contextual-action .praxis-ai-assistant-shell__quick-reply-label,.praxis-ai-assistant-shell__quick-reply--guided-action .praxis-ai-assistant-shell__quick-reply-label{font-size:13.5px;font-weight:760;letter-spacing:0}.praxis-ai-assistant-shell__quick-reply--contextual-action .praxis-ai-assistant-shell__quick-reply-description,.praxis-ai-assistant-shell__quick-reply--guided-action .praxis-ai-assistant-shell__quick-reply-description{display:-webkit-box;overflow:hidden;font-size:12px;line-height:1.34;-webkit-box-orient:vertical;-webkit-line-clamp:2}.praxis-ai-assistant-shell__quick-reply--guided-action .praxis-ai-assistant-shell__quick-reply-description{color:var(--md-sys-color-on-surface-variant)}.praxis-ai-assistant-shell__quick-reply--contextual-action .praxis-ai-assistant-shell__quick-reply-badge,.praxis-ai-assistant-shell__quick-reply--guided-action .praxis-ai-assistant-shell__quick-reply-badge{border-radius:8px;font-size:10px;letter-spacing:0}.praxis-ai-assistant-shell__quick-reply--guided-action .praxis-ai-assistant-shell__quick-reply-badge{border-color:color-mix(in srgb,var(--md-sys-color-outline-variant) 76%,transparent);color:var(--md-sys-color-on-surface-variant);background:color-mix(in srgb,var(--md-sys-color-surface-container-lowest) 62%,transparent)}.praxis-ai-assistant-shell__quick-reply--guided-action .praxis-ai-assistant-shell__quick-reply-cta{color:var(--md-sys-color-primary)}.praxis-ai-assistant-shell__quick-reply--contextual-action .praxis-ai-assistant-shell__quick-reply-context-chip{border-radius:8px;padding:4px 7px;font-size:10.5px;font-weight:650}.praxis-ai-assistant-shell__quick-reply--contextual-action .praxis-ai-assistant-shell__quick-reply-cta,.praxis-ai-assistant-shell__quick-reply--guided-action .praxis-ai-assistant-shell__quick-reply-cta{font-size:11.5px}.praxis-ai-assistant-shell__quick-reply--compact{justify-self:start;width:fit-content;min-width:min(100%,210px);max-width:min(100%,320px);padding:9px 11px;border-radius:16px;background:linear-gradient(135deg,color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 10%,transparent),transparent 55%),var(--md-sys-color-surface-container-high);box-shadow:0 8px 18px color-mix(in srgb,var(--praxis-ai-assistant-shell-shadow-color) 16%,transparent),inset 0 1px color-mix(in srgb,var(--praxis-ai-assistant-shell-highlight-color) 10%,transparent)}.praxis-ai-assistant-shell__quick-reply.praxis-ai-assistant-shell__quick-reply--compact ::ng-deep .mdc-button__label{align-items:center;gap:10px}.praxis-ai-assistant-shell__quick-reply--compact .praxis-ai-assistant-shell__quick-reply-icon-frame{width:34px;height:34px;border-radius:12px}.praxis-ai-assistant-shell__quick-reply--compact .praxis-ai-assistant-shell__quick-reply-icon{width:19px;height:19px;font-size:19px}.praxis-ai-assistant-shell__quick-reply--compact .praxis-ai-assistant-shell__quick-reply-copy{gap:4px}.praxis-ai-assistant-shell__quick-reply--compact .praxis-ai-assistant-shell__quick-reply-header{align-items:center}.praxis-ai-assistant-shell__quick-reply--compact .praxis-ai-assistant-shell__quick-reply-label{font-size:13px;line-height:1.2}.praxis-ai-assistant-shell__quick-reply--compact .praxis-ai-assistant-shell__quick-reply-badge,.praxis-ai-assistant-shell__quick-reply--compact .praxis-ai-assistant-shell__quick-reply-cta{display:none}.praxis-ai-assistant-shell__quick-replies--inline .praxis-ai-assistant-shell__quick-reply{width:auto;min-width:0;max-width:100%;padding:6px 10px;border-radius:999px;box-shadow:none}.praxis-ai-assistant-shell__quick-replies--inline .praxis-ai-assistant-shell__quick-reply--guided-action{border-color:color-mix(in srgb,var(--md-sys-color-outline-variant) 76%,transparent);background:color-mix(in srgb,var(--md-sys-color-surface-container-high) 96%,transparent)}.praxis-ai-assistant-shell__quick-replies--inline .praxis-ai-assistant-shell__quick-reply--guided-action:hover:not(:disabled),.praxis-ai-assistant-shell__quick-replies--inline .praxis-ai-assistant-shell__quick-reply--guided-action:focus-visible{border-color:color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 52%,transparent);background:color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 9%,var(--md-sys-color-surface-container-high));box-shadow:0 0 0 2px color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 12%,transparent)}.praxis-ai-assistant-shell__quick-replies--inline .praxis-ai-assistant-shell__quick-reply ::ng-deep .mdc-button__label{display:inline-flex;grid-template-columns:none;align-items:center;gap:6px;width:auto}.praxis-ai-assistant-shell__quick-replies--inline .praxis-ai-assistant-shell__quick-reply ::ng-deep .mat-mdc-button-touch-target{min-height:34px}.praxis-ai-assistant-shell__quick-replies--inline .praxis-ai-assistant-shell__quick-reply-icon-frame{width:18px;height:18px;border:0;border-radius:0;background:transparent;box-shadow:none}.praxis-ai-assistant-shell__quick-replies--inline .praxis-ai-assistant-shell__quick-reply-icon{width:16px;height:16px;color:var(--praxis-ai-assistant-shell-quick-reply-accent);font-size:16px}.praxis-ai-assistant-shell__quick-replies--inline .praxis-ai-assistant-shell__quick-reply-copy,.praxis-ai-assistant-shell__quick-replies--inline .praxis-ai-assistant-shell__quick-reply-heading,.praxis-ai-assistant-shell__quick-replies--inline .praxis-ai-assistant-shell__quick-reply-header{display:inline-flex;align-items:center;gap:0}.praxis-ai-assistant-shell__quick-replies--inline .praxis-ai-assistant-shell__quick-reply-label{color:var(--md-sys-color-on-surface);font-size:12.5px;font-weight:650;line-height:1.2;white-space:nowrap}.praxis-ai-assistant-shell__quick-replies--inline .praxis-ai-assistant-shell__quick-reply-description,.praxis-ai-assistant-shell__quick-replies--inline .praxis-ai-assistant-shell__quick-reply-actions,.praxis-ai-assistant-shell__quick-replies--inline .praxis-ai-assistant-shell__quick-reply-badge,.praxis-ai-assistant-shell__quick-replies--inline .praxis-ai-assistant-shell__quick-reply-cta{display:none}.praxis-ai-assistant-shell__quick-reply ::ng-deep .mdc-button__label{position:relative;z-index:1;min-width:0;display:grid;grid-template-columns:auto minmax(0,1fr);align-items:flex-start;gap:14px;width:100%;height:auto;line-height:normal}.praxis-ai-assistant-shell__quick-reply-ambient{position:absolute;inset:0;pointer-events:none}.praxis-ai-assistant-shell__quick-reply-ambient:before{content:\"\";position:absolute;inset:0 18px auto;height:1px;border-radius:999px;background:linear-gradient(90deg,transparent,color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 90%,var(--praxis-ai-assistant-shell-highlight-color)),transparent);opacity:.58}.praxis-ai-assistant-shell__quick-reply-ambient:after{content:\"\";position:absolute;top:-34px;right:-44px;width:150px;height:150px;border-radius:999px;background:color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 13%,transparent);filter:blur(18px)}.praxis-ai-assistant-shell__quick-reply ::ng-deep .mat-mdc-button-touch-target{height:100%;min-height:48px}.praxis-ai-assistant-shell__quick-reply-icon-frame{flex:0 0 auto;width:46px;height:46px;display:inline-grid;place-items:center;border:1px solid color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 34%,transparent);border-radius:17px;color:var(--praxis-ai-assistant-shell-quick-reply-accent);background:linear-gradient(145deg,color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 24%,transparent),color-mix(in srgb,var(--praxis-ai-assistant-shell-highlight-color) 6%,transparent));box-shadow:inset 0 1px color-mix(in srgb,var(--praxis-ai-assistant-shell-highlight-color) 18%,transparent),0 10px 24px color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 12%,transparent)}.praxis-ai-assistant-shell__quick-reply-icon{width:24px;height:24px;font-size:24px}.praxis-ai-assistant-shell__quick-reply-details{flex:0 0 auto;width:24px;height:24px;display:inline-grid;place-items:center;border:1px solid color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 14%,transparent);border-radius:50%;color:var(--md-sys-color-on-surface-variant);background:color-mix(in srgb,var(--md-sys-color-outline) 14%,transparent);font-size:17px;opacity:.9}.praxis-ai-assistant-shell__quick-reply-copy{min-width:0;display:grid;gap:10px;flex:1 1 auto}.praxis-ai-assistant-shell__quick-reply-header{min-width:0;display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.praxis-ai-assistant-shell__quick-reply-heading{min-width:0;display:grid;gap:5px}.praxis-ai-assistant-shell__quick-reply-actions{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:flex-end;gap:7px;max-width:46%}.praxis-ai-assistant-shell__quick-reply-label,.praxis-ai-assistant-shell__quick-reply-description{min-width:0;overflow-wrap:anywhere}.praxis-ai-assistant-shell__quick-reply-label{color:var(--md-sys-color-on-surface);font-size:17px;font-weight:760;letter-spacing:.005em;line-height:1.18;text-transform:none}.praxis-ai-assistant-shell__quick-reply-badge{flex:0 0 auto;max-width:100%;padding:4px 8px;border:1px solid color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 28%,transparent);border-radius:999px;color:color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 86%,var(--praxis-ai-assistant-shell-highlight-color));background:color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 11%,transparent);font-size:10.5px;font-weight:700;letter-spacing:.02em;line-height:1.1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.praxis-ai-assistant-shell__quick-reply-description{color:color-mix(in srgb,var(--md-sys-color-on-surface) 80%,transparent);font-size:13px;line-height:1.46}.praxis-ai-assistant-shell__quick-reply-context{display:flex;flex-wrap:wrap;gap:7px;align-items:center}.praxis-ai-assistant-shell__quick-reply-context-chip{min-width:0;display:inline-flex;align-items:center;gap:4px;max-width:100%;padding:5px 8px;border:1px solid color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 22%,transparent);border-radius:999px;color:color-mix(in srgb,var(--md-sys-color-on-surface) 82%,transparent);background:color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 9%,transparent);font-size:11px;font-weight:650;line-height:1.15}.praxis-ai-assistant-shell__quick-reply-context-chip mat-icon{width:14px;height:14px;color:var(--praxis-ai-assistant-shell-quick-reply-accent);font-size:14px}.praxis-ai-assistant-shell__quick-reply-context-chip span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.praxis-ai-assistant-shell__quick-reply-insights{display:grid;grid-template-columns:repeat(auto-fit,minmax(145px,1fr));gap:8px;padding:8px;border:1px solid color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 16%,transparent);border-radius:16px;background:linear-gradient(180deg,color-mix(in srgb,var(--praxis-ai-assistant-shell-highlight-color) 5%,transparent),color-mix(in srgb,var(--md-sys-color-surface-container-lowest) 26%,transparent))}.praxis-ai-assistant-shell__quick-reply-insight{min-width:0;display:grid;grid-template-columns:20px minmax(0,1fr);gap:8px;align-items:start;padding:8px;border:1px solid color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 10%,transparent);border-radius:13px;color:color-mix(in srgb,var(--md-sys-color-on-surface) 86%,transparent);background:color-mix(in srgb,var(--md-sys-color-surface-container-high) 44%,transparent);font-size:12px;line-height:1.35}.praxis-ai-assistant-shell__quick-reply-insight mat-icon{width:17px;height:17px;color:var(--praxis-ai-assistant-shell-quick-reply-accent);font-size:17px;opacity:.9}.praxis-ai-assistant-shell__quick-reply-insight-copy{min-width:0;display:grid;gap:1px}.praxis-ai-assistant-shell__quick-reply-insight-label{color:color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 82%,var(--praxis-ai-assistant-shell-highlight-color));font-size:10.5px;font-weight:760;letter-spacing:.045em;line-height:1.2;text-transform:uppercase}.praxis-ai-assistant-shell__quick-reply-insight-value{min-width:0;overflow-wrap:anywhere}.praxis-ai-assistant-shell__quick-reply-cta{display:inline-flex;align-items:center;justify-self:start;gap:5px;padding:3px 0;color:color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 84%,var(--praxis-ai-assistant-shell-highlight-color));font-size:12px;font-weight:760;letter-spacing:.01em;line-height:1.2}.praxis-ai-assistant-shell__quick-reply-cta mat-icon{width:15px;height:15px;font-size:15px;transition:transform .16s ease}.praxis-ai-assistant-shell__quick-reply:hover:not(:disabled) .praxis-ai-assistant-shell__quick-reply-cta mat-icon,.praxis-ai-assistant-shell__quick-reply:focus-visible .praxis-ai-assistant-shell__quick-reply-cta mat-icon{transform:translate(2px)}.praxis-ai-assistant-shell__quick-reply--tone-analytics{--praxis-ai-assistant-shell-quick-reply-accent: var(--praxis-ai-assistant-shell-tone-analytics)}.praxis-ai-assistant-shell__quick-reply--tone-resource{--praxis-ai-assistant-shell-quick-reply-accent: var(--praxis-ai-assistant-shell-tone-resource)}.praxis-ai-assistant-shell__quick-reply--tone-warning{--praxis-ai-assistant-shell-quick-reply-accent: var(--praxis-ai-assistant-shell-tone-warning)}.praxis-ai-assistant-shell__quick-reply--tone-success{--praxis-ai-assistant-shell-quick-reply-accent: var(--praxis-ai-assistant-shell-tone-success)}.praxis-ai-assistant-shell__quick-reply--tone-danger{--praxis-ai-assistant-shell-quick-reply-accent: var(--praxis-ai-assistant-shell-tone-danger)}.praxis-ai-assistant-shell__quick-reply--tone-neutral{--praxis-ai-assistant-shell-quick-reply-accent: var(--praxis-ai-assistant-shell-tone-neutral)}@media(max-width:640px){.praxis-ai-assistant-shell__quick-reply{padding:13px;border-radius:19px}.praxis-ai-assistant-shell__quick-reply ::ng-deep .mdc-button__label{grid-template-columns:minmax(0,1fr);gap:10px}.praxis-ai-assistant-shell__quick-reply-icon-frame{width:38px;height:38px;border-radius:14px}.praxis-ai-assistant-shell__quick-reply-header{display:grid}.praxis-ai-assistant-shell__quick-reply-actions{justify-content:flex-start;max-width:100%}.praxis-ai-assistant-shell__quick-reply-insights{grid-template-columns:minmax(0,1fr)}}.praxis-ai-assistant-shell__status,.praxis-ai-assistant-shell__error{margin:0;font-size:13px;line-height:1.35;overflow-wrap:anywhere}.praxis-ai-assistant-shell__footer{flex:0 0 auto;padding:8px 10px 10px;border-top:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant) 72%,transparent);background:var(--md-sys-color-surface-container-low)}.praxis-ai-assistant-shell__composer{display:grid;gap:8px;border:1px solid var(--md-sys-color-outline-variant);border-radius:8px;background:var(--md-sys-color-surface-container-lowest);box-shadow:inset 0 1px color-mix(in srgb,var(--praxis-ai-assistant-shell-highlight-color) 4%,transparent)}.praxis-ai-assistant-shell__composer:focus-within{border-color:var(--md-sys-color-primary);box-shadow:0 0 0 2px color-mix(in srgb,var(--md-sys-color-primary) 16%,transparent)}.praxis-ai-assistant-shell__composer-actions{display:flex;align-items:center;justify-content:flex-end;gap:8px;padding:0 8px 7px;flex-wrap:wrap}.praxis-ai-assistant-shell__action{min-height:36px;border-radius:10px;font-weight:650}.praxis-ai-assistant-shell__action mat-icon{width:18px;height:18px;margin-right:6px;font-size:18px}.praxis-ai-assistant-shell__action--icon-only{width:40px;min-width:40px;height:40px;padding-inline:0;border-radius:50%}.praxis-ai-assistant-shell__action--icon-only mat-icon{margin-right:0}.praxis-ai-assistant-shell__action--secondary{color:var(--md-sys-color-on-surface-variant)}.praxis-ai-assistant-shell__action--tone-governance{color:var(--md-sys-color-primary);background:color-mix(in srgb,var(--md-sys-color-primary) 10%,transparent)}.praxis-ai-assistant-shell__action--tone-success{color:var(--praxis-ai-assistant-shell-tone-success);background:color-mix(in srgb,var(--praxis-ai-assistant-shell-tone-success) 10%,transparent)}.praxis-ai-assistant-shell__action--tone-warning{color:var(--praxis-ai-assistant-shell-tone-warning);background:color-mix(in srgb,var(--praxis-ai-assistant-shell-tone-warning) 10%,transparent)}.praxis-ai-assistant-shell__action--tone-danger{color:var(--md-sys-color-error);background:color-mix(in srgb,var(--md-sys-color-error) 10%,transparent)}.praxis-ai-assistant-shell__resize-handle{position:absolute;z-index:2;border:0;background:transparent;touch-action:none}.praxis-ai-assistant-shell__resize-handle--n,.praxis-ai-assistant-shell__resize-handle--s{left:16px;right:16px;height:10px;cursor:ns-resize}.praxis-ai-assistant-shell__resize-handle--n{top:-5px}.praxis-ai-assistant-shell__resize-handle--s{bottom:-5px}.praxis-ai-assistant-shell__resize-handle--e,.praxis-ai-assistant-shell__resize-handle--w{top:16px;bottom:16px;width:10px;cursor:ew-resize}.praxis-ai-assistant-shell__resize-handle--e{right:-5px}.praxis-ai-assistant-shell__resize-handle--w{left:-5px}.praxis-ai-assistant-shell__resize-handle--ne,.praxis-ai-assistant-shell__resize-handle--nw,.praxis-ai-assistant-shell__resize-handle--se,.praxis-ai-assistant-shell__resize-handle--sw{width:22px;height:22px}.praxis-ai-assistant-shell__resize-handle--ne{top:-5px;right:-5px;cursor:nesw-resize}.praxis-ai-assistant-shell__resize-handle--nw{top:-5px;left:-5px;cursor:nwse-resize}.praxis-ai-assistant-shell__resize-handle--se{right:-5px;bottom:-5px;cursor:nwse-resize}.praxis-ai-assistant-shell__resize-handle--sw{bottom:-5px;left:-5px;cursor:nesw-resize}.praxis-ai-assistant-shell__resize-handle--se:after{content:\"\";position:absolute;right:8px;bottom:8px;width:10px;height:10px;border-right:2px solid var(--md-sys-color-outline);border-bottom:2px solid var(--md-sys-color-outline)}\n"] }]
8450
+ ], changeDetection: ChangeDetectionStrategy.OnPush, providers: [PraxisBrowserSpeechTranscriptionService], template: "<section\n #panel\n class=\"praxis-ai-assistant-shell\"\n role=\"dialog\"\n [attr.aria-label]=\"resolvedLabels.title\"\n [attr.aria-busy]=\"busy ? 'true' : null\"\n [style.left.px]=\"currentLayout.left\"\n [style.top.px]=\"currentLayout.top\"\n [style.width.px]=\"currentLayout.width\"\n [style.height.px]=\"currentLayout.height\"\n [attr.data-testid]=\"panelTestId || testIdPrefix\"\n >\n <header\n class=\"praxis-ai-assistant-shell__header\"\n [attr.data-testid]=\"testIdPrefix + '-drag-handle'\"\n [attr.aria-label]=\"resolvedLabels.dragHandleAria\"\n (pointerdown)=\"startDrag($event)\"\n >\n <div class=\"praxis-ai-assistant-shell__identity\" aria-hidden=\"true\">\n <mat-icon>auto_awesome</mat-icon>\n </div>\n <div class=\"praxis-ai-assistant-shell__title-group\">\n <div class=\"praxis-ai-assistant-shell__title-row\">\n <strong>{{ resolvedLabels.title }}</strong>\n <div class=\"praxis-ai-assistant-shell__badges\" aria-hidden=\"true\">\n <span class=\"praxis-ai-assistant-shell__badge praxis-ai-assistant-shell__badge--context\">\n {{ getModeLabel() }}\n </span>\n <span\n class=\"praxis-ai-assistant-shell__badge praxis-ai-assistant-shell__badge--state\"\n [class.praxis-ai-assistant-shell__badge--error]=\"state === 'error'\"\n >\n <span class=\"praxis-ai-assistant-shell__state-dot\" aria-hidden=\"true\"></span>\n {{ getStateLabel() }}\n </span>\n </div>\n </div>\n @if (resolvedLabels.subtitle) {\n <p>{{ resolvedLabels.subtitle }}</p>\n }\n </div>\n <div class=\"praxis-ai-assistant-shell__header-actions\">\n <button\n mat-icon-button\n type=\"button\"\n [matTooltip]=\"resolvedLabels.close\"\n [attr.aria-label]=\"resolvedLabels.close\"\n (pointerdown)=\"$event.stopPropagation()\"\n (click)=\"close.emit()\"\n [attr.data-testid]=\"testIdPrefix + '-close'\"\n >\n <mat-icon>{{ getCloseIcon() }}</mat-icon>\n </button>\n </div>\n </header>\n\n <div class=\"praxis-ai-assistant-shell__body\">\n @if (contextItems.length) {\n <div\n class=\"praxis-ai-assistant-shell__context\"\n [attr.aria-label]=\"resolvedLabels.contextAria\"\n [attr.data-testid]=\"testIdPrefix + '-context'\"\n >\n @for (item of contextItems; track trackContextItem($index, item)) {\n <span\n class=\"praxis-ai-assistant-shell__context-item\"\n [attr.data-testid]=\"testIdPrefix + '-context-' + item.id\"\n >\n @if (item.icon) {\n <mat-icon aria-hidden=\"true\">{{ item.icon }}</mat-icon>\n }\n <span class=\"praxis-ai-assistant-shell__context-label\">{{ item.label }}</span>\n @if (item.value) {\n <span class=\"praxis-ai-assistant-shell__context-value\">{{ item.value }}</span>\n }\n </span>\n }\n </div>\n }\n\n @if (shouldShowRecommendedIntents()) {\n <section\n class=\"praxis-ai-assistant-shell__recommended\"\n [attr.aria-label]=\"resolvedLabels.recommendedIntentsAria\"\n [attr.data-testid]=\"testIdPrefix + '-recommended-intents'\"\n >\n <div class=\"praxis-ai-assistant-shell__recommended-header\">\n <mat-icon aria-hidden=\"true\">auto_awesome</mat-icon>\n <span>{{ resolvedLabels.recommendedIntentsTitle }}</span>\n </div>\n <div class=\"praxis-ai-assistant-shell__recommended-list\">\n @for (intent of recommendedIntents; track trackRecommendedIntent($index, intent)) {\n <button\n type=\"button\"\n class=\"praxis-ai-assistant-shell__recommended-intent\"\n [ngClass]=\"'praxis-ai-assistant-shell__recommended-intent--tone-' + getRecommendedIntentTone(intent)\"\n [attr.data-testid]=\"testIdPrefix + '-recommended-intent-' + intent.id\"\n [attr.aria-label]=\"getRecommendedIntentAriaLabel(intent)\"\n [disabled]=\"isRecommendedIntentDisabled(intent)\"\n (click)=\"onRecommendedIntent(intent)\"\n >\n <span class=\"praxis-ai-assistant-shell__recommended-icon\" aria-hidden=\"true\">\n <mat-icon>{{ getRecommendedIntentIcon(intent) }}</mat-icon>\n </span>\n <span class=\"praxis-ai-assistant-shell__recommended-copy\">\n <span class=\"praxis-ai-assistant-shell__recommended-title-row\">\n <span class=\"praxis-ai-assistant-shell__recommended-title\">{{ intent.label }}</span>\n @if (getRecommendedIntentGroupLabel(intent)) {\n <span class=\"praxis-ai-assistant-shell__recommended-group\">\n {{ getRecommendedIntentGroupLabel(intent) }}\n </span>\n }\n </span>\n @if (getRecommendedIntentDescription(intent)) {\n <span class=\"praxis-ai-assistant-shell__recommended-description\">\n {{ getRecommendedIntentDescription(intent) }}\n </span>\n }\n <span class=\"praxis-ai-assistant-shell__recommended-cta\">\n @if (intent.requiresConfirmation && !intent.disabledReason) {\n <span>{{ resolvedLabels.recommendedIntentRequiresConfirmation }}</span>\n }\n <span>{{ getRecommendedIntentCtaLabel(intent) }}</span>\n <mat-icon aria-hidden=\"true\">arrow_forward</mat-icon>\n </span>\n </span>\n </button>\n }\n </div>\n </section>\n }\n\n <div\n #conversation\n class=\"praxis-ai-assistant-shell__conversation\"\n [attr.data-testid]=\"testIdPrefix + '-conversation'\"\n [attr.aria-label]=\"resolvedLabels.conversationAria\"\n >\n @if (!messages.length) {\n <article\n class=\"praxis-ai-assistant-shell__message praxis-ai-assistant-shell__message--assistant\"\n [attr.data-testid]=\"testIdPrefix + '-message-assistant-empty'\"\n >\n {{ resolvedLabels.emptyConversation }}\n </article>\n }\n @for (message of messages; track trackMessage($index, message)) {\n <article\n class=\"praxis-ai-assistant-shell__message\"\n [class.praxis-ai-assistant-shell__message--user]=\"message.role === 'user'\"\n [class.praxis-ai-assistant-shell__message--assistant]=\"message.role === 'assistant'\"\n [class.praxis-ai-assistant-shell__message--status]=\"message.role === 'status'\"\n [class.praxis-ai-assistant-shell__message--error]=\"message.role === 'error'\"\n [attr.data-testid]=\"testIdPrefix + '-message-' + message.role\"\n >\n <div\n class=\"praxis-ai-assistant-shell__message-content\"\n [innerHTML]=\"renderMessageText(message.text)\"\n ></div>\n @if (message.actions?.length || message.editable || message.resendable) {\n <div\n class=\"praxis-ai-assistant-shell__message-actions\"\n >\n @if (message.editable) {\n <button\n mat-icon-button\n type=\"button\"\n class=\"praxis-ai-assistant-shell__message-action praxis-ai-assistant-shell__message-action--icon\"\n [disabled]=\"busy\"\n [matTooltip]=\"resolvedLabels.editMessage\"\n [attr.aria-label]=\"resolvedLabels.editMessage\"\n [attr.data-testid]=\"testIdPrefix + '-message-edit-' + message.id\"\n (click)=\"onMessageAction(message, { id: 'edit', label: resolvedLabels.editMessage, kind: 'edit' })\"\n >\n <mat-icon aria-hidden=\"true\">edit</mat-icon>\n </button>\n }\n @if (message.resendable) {\n <button\n mat-icon-button\n type=\"button\"\n class=\"praxis-ai-assistant-shell__message-action praxis-ai-assistant-shell__message-action--icon\"\n [disabled]=\"busy\"\n [matTooltip]=\"resolvedLabels.resendMessage\"\n [attr.aria-label]=\"resolvedLabels.resendMessage\"\n [attr.data-testid]=\"testIdPrefix + '-message-resend-' + message.id\"\n (click)=\"onMessageAction(message, { id: 'resend', label: resolvedLabels.resendMessage, kind: 'resend' })\"\n >\n <mat-icon aria-hidden=\"true\">replay</mat-icon>\n </button>\n }\n @for (action of message.actions || []; track trackMessageAction($index, action)) {\n @if (isMessageActionIconOnly(action)) {\n <button\n mat-icon-button\n type=\"button\"\n class=\"praxis-ai-assistant-shell__message-action praxis-ai-assistant-shell__message-action--icon\"\n [disabled]=\"busy || action.disabled\"\n [matTooltip]=\"getMessageActionLabel(action)\"\n [attr.aria-label]=\"getMessageActionLabel(action)\"\n [attr.data-testid]=\"testIdPrefix + '-message-action-' + message.id + '-' + action.id\"\n (click)=\"onMessageAction(message, action)\"\n >\n <mat-icon aria-hidden=\"true\">{{ getMessageActionIcon(action) }}</mat-icon>\n </button>\n } @else {\n <button\n mat-button\n type=\"button\"\n class=\"praxis-ai-assistant-shell__message-action\"\n [disabled]=\"busy || action.disabled\"\n [attr.aria-label]=\"getMessageActionLabel(action)\"\n [attr.data-testid]=\"testIdPrefix + '-message-action-' + message.id + '-' + action.id\"\n (click)=\"onMessageAction(message, action)\"\n >\n {{ action.label }}\n </button>\n }\n }\n </div>\n }\n @if (canSendMessageFeedback(message)) {\n <div class=\"praxis-ai-assistant-shell__message-feedback\">\n <button\n mat-icon-button\n type=\"button\"\n class=\"praxis-ai-assistant-shell__message-feedback-action\"\n [disabled]=\"busy\"\n [matTooltip]=\"resolvedLabels.feedbackPositive\"\n [attr.aria-label]=\"resolvedLabels.feedbackPositive\"\n [attr.data-testid]=\"testIdPrefix + '-message-feedback-positive-' + message.id\"\n (click)=\"sendMessageFeedback(message, 'positive')\"\n >\n <mat-icon aria-hidden=\"true\">thumb_up</mat-icon>\n </button>\n <button\n mat-icon-button\n type=\"button\"\n class=\"praxis-ai-assistant-shell__message-feedback-action\"\n [disabled]=\"busy\"\n [matTooltip]=\"resolvedLabels.feedbackNegative\"\n [attr.aria-label]=\"resolvedLabels.feedbackNegative\"\n [attr.data-testid]=\"testIdPrefix + '-message-feedback-negative-' + message.id\"\n (click)=\"sendMessageFeedback(message, 'negative')\"\n >\n <mat-icon aria-hidden=\"true\">thumb_down</mat-icon>\n </button>\n </div>\n } @else if (isMessageFeedbackSubmitted(message)) {\n <div\n class=\"praxis-ai-assistant-shell__message-feedback-submitted\"\n [attr.data-testid]=\"testIdPrefix + '-message-feedback-submitted-' + message.id\"\n >\n <mat-icon aria-hidden=\"true\">check</mat-icon>\n <span>{{ resolvedLabels.feedbackSubmitted }}</span>\n </div>\n }\n </article>\n }\n </div>\n\n @if (attachments.length) {\n <div\n class=\"praxis-ai-assistant-shell__attachments\"\n [attr.aria-label]=\"resolvedLabels.attachmentsAria\"\n [attr.data-testid]=\"testIdPrefix + '-attachments'\"\n >\n @for (attachment of attachments; track trackAttachment($index, attachment)) {\n <div\n class=\"praxis-ai-assistant-shell__attachment\"\n [class.praxis-ai-assistant-shell__attachment--error]=\"attachment.status === 'error'\"\n [attr.data-testid]=\"testIdPrefix + '-attachment-' + attachment.id\"\n >\n @if (attachment.previewUrl && attachment.kind === 'image') {\n <img\n class=\"praxis-ai-assistant-shell__attachment-preview\"\n [src]=\"attachment.previewUrl\"\n [alt]=\"attachment.name\"\n >\n }\n <span class=\"praxis-ai-assistant-shell__attachment-name\">{{ attachment.name }}</span>\n <span class=\"praxis-ai-assistant-shell__attachment-kind\">{{ attachment.kind }}</span>\n <button\n mat-icon-button\n type=\"button\"\n [disabled]=\"busy\"\n [matTooltip]=\"resolvedLabels.removeAttachment\"\n [attr.aria-label]=\"resolvedLabels.removeAttachment + ': ' + attachment.name\"\n [attr.data-testid]=\"testIdPrefix + '-attachment-remove-' + attachment.id\"\n (click)=\"onRemoveAttachment(attachment)\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </div>\n }\n </div>\n }\n\n @if (quickReplies.length) {\n <div\n class=\"praxis-ai-assistant-shell__quick-replies\"\n [class.praxis-ai-assistant-shell__quick-replies--inline]=\"shouldUseInlineQuickReplies()\"\n [attr.data-testid]=\"testIdPrefix + '-quick-replies'\"\n [attr.aria-label]=\"resolvedLabels.quickRepliesAria\"\n >\n @for (reply of quickReplies; track trackQuickReply($index, reply)) {\n <button\n mat-stroked-button\n type=\"button\"\n class=\"praxis-ai-assistant-shell__quick-reply\"\n [class.praxis-ai-assistant-shell__quick-reply--compact]=\"!isRichQuickReply(reply)\"\n [class.praxis-ai-assistant-shell__quick-reply--guided-action]=\"isGuidedActionQuickReply(reply)\"\n [class.praxis-ai-assistant-shell__quick-reply--contextual-action]=\"isContextualPreviewActionQuickReply(reply)\"\n [ngClass]=\"'praxis-ai-assistant-shell__quick-reply--tone-' + getQuickReplyTone(reply)\"\n [attr.data-testid]=\"testIdPrefix + '-quick-reply-' + (reply.id || reply.kind)\"\n [attr.aria-label]=\"getQuickReplyAriaLabel(reply)\"\n [disabled]=\"busy\"\n (click)=\"onQuickReply(reply)\"\n >\n <span class=\"praxis-ai-assistant-shell__quick-reply-ambient\" aria-hidden=\"true\"></span>\n <span class=\"praxis-ai-assistant-shell__quick-reply-icon-frame\" aria-hidden=\"true\">\n <mat-icon\n class=\"praxis-ai-assistant-shell__quick-reply-icon\"\n >\n {{ getQuickReplyIcon(reply) }}\n </mat-icon>\n </span>\n <span class=\"praxis-ai-assistant-shell__quick-reply-copy\">\n <span class=\"praxis-ai-assistant-shell__quick-reply-header\">\n <span class=\"praxis-ai-assistant-shell__quick-reply-heading\">\n <span class=\"praxis-ai-assistant-shell__quick-reply-label\">{{ reply.label }}</span>\n @if (getQuickReplyDescription(reply)) {\n <span\n class=\"praxis-ai-assistant-shell__quick-reply-description\"\n >\n {{ getQuickReplyDescription(reply) }}\n </span>\n }\n </span>\n <span class=\"praxis-ai-assistant-shell__quick-reply-actions\">\n <span class=\"praxis-ai-assistant-shell__quick-reply-badge\">\n {{ getQuickReplyCategoryLabel(reply) }}\n </span>\n @if (getQuickReplyTechnicalDetails(reply)) {\n <mat-icon\n class=\"praxis-ai-assistant-shell__quick-reply-details\"\n [matTooltip]=\"getQuickReplyTechnicalDetails(reply)\"\n [attr.aria-label]=\"resolvedLabels.quickReplyDetails\"\n >\n info\n </mat-icon>\n }\n </span>\n </span>\n @if (getQuickReplyContextChips(reply).length) {\n <span\n class=\"praxis-ai-assistant-shell__quick-reply-context\"\n >\n @for (chip of getQuickReplyContextChips(reply); track chip.ariaLabel + ':' + chip.value) {\n <span\n class=\"praxis-ai-assistant-shell__quick-reply-context-chip\"\n [attr.aria-label]=\"chip.ariaLabel\"\n >\n <mat-icon aria-hidden=\"true\">{{ chip.icon }}</mat-icon>\n <span>{{ chip.value }}</span>\n </span>\n }\n </span>\n }\n @if (getQuickReplyPresentationItems(reply).length) {\n <span\n class=\"praxis-ai-assistant-shell__quick-reply-insights\"\n >\n @for (item of getQuickReplyPresentationItems(reply); track item.key) {\n <span\n class=\"praxis-ai-assistant-shell__quick-reply-insight\"\n >\n <mat-icon aria-hidden=\"true\">{{ item.icon }}</mat-icon>\n <span class=\"praxis-ai-assistant-shell__quick-reply-insight-copy\">\n <span class=\"praxis-ai-assistant-shell__quick-reply-insight-label\">\n {{ item.label }}\n </span>\n <span class=\"praxis-ai-assistant-shell__quick-reply-insight-value\">\n {{ item.value }}\n </span>\n </span>\n </span>\n }\n </span>\n }\n <span class=\"praxis-ai-assistant-shell__quick-reply-cta\">\n {{ getQuickReplyCtaLabel(reply) }}\n <mat-icon aria-hidden=\"true\">arrow_forward</mat-icon>\n </span>\n </span>\n </button>\n }\n </div>\n }\n @if (shouldShowStatusText()) {\n <p\n class=\"praxis-ai-assistant-shell__status\"\n [attr.data-testid]=\"testIdPrefix + '-status'\"\n >\n {{ statusText }}\n </p>\n }\n @if (shouldShowErrorText()) {\n <p\n class=\"praxis-ai-assistant-shell__error\"\n [attr.data-testid]=\"testIdPrefix + '-error'\"\n >\n {{ errorText }}\n </p>\n }\n </div>\n\n <footer class=\"praxis-ai-assistant-shell__footer\">\n <label class=\"praxis-ai-assistant-shell__label\" for=\"praxis-ai-assistant-shell-prompt\">\n {{ resolvedLabels.prompt }}\n </label>\n <div class=\"praxis-ai-assistant-shell__composer\">\n <textarea\n id=\"praxis-ai-assistant-shell-prompt\"\n class=\"praxis-ai-assistant-shell__prompt\"\n [attr.data-testid]=\"testIdPrefix + '-prompt'\"\n [placeholder]=\"resolvedLabels.promptPlaceholder\"\n [ngModel]=\"currentPrompt\"\n [disabled]=\"busy\"\n (ngModelChange)=\"onPromptInput($event)\"\n (keydown)=\"onPromptKeydown($event)\"\n (paste)=\"onPromptPaste($event)\"\n ></textarea>\n <div class=\"praxis-ai-assistant-shell__composer-actions\">\n @if (shouldShowVoiceInput()) {\n <button\n mat-icon-button\n type=\"button\"\n class=\"praxis-ai-assistant-shell__voice-action\"\n [class.praxis-ai-assistant-shell__voice-action--active]=\"isVoiceInputBusy()\"\n [class.praxis-ai-assistant-shell__voice-action--error]=\"voiceCaptureState === 'error' || voiceCaptureState === 'unsupported'\"\n [disabled]=\"isVoiceInputDisabled()\"\n [matTooltip]=\"getVoiceActionLabel()\"\n [attr.aria-label]=\"getVoiceActionLabel()\"\n [attr.aria-pressed]=\"isVoiceInputBusy() ? 'true' : 'false'\"\n [attr.data-testid]=\"testIdPrefix + '-voice'\"\n (click)=\"onVoiceInputClick()\"\n >\n <mat-icon aria-hidden=\"true\">{{ isVoiceInputBusy() ? 'stop_circle' : 'mic' }}</mat-icon>\n </button>\n }\n @if (showAttachAction) {\n <input\n #attachmentInput\n type=\"file\"\n hidden\n [attr.accept]=\"attachmentAccept || null\"\n [attr.multiple]=\"attachmentMultiple ? '' : null\"\n [attr.data-testid]=\"testIdPrefix + '-attachment-input'\"\n (change)=\"onAttachmentFilesSelected($event)\"\n >\n <button\n mat-stroked-button\n type=\"button\"\n [disabled]=\"busy\"\n (click)=\"onAttachClick(attachmentInput)\"\n [attr.data-testid]=\"testIdPrefix + '-attach'\"\n >\n <mat-icon>attach_file</mat-icon>\n {{ resolvedLabels.attach }}\n </button>\n }\n <button\n mat-flat-button\n color=\"primary\"\n type=\"button\"\n class=\"praxis-ai-assistant-shell__action praxis-ai-assistant-shell__action--primary\"\n [class.praxis-ai-assistant-shell__action--icon-only]=\"getPrimaryAction().iconOnly\"\n [matTooltip]=\"getPrimaryActionTooltip(getPrimaryAction())\"\n [ngClass]=\"'praxis-ai-assistant-shell__action--tone-' + getShellActionTone(getPrimaryAction())\"\n [disabled]=\"isShellActionDisabled(getPrimaryAction())\"\n (click)=\"onShellAction(getPrimaryAction())\"\n [attr.data-testid]=\"getPrimaryAction().testId || (submitTestId || (testIdPrefix + '-submit'))\"\n [attr.aria-label]=\"getPrimaryAction().ariaLabel || getPrimaryAction().label\"\n >\n @if (getPrimaryAction().icon) {\n <mat-icon aria-hidden=\"true\">{{ getPrimaryAction().icon }}</mat-icon>\n }\n @if (!getPrimaryAction().iconOnly) {\n <span>{{ getPrimaryAction().label }}</span>\n }\n </button>\n @for (action of getSecondaryActions(); track trackShellAction($index, action)) {\n <button\n mat-button\n type=\"button\"\n class=\"praxis-ai-assistant-shell__action praxis-ai-assistant-shell__action--secondary\"\n [ngClass]=\"'praxis-ai-assistant-shell__action--tone-' + getShellActionTone(action)\"\n [disabled]=\"isShellActionDisabled(action)\"\n (click)=\"onShellAction(action)\"\n [attr.data-testid]=\"action.testId || (testIdPrefix + '-action-' + action.id)\"\n [attr.aria-label]=\"action.ariaLabel || action.label\"\n >\n @if (action.icon) {\n <mat-icon aria-hidden=\"true\">{{ action.icon }}</mat-icon>\n }\n {{ action.label }}\n </button>\n }\n @if (busy) {\n <mat-spinner diameter=\"20\" [attr.data-testid]=\"testIdPrefix + '-spinner'\"></mat-spinner>\n }\n </div>\n @if (shouldShowVoiceFeedback()) {\n <p\n class=\"praxis-ai-assistant-shell__voice-status\"\n aria-live=\"polite\"\n [attr.data-testid]=\"testIdPrefix + '-voice-status'\"\n >\n {{ voiceFeedbackText }}\n </p>\n }\n </div>\n </footer>\n\n @if (resizable) {\n @for (direction of resizeHandles; track trackResizeHandle($index, direction)) {\n <span\n class=\"praxis-ai-assistant-shell__resize-handle praxis-ai-assistant-shell__resize-handle--{{ direction }}\"\n [attr.data-testid]=\"direction === 'se' ? testIdPrefix + '-resize-handle' : testIdPrefix + '-resize-handle-' + direction\"\n aria-hidden=\"true\"\n role=\"presentation\"\n (pointerdown)=\"startResize(direction, $event)\"\n ></span>\n }\n }\n</section>\n", styles: [":host{display:block}.praxis-ai-assistant-shell{--praxis-ai-assistant-shell-shadow-color: var(--md-sys-color-shadow);--praxis-ai-assistant-shell-highlight-color: var(--md-sys-color-on-surface);--praxis-ai-assistant-shell-tone-analytics: var(--md-sys-color-primary);--praxis-ai-assistant-shell-tone-resource: var(--md-sys-color-tertiary);--praxis-ai-assistant-shell-tone-success: var(--md-sys-color-tertiary);--praxis-ai-assistant-shell-tone-warning: var(--md-sys-color-secondary);--praxis-ai-assistant-shell-tone-danger: var(--md-sys-color-error);--praxis-ai-assistant-shell-tone-neutral: var(--md-sys-color-outline);position:fixed;box-sizing:border-box;min-width:360px;min-height:360px;display:flex;flex-direction:column;overflow:hidden;color:var(--md-sys-color-on-surface);border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant) 70%,transparent);border-radius:8px;background:var(--md-sys-color-surface);box-shadow:0 24px 60px color-mix(in srgb,var(--praxis-ai-assistant-shell-shadow-color) 40%,transparent);z-index:var(--praxis-ai-assistant-shell-z-index, 1200)}.praxis-ai-assistant-shell__header{flex:0 0 auto;display:flex;align-items:flex-start;gap:9px;padding:10px 10px 9px;border-color:color-mix(in srgb,var(--md-sys-color-outline-variant) 72%,transparent);background:var(--md-sys-color-surface-container)}.praxis-ai-assistant-shell__header{justify-content:flex-start;border-bottom:1px solid;cursor:move;touch-action:none}.praxis-ai-assistant-shell__identity{flex:0 0 auto;display:grid;place-items:center;width:30px;height:30px;border-radius:8px;background:var(--md-sys-color-primary);color:var(--md-sys-color-on-primary);box-shadow:0 6px 16px color-mix(in srgb,var(--md-sys-color-primary) 22%,transparent)}.praxis-ai-assistant-shell__identity mat-icon{width:18px;height:18px;font-size:18px}.praxis-ai-assistant-shell__title-group{min-width:0;flex:1 1 auto;display:grid;gap:4px}.praxis-ai-assistant-shell__title-row{min-width:0;display:flex;align-items:center;gap:8px}.praxis-ai-assistant-shell__badges{flex:0 0 auto;display:flex;align-items:center;justify-content:flex-end;gap:4px;min-width:0;flex-wrap:wrap}.praxis-ai-assistant-shell__badge{display:inline-flex;align-items:center;gap:5px;min-height:20px;max-width:120px;padding:2px 7px;border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant) 80%,transparent);border-radius:8px;color:var(--md-sys-color-on-surface-variant);background:var(--md-sys-color-surface-container-high);font-size:11px;line-height:1.2;overflow-wrap:anywhere}.praxis-ai-assistant-shell__badge--context{color:var(--md-sys-color-on-surface);background:color-mix(in srgb,var(--md-sys-color-primary) 9%,var(--md-sys-color-surface-container-high))}.praxis-ai-assistant-shell__badge--state{border-color:transparent;background:transparent;color:var(--md-sys-color-on-surface-variant);padding-inline:3px}.praxis-ai-assistant-shell__badge--error{color:var(--md-sys-color-error);border-color:color-mix(in srgb,var(--md-sys-color-error) 60%,transparent)}.praxis-ai-assistant-shell__state-dot{flex:0 0 auto;width:6px;height:6px;border-radius:999px;background:var(--md-sys-color-primary);box-shadow:0 0 0 2px color-mix(in srgb,var(--md-sys-color-primary) 16%,transparent)}.praxis-ai-assistant-shell__badge--error .praxis-ai-assistant-shell__state-dot{background:var(--md-sys-color-error);box-shadow:0 0 0 2px color-mix(in srgb,var(--md-sys-color-error) 16%,transparent)}.praxis-ai-assistant-shell__title-group strong,.praxis-ai-assistant-shell__title-group p{min-width:0;margin:0;overflow-wrap:anywhere}.praxis-ai-assistant-shell__title-group strong{flex:1 1 auto;font-size:13px;line-height:1.2}.praxis-ai-assistant-shell__title-group p{color:var(--md-sys-color-on-surface-variant);font-size:11.5px;line-height:1.3}.praxis-ai-assistant-shell__header-actions{flex:0 0 auto;display:flex;align-items:center;gap:2px;margin-top:-3px}.praxis-ai-assistant-shell__header-actions button{display:inline-grid;place-items:center;width:34px;height:34px;padding:0;color:var(--md-sys-color-on-surface-variant);line-height:1;opacity:.78}.praxis-ai-assistant-shell__header-actions button:hover,.praxis-ai-assistant-shell__header-actions button:focus-visible{opacity:1}.praxis-ai-assistant-shell__header-actions mat-icon{display:block;width:18px;height:18px;font-size:18px;line-height:18px}.praxis-ai-assistant-shell__body{min-height:0;flex:1 1 auto;display:flex;flex-direction:column;gap:10px;padding:12px 12px 10px;overflow:auto;background:linear-gradient(180deg,var(--md-sys-color-surface-container-low),var(--md-sys-color-surface))}.praxis-ai-assistant-shell__context,.praxis-ai-assistant-shell__attachments{flex:0 0 auto;display:flex;align-items:center;gap:8px;overflow-x:auto}.praxis-ai-assistant-shell__context-item{flex:0 0 auto;display:inline-flex;align-items:center;gap:5px;max-width:240px;padding:5px 8px;border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant) 70%,transparent);border-radius:8px;background:var(--md-sys-color-surface-container-high);font-size:12px;line-height:1.25}.praxis-ai-assistant-shell__context-item mat-icon{width:16px;height:16px;font-size:16px}.praxis-ai-assistant-shell__context-label,.praxis-ai-assistant-shell__context-value{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.praxis-ai-assistant-shell__context-label{color:var(--md-sys-color-on-surface)}.praxis-ai-assistant-shell__context-value{color:var(--md-sys-color-on-surface-variant)}.praxis-ai-assistant-shell__label{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}.praxis-ai-assistant-shell__prompt{box-sizing:border-box;width:100%;min-height:46px;max-height:96px;resize:none;border:0;padding:10px 12px 8px;color:var(--md-sys-color-on-surface);background:transparent;font:inherit;line-height:1.45;outline:none}.praxis-ai-assistant-shell__recommended{flex:0 0 auto;display:grid;gap:8px}.praxis-ai-assistant-shell__recommended-header{display:inline-flex;align-items:center;gap:6px;color:var(--md-sys-color-on-surface-variant);font-size:12px;font-weight:600;line-height:1.25}.praxis-ai-assistant-shell__recommended-header mat-icon{width:16px;height:16px;color:var(--md-sys-color-primary);font-size:16px;line-height:16px}.praxis-ai-assistant-shell__recommended-list{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,210px),1fr));gap:8px}.praxis-ai-assistant-shell__recommended-intent{--praxis-ai-assistant-shell-recommended-accent: var(--praxis-ai-assistant-shell-tone-neutral);appearance:none;border:1px solid color-mix(in srgb,var(--praxis-ai-assistant-shell-recommended-accent) 34%,transparent);border-radius:8px;background:linear-gradient(180deg,color-mix(in srgb,var(--praxis-ai-assistant-shell-recommended-accent) 8%,transparent),transparent),var(--md-sys-color-surface-container-high);color:var(--md-sys-color-on-surface);cursor:pointer;display:flex;gap:9px;min-width:0;min-height:86px;padding:10px;text-align:left;transition:border-color .16s ease,box-shadow .16s ease,background-color .16s ease}.praxis-ai-assistant-shell__recommended-intent:hover:not(:disabled),.praxis-ai-assistant-shell__recommended-intent:focus-visible{border-color:color-mix(in srgb,var(--praxis-ai-assistant-shell-recommended-accent) 68%,transparent);box-shadow:0 0 0 3px color-mix(in srgb,var(--praxis-ai-assistant-shell-recommended-accent) 15%,transparent);outline:none}.praxis-ai-assistant-shell__recommended-intent:disabled{cursor:default;opacity:.62}.praxis-ai-assistant-shell__recommended-icon{flex:0 0 auto;display:grid;place-items:center;width:30px;height:30px;border:1px solid color-mix(in srgb,var(--praxis-ai-assistant-shell-recommended-accent) 28%,transparent);border-radius:8px;background:color-mix(in srgb,var(--praxis-ai-assistant-shell-recommended-accent) 12%,transparent);color:var(--praxis-ai-assistant-shell-recommended-accent)}.praxis-ai-assistant-shell__recommended-icon mat-icon{width:18px;height:18px;font-size:18px;line-height:18px}.praxis-ai-assistant-shell__recommended-copy{min-width:0;display:grid;gap:5px}.praxis-ai-assistant-shell__recommended-title-row{min-width:0;display:flex;align-items:flex-start;justify-content:space-between;gap:8px}.praxis-ai-assistant-shell__recommended-title,.praxis-ai-assistant-shell__recommended-description,.praxis-ai-assistant-shell__recommended-group{min-width:0;overflow-wrap:anywhere}.praxis-ai-assistant-shell__recommended-title{color:var(--md-sys-color-on-surface);font-size:13px;font-weight:700;line-height:1.25}.praxis-ai-assistant-shell__recommended-group{flex:0 1 auto;max-width:44%;border-radius:8px;padding:2px 6px;background:color-mix(in srgb,var(--praxis-ai-assistant-shell-recommended-accent) 10%,transparent);color:color-mix(in srgb,var(--praxis-ai-assistant-shell-recommended-accent) 84%,var(--praxis-ai-assistant-shell-highlight-color));font-size:10.5px;font-weight:700;line-height:1.25}.praxis-ai-assistant-shell__recommended-description{color:var(--md-sys-color-on-surface-variant);font-size:12px;line-height:1.35}.praxis-ai-assistant-shell__recommended-cta{display:inline-flex;align-items:center;gap:5px;flex-wrap:wrap;color:color-mix(in srgb,var(--praxis-ai-assistant-shell-recommended-accent) 84%,var(--praxis-ai-assistant-shell-highlight-color));font-size:11.5px;font-weight:700;line-height:1.25}.praxis-ai-assistant-shell__recommended-cta mat-icon{width:15px;height:15px;font-size:15px;line-height:15px}.praxis-ai-assistant-shell__recommended-intent--tone-analytics{--praxis-ai-assistant-shell-recommended-accent: var(--praxis-ai-assistant-shell-tone-analytics)}.praxis-ai-assistant-shell__recommended-intent--tone-resource{--praxis-ai-assistant-shell-recommended-accent: var(--praxis-ai-assistant-shell-tone-resource)}.praxis-ai-assistant-shell__recommended-intent--tone-success{--praxis-ai-assistant-shell-recommended-accent: var(--praxis-ai-assistant-shell-tone-success)}.praxis-ai-assistant-shell__recommended-intent--tone-warning{--praxis-ai-assistant-shell-recommended-accent: var(--praxis-ai-assistant-shell-tone-warning)}.praxis-ai-assistant-shell__recommended-intent--tone-danger{--praxis-ai-assistant-shell-recommended-accent: var(--praxis-ai-assistant-shell-tone-danger)}.praxis-ai-assistant-shell__recommended-intent--tone-neutral{--praxis-ai-assistant-shell-recommended-accent: var(--praxis-ai-assistant-shell-tone-neutral)}.praxis-ai-assistant-shell__conversation{min-height:0;flex:1 1 auto;display:flex;flex-direction:column;gap:8px;overflow:auto;padding:2px}.praxis-ai-assistant-shell__message{max-width:86%;align-self:flex-start;padding:9px 11px;border-radius:8px;background:var(--md-sys-color-surface-container-high);color:var(--md-sys-color-on-surface);font-size:13px;line-height:1.35;overflow-wrap:anywhere}.praxis-ai-assistant-shell__message-content{white-space:normal}.praxis-ai-assistant-shell__message-content :where(p,ul,h3,h4,h5){margin:0}.praxis-ai-assistant-shell__message-content :where(p,ul,h3,h4,h5)+:where(p,ul,h3,h4,h5){margin-top:8px}.praxis-ai-assistant-shell__message-content ul{padding-left:18px}.praxis-ai-assistant-shell__message-content li+li{margin-top:4px}.praxis-ai-assistant-shell__message-content code{padding:1px 4px;border-radius:4px;background:color-mix(in srgb,var(--md-sys-color-on-surface) 10%,transparent);font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:.94em}.praxis-ai-assistant-shell__message-actions{display:flex;align-items:center;gap:4px;flex-wrap:wrap;margin-top:8px}.praxis-ai-assistant-shell__message-action{min-height:28px;padding:0 8px;border-radius:8px;font-size:12px}.praxis-ai-assistant-shell__message-action--icon{width:30px;min-width:30px;height:30px;padding:0;color:var(--md-sys-color-on-surface-variant)}.praxis-ai-assistant-shell__message-action--icon mat-icon{width:17px;height:17px;font-size:17px}.praxis-ai-assistant-shell__message-feedback,.praxis-ai-assistant-shell__message-feedback-submitted{display:flex;align-items:center;gap:4px;margin-top:8px}.praxis-ai-assistant-shell__message-feedback-action{--mdc-icon-button-state-layer-size: 30px;--mat-icon-button-state-layer-size: 30px;display:inline-grid;place-items:center;width:30px;min-width:30px;height:30px;padding:0;color:var(--md-sys-color-on-surface-variant);line-height:1}.praxis-ai-assistant-shell__message-feedback-action mat-icon,.praxis-ai-assistant-shell__message-feedback-submitted mat-icon{display:block;width:17px;height:17px;font-size:17px;line-height:17px}.praxis-ai-assistant-shell__message-feedback-submitted{color:var(--md-sys-color-on-surface-variant);font-size:12px}.praxis-ai-assistant-shell__message--assistant{border-bottom-left-radius:2px}.praxis-ai-assistant-shell__message--user{align-self:flex-end;border-bottom-right-radius:2px;background:var(--md-sys-color-primary-container);color:var(--md-sys-color-on-primary-container)}.praxis-ai-assistant-shell__message--status{color:var(--md-sys-color-on-surface-variant)}.praxis-ai-assistant-shell__message--error,.praxis-ai-assistant-shell__error{color:var(--md-sys-color-error)}.praxis-ai-assistant-shell__quick-replies{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,520px),1fr));gap:8px;align-items:stretch;padding-bottom:4px}.praxis-ai-assistant-shell__quick-replies--inline{display:flex;flex-wrap:wrap;align-items:center;gap:6px}.praxis-ai-assistant-shell__attachment{flex:0 0 auto;display:inline-flex;align-items:center;gap:7px;max-width:260px;min-height:34px;padding:4px 4px 4px 8px;border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant) 70%,transparent);border-radius:8px;background:var(--md-sys-color-surface-container-high)}.praxis-ai-assistant-shell__attachment--error{border-color:color-mix(in srgb,var(--md-sys-color-error) 60%,transparent)}.praxis-ai-assistant-shell__attachment-preview{flex:0 0 auto;width:28px;height:28px;border-radius:6px;object-fit:cover}.praxis-ai-assistant-shell__attachment-name,.praxis-ai-assistant-shell__attachment-kind{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:12px}.praxis-ai-assistant-shell__attachment-name{color:var(--md-sys-color-on-surface)}.praxis-ai-assistant-shell__attachment-kind{color:var(--md-sys-color-on-surface-variant)}.praxis-ai-assistant-shell__quick-reply{--praxis-ai-assistant-shell-quick-reply-accent: var(--md-sys-color-primary);--praxis-ai-assistant-shell-quick-reply-background: color-mix( in srgb, var(--praxis-ai-assistant-shell-quick-reply-accent) 7%, var(--md-sys-color-surface-container-high) );--praxis-ai-assistant-shell-quick-reply-foreground: var(--md-sys-color-on-surface);width:100%;max-width:100%;height:auto;min-height:0;position:relative;overflow:hidden;padding:15px 16px;align-items:stretch;border-color:color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 36%,transparent);border-radius:22px;color:var(--praxis-ai-assistant-shell-quick-reply-foreground);background:linear-gradient(135deg,color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 16%,transparent),transparent 46%),radial-gradient(circle at 92% 10%,color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 22%,transparent),transparent 32%),var(--praxis-ai-assistant-shell-quick-reply-background);box-shadow:0 18px 42px color-mix(in srgb,var(--praxis-ai-assistant-shell-shadow-color) 22%,transparent),inset 0 1px color-mix(in srgb,var(--praxis-ai-assistant-shell-highlight-color) 16%,transparent);letter-spacing:normal;white-space:normal;text-align:left;text-transform:none;-webkit-user-select:none;user-select:none;transition:border-color .16s ease,box-shadow .16s ease,transform .16s ease,background .16s ease;--mdc-outlined-button-container-height: auto;--mat-outlined-button-horizontal-padding: 0}.praxis-ai-assistant-shell__quick-reply:hover:not(:disabled),.praxis-ai-assistant-shell__quick-reply:focus-visible{border-color:color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 74%,transparent);box-shadow:0 18px 42px color-mix(in srgb,var(--praxis-ai-assistant-shell-shadow-color) 24%,transparent),0 0 0 3px color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 18%,transparent),inset 0 1px color-mix(in srgb,var(--praxis-ai-assistant-shell-highlight-color) 18%,transparent);transform:translateY(-1px)}.praxis-ai-assistant-shell__quick-reply--contextual-action{padding:10px 12px;border-color:color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 34%,transparent);border-radius:8px;background:linear-gradient(90deg,color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 15%,transparent),color-mix(in srgb,var(--md-sys-color-surface-container-high) 92%,transparent)),var(--md-sys-color-surface-container-high);box-shadow:none}.praxis-ai-assistant-shell__quick-reply--guided-action{padding:10px 12px;border-color:color-mix(in srgb,var(--md-sys-color-outline-variant) 82%,transparent);border-radius:8px;background:var(--md-sys-color-surface-container-high);box-shadow:none}.praxis-ai-assistant-shell__quick-reply--contextual-action:hover:not(:disabled),.praxis-ai-assistant-shell__quick-reply--contextual-action:focus-visible{border-color:color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 62%,transparent);box-shadow:0 0 0 2px color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 15%,transparent);transform:none}.praxis-ai-assistant-shell__quick-reply--guided-action:hover:not(:disabled),.praxis-ai-assistant-shell__quick-reply--guided-action:focus-visible{border-color:color-mix(in srgb,var(--md-sys-color-primary) 64%,var(--md-sys-color-outline-variant));background:color-mix(in srgb,var(--md-sys-color-primary-container) 18%,var(--md-sys-color-surface-container-high));box-shadow:0 0 0 2px color-mix(in srgb,var(--md-sys-color-primary) 14%,transparent);transform:none}.praxis-ai-assistant-shell__quick-reply--contextual-action .praxis-ai-assistant-shell__quick-reply-ambient,.praxis-ai-assistant-shell__quick-reply--guided-action .praxis-ai-assistant-shell__quick-reply-ambient{display:none}.praxis-ai-assistant-shell__quick-reply--contextual-action ::ng-deep .mdc-button__label,.praxis-ai-assistant-shell__quick-reply--guided-action ::ng-deep .mdc-button__label{gap:10px}.praxis-ai-assistant-shell__quick-reply--contextual-action .praxis-ai-assistant-shell__quick-reply-icon-frame,.praxis-ai-assistant-shell__quick-reply--guided-action .praxis-ai-assistant-shell__quick-reply-icon-frame{width:34px;height:34px;border-radius:8px;box-shadow:none}.praxis-ai-assistant-shell__quick-reply--guided-action .praxis-ai-assistant-shell__quick-reply-icon-frame{border-color:color-mix(in srgb,var(--md-sys-color-primary) 24%,var(--md-sys-color-outline-variant));color:var(--md-sys-color-primary);background:color-mix(in srgb,var(--md-sys-color-primary-container) 34%,var(--md-sys-color-surface-container-high))}.praxis-ai-assistant-shell__quick-reply--contextual-action .praxis-ai-assistant-shell__quick-reply-icon,.praxis-ai-assistant-shell__quick-reply--guided-action .praxis-ai-assistant-shell__quick-reply-icon{width:19px;height:19px;font-size:19px}.praxis-ai-assistant-shell__quick-reply--contextual-action .praxis-ai-assistant-shell__quick-reply-copy,.praxis-ai-assistant-shell__quick-reply--guided-action .praxis-ai-assistant-shell__quick-reply-copy{gap:6px}.praxis-ai-assistant-shell__quick-reply--contextual-action .praxis-ai-assistant-shell__quick-reply-label,.praxis-ai-assistant-shell__quick-reply--guided-action .praxis-ai-assistant-shell__quick-reply-label{font-size:13.5px;font-weight:760;letter-spacing:0}.praxis-ai-assistant-shell__quick-reply--contextual-action .praxis-ai-assistant-shell__quick-reply-description,.praxis-ai-assistant-shell__quick-reply--guided-action .praxis-ai-assistant-shell__quick-reply-description{display:-webkit-box;overflow:hidden;font-size:12px;line-height:1.34;-webkit-box-orient:vertical;-webkit-line-clamp:2}.praxis-ai-assistant-shell__quick-reply--guided-action .praxis-ai-assistant-shell__quick-reply-description{color:var(--md-sys-color-on-surface-variant)}.praxis-ai-assistant-shell__quick-reply--contextual-action .praxis-ai-assistant-shell__quick-reply-badge,.praxis-ai-assistant-shell__quick-reply--guided-action .praxis-ai-assistant-shell__quick-reply-badge{border-radius:8px;font-size:10px;letter-spacing:0}.praxis-ai-assistant-shell__quick-reply--guided-action .praxis-ai-assistant-shell__quick-reply-badge{border-color:color-mix(in srgb,var(--md-sys-color-outline-variant) 76%,transparent);color:var(--md-sys-color-on-surface-variant);background:color-mix(in srgb,var(--md-sys-color-surface-container-lowest) 62%,transparent)}.praxis-ai-assistant-shell__quick-reply--guided-action .praxis-ai-assistant-shell__quick-reply-cta{color:var(--md-sys-color-primary)}.praxis-ai-assistant-shell__quick-reply--contextual-action .praxis-ai-assistant-shell__quick-reply-context-chip{border-radius:8px;padding:4px 7px;font-size:10.5px;font-weight:650}.praxis-ai-assistant-shell__quick-reply--contextual-action .praxis-ai-assistant-shell__quick-reply-cta,.praxis-ai-assistant-shell__quick-reply--guided-action .praxis-ai-assistant-shell__quick-reply-cta{font-size:11.5px}.praxis-ai-assistant-shell__quick-reply--compact{justify-self:start;width:fit-content;min-width:min(100%,210px);max-width:min(100%,320px);padding:9px 11px;border-radius:16px;background:linear-gradient(135deg,color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 10%,transparent),transparent 55%),var(--md-sys-color-surface-container-high);box-shadow:0 8px 18px color-mix(in srgb,var(--praxis-ai-assistant-shell-shadow-color) 16%,transparent),inset 0 1px color-mix(in srgb,var(--praxis-ai-assistant-shell-highlight-color) 10%,transparent)}.praxis-ai-assistant-shell__quick-reply.praxis-ai-assistant-shell__quick-reply--compact ::ng-deep .mdc-button__label{align-items:center;gap:10px}.praxis-ai-assistant-shell__quick-reply--compact .praxis-ai-assistant-shell__quick-reply-icon-frame{width:34px;height:34px;border-radius:12px}.praxis-ai-assistant-shell__quick-reply--compact .praxis-ai-assistant-shell__quick-reply-icon{width:19px;height:19px;font-size:19px}.praxis-ai-assistant-shell__quick-reply--compact .praxis-ai-assistant-shell__quick-reply-copy{gap:4px}.praxis-ai-assistant-shell__quick-reply--compact .praxis-ai-assistant-shell__quick-reply-header{align-items:center}.praxis-ai-assistant-shell__quick-reply--compact .praxis-ai-assistant-shell__quick-reply-label{font-size:13px;line-height:1.2}.praxis-ai-assistant-shell__quick-reply--compact .praxis-ai-assistant-shell__quick-reply-badge,.praxis-ai-assistant-shell__quick-reply--compact .praxis-ai-assistant-shell__quick-reply-cta{display:none}.praxis-ai-assistant-shell__quick-replies--inline .praxis-ai-assistant-shell__quick-reply{width:auto;min-width:0;max-width:100%;padding:6px 10px;border-radius:999px;box-shadow:none}.praxis-ai-assistant-shell__quick-replies--inline .praxis-ai-assistant-shell__quick-reply--guided-action{border-color:color-mix(in srgb,var(--md-sys-color-outline-variant) 76%,transparent);background:color-mix(in srgb,var(--md-sys-color-surface-container-high) 96%,transparent)}.praxis-ai-assistant-shell__quick-replies--inline .praxis-ai-assistant-shell__quick-reply--guided-action:hover:not(:disabled),.praxis-ai-assistant-shell__quick-replies--inline .praxis-ai-assistant-shell__quick-reply--guided-action:focus-visible{border-color:color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 52%,transparent);background:color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 9%,var(--md-sys-color-surface-container-high));box-shadow:0 0 0 2px color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 12%,transparent)}.praxis-ai-assistant-shell__quick-replies--inline .praxis-ai-assistant-shell__quick-reply ::ng-deep .mdc-button__label{display:inline-flex;grid-template-columns:none;align-items:center;gap:6px;width:auto}.praxis-ai-assistant-shell__quick-replies--inline .praxis-ai-assistant-shell__quick-reply ::ng-deep .mat-mdc-button-touch-target{min-height:34px}.praxis-ai-assistant-shell__quick-replies--inline .praxis-ai-assistant-shell__quick-reply-icon-frame{width:18px;height:18px;border:0;border-radius:0;background:transparent;box-shadow:none}.praxis-ai-assistant-shell__quick-replies--inline .praxis-ai-assistant-shell__quick-reply-icon{width:16px;height:16px;color:var(--praxis-ai-assistant-shell-quick-reply-accent);font-size:16px}.praxis-ai-assistant-shell__quick-replies--inline .praxis-ai-assistant-shell__quick-reply-copy,.praxis-ai-assistant-shell__quick-replies--inline .praxis-ai-assistant-shell__quick-reply-heading,.praxis-ai-assistant-shell__quick-replies--inline .praxis-ai-assistant-shell__quick-reply-header{display:inline-flex;align-items:center;gap:0}.praxis-ai-assistant-shell__quick-replies--inline .praxis-ai-assistant-shell__quick-reply-label{color:var(--md-sys-color-on-surface);font-size:12.5px;font-weight:650;line-height:1.2;white-space:nowrap}.praxis-ai-assistant-shell__quick-replies--inline .praxis-ai-assistant-shell__quick-reply-description,.praxis-ai-assistant-shell__quick-replies--inline .praxis-ai-assistant-shell__quick-reply-actions,.praxis-ai-assistant-shell__quick-replies--inline .praxis-ai-assistant-shell__quick-reply-badge,.praxis-ai-assistant-shell__quick-replies--inline .praxis-ai-assistant-shell__quick-reply-cta{display:none}.praxis-ai-assistant-shell__quick-reply ::ng-deep .mdc-button__label{position:relative;z-index:1;min-width:0;display:grid;grid-template-columns:auto minmax(0,1fr);align-items:flex-start;gap:14px;width:100%;height:auto;line-height:normal}.praxis-ai-assistant-shell__quick-reply-ambient{position:absolute;inset:0;pointer-events:none}.praxis-ai-assistant-shell__quick-reply-ambient:before{content:\"\";position:absolute;inset:0 18px auto;height:1px;border-radius:999px;background:linear-gradient(90deg,transparent,color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 90%,var(--praxis-ai-assistant-shell-highlight-color)),transparent);opacity:.58}.praxis-ai-assistant-shell__quick-reply-ambient:after{content:\"\";position:absolute;top:-34px;right:-44px;width:150px;height:150px;border-radius:999px;background:color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 13%,transparent);filter:blur(18px)}.praxis-ai-assistant-shell__quick-reply ::ng-deep .mat-mdc-button-touch-target{height:100%;min-height:48px}.praxis-ai-assistant-shell__quick-reply-icon-frame{flex:0 0 auto;width:46px;height:46px;display:inline-grid;place-items:center;border:1px solid color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 34%,transparent);border-radius:17px;color:var(--praxis-ai-assistant-shell-quick-reply-accent);background:linear-gradient(145deg,color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 24%,transparent),color-mix(in srgb,var(--praxis-ai-assistant-shell-highlight-color) 6%,transparent));box-shadow:inset 0 1px color-mix(in srgb,var(--praxis-ai-assistant-shell-highlight-color) 18%,transparent),0 10px 24px color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 12%,transparent)}.praxis-ai-assistant-shell__quick-reply-icon{width:24px;height:24px;font-size:24px}.praxis-ai-assistant-shell__quick-reply-details{flex:0 0 auto;width:24px;height:24px;display:inline-grid;place-items:center;border:1px solid color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 14%,transparent);border-radius:50%;color:var(--md-sys-color-on-surface-variant);background:color-mix(in srgb,var(--md-sys-color-outline) 14%,transparent);font-size:17px;opacity:.9}.praxis-ai-assistant-shell__quick-reply-copy{min-width:0;display:grid;gap:10px;flex:1 1 auto}.praxis-ai-assistant-shell__quick-reply-header{min-width:0;display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.praxis-ai-assistant-shell__quick-reply-heading{min-width:0;display:grid;gap:5px}.praxis-ai-assistant-shell__quick-reply-actions{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:flex-end;gap:7px;max-width:46%}.praxis-ai-assistant-shell__quick-reply-label,.praxis-ai-assistant-shell__quick-reply-description{min-width:0;overflow-wrap:anywhere}.praxis-ai-assistant-shell__quick-reply-label{color:var(--md-sys-color-on-surface);font-size:17px;font-weight:760;letter-spacing:.005em;line-height:1.18;text-transform:none}.praxis-ai-assistant-shell__quick-reply-badge{flex:0 0 auto;max-width:100%;padding:4px 8px;border:1px solid color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 28%,transparent);border-radius:999px;color:color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 86%,var(--praxis-ai-assistant-shell-highlight-color));background:color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 11%,transparent);font-size:10.5px;font-weight:700;letter-spacing:.02em;line-height:1.1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.praxis-ai-assistant-shell__quick-reply-description{color:color-mix(in srgb,var(--md-sys-color-on-surface) 80%,transparent);font-size:13px;line-height:1.46}.praxis-ai-assistant-shell__quick-reply-context{display:flex;flex-wrap:wrap;gap:7px;align-items:center}.praxis-ai-assistant-shell__quick-reply-context-chip{min-width:0;display:inline-flex;align-items:center;gap:4px;max-width:100%;padding:5px 8px;border:1px solid color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 22%,transparent);border-radius:999px;color:color-mix(in srgb,var(--md-sys-color-on-surface) 82%,transparent);background:color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 9%,transparent);font-size:11px;font-weight:650;line-height:1.15}.praxis-ai-assistant-shell__quick-reply-context-chip mat-icon{width:14px;height:14px;color:var(--praxis-ai-assistant-shell-quick-reply-accent);font-size:14px}.praxis-ai-assistant-shell__quick-reply-context-chip span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.praxis-ai-assistant-shell__quick-reply-insights{display:grid;grid-template-columns:repeat(auto-fit,minmax(145px,1fr));gap:8px;padding:8px;border:1px solid color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 16%,transparent);border-radius:16px;background:linear-gradient(180deg,color-mix(in srgb,var(--praxis-ai-assistant-shell-highlight-color) 5%,transparent),color-mix(in srgb,var(--md-sys-color-surface-container-lowest) 26%,transparent))}.praxis-ai-assistant-shell__quick-reply-insight{min-width:0;display:grid;grid-template-columns:20px minmax(0,1fr);gap:8px;align-items:start;padding:8px;border:1px solid color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 10%,transparent);border-radius:13px;color:color-mix(in srgb,var(--md-sys-color-on-surface) 86%,transparent);background:color-mix(in srgb,var(--md-sys-color-surface-container-high) 44%,transparent);font-size:12px;line-height:1.35}.praxis-ai-assistant-shell__quick-reply-insight mat-icon{width:17px;height:17px;color:var(--praxis-ai-assistant-shell-quick-reply-accent);font-size:17px;opacity:.9}.praxis-ai-assistant-shell__quick-reply-insight-copy{min-width:0;display:grid;gap:1px}.praxis-ai-assistant-shell__quick-reply-insight-label{color:color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 82%,var(--praxis-ai-assistant-shell-highlight-color));font-size:10.5px;font-weight:760;letter-spacing:.045em;line-height:1.2;text-transform:uppercase}.praxis-ai-assistant-shell__quick-reply-insight-value{min-width:0;overflow-wrap:anywhere}.praxis-ai-assistant-shell__quick-reply-cta{display:inline-flex;align-items:center;justify-self:start;gap:5px;padding:3px 0;color:color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 84%,var(--praxis-ai-assistant-shell-highlight-color));font-size:12px;font-weight:760;letter-spacing:.01em;line-height:1.2}.praxis-ai-assistant-shell__quick-reply-cta mat-icon{width:15px;height:15px;font-size:15px;transition:transform .16s ease}.praxis-ai-assistant-shell__quick-reply:hover:not(:disabled) .praxis-ai-assistant-shell__quick-reply-cta mat-icon,.praxis-ai-assistant-shell__quick-reply:focus-visible .praxis-ai-assistant-shell__quick-reply-cta mat-icon{transform:translate(2px)}.praxis-ai-assistant-shell__quick-reply--tone-analytics{--praxis-ai-assistant-shell-quick-reply-accent: var(--praxis-ai-assistant-shell-tone-analytics)}.praxis-ai-assistant-shell__quick-reply--tone-resource{--praxis-ai-assistant-shell-quick-reply-accent: var(--praxis-ai-assistant-shell-tone-resource)}.praxis-ai-assistant-shell__quick-reply--tone-warning{--praxis-ai-assistant-shell-quick-reply-accent: var(--praxis-ai-assistant-shell-tone-warning)}.praxis-ai-assistant-shell__quick-reply--tone-success{--praxis-ai-assistant-shell-quick-reply-accent: var(--praxis-ai-assistant-shell-tone-success)}.praxis-ai-assistant-shell__quick-reply--tone-danger{--praxis-ai-assistant-shell-quick-reply-accent: var(--praxis-ai-assistant-shell-tone-danger)}.praxis-ai-assistant-shell__quick-reply--tone-neutral{--praxis-ai-assistant-shell-quick-reply-accent: var(--praxis-ai-assistant-shell-tone-neutral)}@media(max-width:640px){.praxis-ai-assistant-shell__quick-reply{padding:13px;border-radius:19px}.praxis-ai-assistant-shell__quick-reply ::ng-deep .mdc-button__label{grid-template-columns:minmax(0,1fr);gap:10px}.praxis-ai-assistant-shell__quick-reply-icon-frame{width:38px;height:38px;border-radius:14px}.praxis-ai-assistant-shell__quick-reply-header{display:grid}.praxis-ai-assistant-shell__quick-reply-actions{justify-content:flex-start;max-width:100%}.praxis-ai-assistant-shell__quick-reply-insights{grid-template-columns:minmax(0,1fr)}}.praxis-ai-assistant-shell__status,.praxis-ai-assistant-shell__error{margin:0;font-size:13px;line-height:1.35;overflow-wrap:anywhere}.praxis-ai-assistant-shell__footer{flex:0 0 auto;padding:8px 10px 10px;border-top:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant) 72%,transparent);background:var(--md-sys-color-surface-container-low)}.praxis-ai-assistant-shell__composer{display:grid;gap:8px;border:1px solid var(--md-sys-color-outline-variant);border-radius:8px;background:var(--md-sys-color-surface-container-lowest);box-shadow:inset 0 1px color-mix(in srgb,var(--praxis-ai-assistant-shell-highlight-color) 4%,transparent)}.praxis-ai-assistant-shell__composer:focus-within{border-color:var(--md-sys-color-primary);box-shadow:0 0 0 2px color-mix(in srgb,var(--md-sys-color-primary) 16%,transparent)}.praxis-ai-assistant-shell__composer-actions{display:flex;align-items:center;justify-content:flex-end;gap:8px;padding:0 8px 7px;flex-wrap:wrap}.praxis-ai-assistant-shell__voice-action{color:var(--md-sys-color-on-surface-variant)}.praxis-ai-assistant-shell__voice-action--active{color:var(--md-sys-color-error);background:color-mix(in srgb,var(--md-sys-color-error) 10%,transparent)}.praxis-ai-assistant-shell__voice-action--error{color:var(--praxis-ai-assistant-shell-tone-warning)}.praxis-ai-assistant-shell__voice-status{margin:-2px 10px 8px;color:var(--md-sys-color-on-surface-variant);font-size:12px;line-height:1.3}.praxis-ai-assistant-shell__action{min-height:36px;border-radius:10px;font-weight:650}.praxis-ai-assistant-shell__action mat-icon{width:18px;height:18px;margin-right:6px;font-size:18px}.praxis-ai-assistant-shell__action--icon-only{width:40px;min-width:40px;height:40px;padding-inline:0;border-radius:50%}.praxis-ai-assistant-shell__action--icon-only mat-icon{margin-right:0}.praxis-ai-assistant-shell__action--secondary{color:var(--md-sys-color-on-surface-variant)}.praxis-ai-assistant-shell__action--tone-governance{color:var(--md-sys-color-primary);background:color-mix(in srgb,var(--md-sys-color-primary) 10%,transparent)}.praxis-ai-assistant-shell__action--tone-success{color:var(--praxis-ai-assistant-shell-tone-success);background:color-mix(in srgb,var(--praxis-ai-assistant-shell-tone-success) 10%,transparent)}.praxis-ai-assistant-shell__action--tone-warning{color:var(--praxis-ai-assistant-shell-tone-warning);background:color-mix(in srgb,var(--praxis-ai-assistant-shell-tone-warning) 10%,transparent)}.praxis-ai-assistant-shell__action--tone-danger{color:var(--md-sys-color-error);background:color-mix(in srgb,var(--md-sys-color-error) 10%,transparent)}.praxis-ai-assistant-shell__resize-handle{position:absolute;z-index:2;border:0;background:transparent;touch-action:none}.praxis-ai-assistant-shell__resize-handle--n,.praxis-ai-assistant-shell__resize-handle--s{left:16px;right:16px;height:10px;cursor:ns-resize}.praxis-ai-assistant-shell__resize-handle--n{top:-5px}.praxis-ai-assistant-shell__resize-handle--s{bottom:-5px}.praxis-ai-assistant-shell__resize-handle--e,.praxis-ai-assistant-shell__resize-handle--w{top:16px;bottom:16px;width:10px;cursor:ew-resize}.praxis-ai-assistant-shell__resize-handle--e{right:-5px}.praxis-ai-assistant-shell__resize-handle--w{left:-5px}.praxis-ai-assistant-shell__resize-handle--ne,.praxis-ai-assistant-shell__resize-handle--nw,.praxis-ai-assistant-shell__resize-handle--se,.praxis-ai-assistant-shell__resize-handle--sw{width:22px;height:22px}.praxis-ai-assistant-shell__resize-handle--ne{top:-5px;right:-5px;cursor:nesw-resize}.praxis-ai-assistant-shell__resize-handle--nw{top:-5px;left:-5px;cursor:nwse-resize}.praxis-ai-assistant-shell__resize-handle--se{right:-5px;bottom:-5px;cursor:nwse-resize}.praxis-ai-assistant-shell__resize-handle--sw{bottom:-5px;left:-5px;cursor:nesw-resize}.praxis-ai-assistant-shell__resize-handle--se:after{content:\"\";position:absolute;right:8px;bottom:8px;width:10px;height:10px;border-right:2px solid var(--md-sys-color-outline);border-bottom:2px solid var(--md-sys-color-outline)}\n"] }]
8113
8451
  }], propDecorators: { labels: [{
8114
8452
  type: Input
8115
8453
  }], mode: [{
@@ -8124,6 +8462,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
8124
8462
  type: Input
8125
8463
  }], quickReplies: [{
8126
8464
  type: Input
8465
+ }], recommendedIntents: [{
8466
+ type: Input
8127
8467
  }], prompt: [{
8128
8468
  type: Input
8129
8469
  }], statusText: [{
@@ -8162,6 +8502,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
8162
8502
  type: Input
8163
8503
  }], attachmentMultiple: [{
8164
8504
  type: Input
8505
+ }], voiceInputMode: [{
8506
+ type: Input
8507
+ }], voiceLanguage: [{
8508
+ type: Input
8165
8509
  }], draggable: [{
8166
8510
  type: Input
8167
8511
  }], resizable: [{
@@ -8204,6 +8548,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
8204
8548
  type: Output
8205
8549
  }], quickReply: [{
8206
8550
  type: Output
8551
+ }], recommendedIntent: [{
8552
+ type: Output
8207
8553
  }], layoutChange: [{
8208
8554
  type: Output
8209
8555
  }], panel: [{
@@ -9379,4 +9725,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
9379
9725
  * Generated bundle index. Do not edit.
9380
9726
  */
9381
9727
 
9382
- export { AI_BACKEND_CONFIG_STORE, AI_BACKEND_ENDPOINTS, AI_BACKEND_STORAGE_OPTIONS, AI_CONTRACT_SCHEMA_HASH, AI_CONTRACT_VERSION, AI_INTENT_CONTRACT_SCHEMA_HASH, AI_INTENT_CONTRACT_VERSION, AI_STREAM_EVENT_SCHEMA_VERSION, AI_STREAM_EVENT_TYPES, AiBackendApiService, AiPatchStreamConnectionError, AiResponseValidatorService, AiRuleWizardDialogComponent, BaseAiAdapter, PRAXIS_ASSISTANT_CONTEXT_ATTACHMENT_LIMIT, PRAXIS_ASSISTANT_CONTEXT_ITEM_LIMIT, PRAXIS_ASSISTANT_CONTEXT_SCHEMA_FIELD_LIMIT, PRAXIS_ASSISTANT_CONTEXT_TEXT_LIMIT, PraxisAi, PraxisAiAssistantComponent, PraxisAiAssistantDockComponent, PraxisAiAssistantSessionHostComponent, PraxisAiAssistantShellComponent, PraxisAiService, PraxisAssistantSessionRegistryService, PraxisAssistantTurnController, PraxisAssistantTurnOrchestratorService, SchemaMinifierService, createComponentAuthoringContext, createPraxisAssistantViewportLayout, normalizeAuthoringPrompt, normalizePraxisAssistantAttachmentSummary, normalizePraxisAssistantContextSnapshot, sanitizePraxisAssistantText, shouldRoutePromptToGovernedDecision, submitPraxisAssistantQuickReply, toAiJsonObject, toPraxisAssistantClarificationOption, toPraxisAssistantConversationMessages };
9728
+ export { AI_BACKEND_CONFIG_STORE, AI_BACKEND_ENDPOINTS, AI_BACKEND_STORAGE_OPTIONS, AI_CONTRACT_SCHEMA_HASH, AI_CONTRACT_VERSION, AI_INTENT_CONTRACT_SCHEMA_HASH, AI_INTENT_CONTRACT_VERSION, AI_STREAM_EVENT_SCHEMA_VERSION, AI_STREAM_EVENT_TYPES, AiBackendApiService, AiPatchStreamConnectionError, AiResponseValidatorService, AiRuleWizardDialogComponent, BaseAiAdapter, PRAXIS_ASSISTANT_CONTEXT_ATTACHMENT_LIMIT, PRAXIS_ASSISTANT_CONTEXT_ITEM_LIMIT, PRAXIS_ASSISTANT_CONTEXT_SCHEMA_FIELD_LIMIT, PRAXIS_ASSISTANT_CONTEXT_TEXT_LIMIT, PRAXIS_ASSISTANT_VOICE_INPUT_MODE, PRAXIS_ASSISTANT_VOICE_LANGUAGE, PraxisAi, PraxisAiAssistantComponent, PraxisAiAssistantDockComponent, PraxisAiAssistantSessionHostComponent, PraxisAiAssistantShellComponent, PraxisAiService, PraxisAssistantSessionRegistryService, PraxisAssistantTurnController, PraxisAssistantTurnOrchestratorService, SchemaMinifierService, createComponentAuthoringContext, createPraxisAssistantViewportLayout, normalizeAuthoringPrompt, normalizePraxisAssistantAttachmentSummary, normalizePraxisAssistantContextSnapshot, sanitizePraxisAssistantText, shouldRoutePromptToGovernedDecision, submitPraxisAssistantQuickReply, toAiJsonObject, toPraxisAssistantClarificationOption, toPraxisAssistantConversationMessages };