@praxisui/ai 9.0.0-beta.83 → 9.0.0-beta.85

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.
@@ -1,7 +1,7 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { Component, Injectable, InjectionToken, Optional, Inject, inject, signal, computed, ChangeDetectorRef, ElementRef, ViewChild, Input, ChangeDetectionStrategy, EventEmitter, Injector, HostListener, Output, booleanAttribute } from '@angular/core';
3
3
  import { SchemaType, GoogleGenerativeAI } from '@google/generative-ai';
4
- import { throwError, from, Observable, of, defer, switchMap, Subject, tap, map as map$1, finalize, share, filter as filter$1, concat, merge, catchError as catchError$1, EMPTY, timer, takeUntil, timeout, take as take$1, BehaviorSubject, isObservable, firstValueFrom } from 'rxjs';
4
+ import { throwError, from, Observable, of, firstValueFrom, defer, switchMap, Subject, tap, map as map$1, finalize, share, filter as filter$1, concat, merge, catchError as catchError$1, EMPTY, timer, takeUntil, timeout, take as take$1, BehaviorSubject, isObservable } from 'rxjs';
5
5
  import { map, catchError, filter, take } from 'rxjs/operators';
6
6
  import { HttpClient, HttpParams, HttpHeaders, HttpErrorResponse } from '@angular/common/http';
7
7
  import { API_URL, LoggerService, PraxisRuntimeComponentObservationRegistryService } from '@praxisui/core';
@@ -403,7 +403,7 @@ function toPraxisAssistantConversationMessageRole(role) {
403
403
  * Do not edit manually. Run praxis-config-starter/tools/contracts/generate-ai-contract-bindings.js.
404
404
  */
405
405
  const AI_CONTRACT_VERSION = 'v1.1';
406
- const AI_CONTRACT_SCHEMA_HASH = '8120c06a6daa75a0ddad250da394bbc54f92128fb2d229e6c3ea848841fc768c';
406
+ const AI_CONTRACT_SCHEMA_HASH = 'f991cfb03ef0f6a283505c034a7afe40fbb089fb254d3a9251a5c35848d0a2b5';
407
407
  const AI_STREAM_EVENT_SCHEMA_VERSION = 'v1';
408
408
  const AI_DOMAIN_CATALOG_CONTEXT_HINT_SCHEMA_VERSION = 'praxis.ai.context-hints.domain-catalog/v0.2';
409
409
  const AI_STREAM_EVENT_TYPES = ['status', 'thought.step', 'heartbeat', 'intent.resolved', 'result', 'error', 'cancelled'];
@@ -1451,6 +1451,14 @@ class AiBackendApiService {
1451
1451
  getAiStatus() {
1452
1452
  return this.http.get(`${this.aiBaseUrl()}/status`, { headers: this.buildHeaders() });
1453
1453
  }
1454
+ transcribeAudio(audio, fileName, language) {
1455
+ const body = new FormData();
1456
+ body.append('audio', audio, fileName);
1457
+ if (language?.trim()) {
1458
+ body.append('language', language.trim());
1459
+ }
1460
+ return this.http.post(`${this.aiBaseUrl()}/transcriptions`, body, { headers: this.buildHeaders(), withCredentials: true });
1461
+ }
1454
1462
  getAiContext(componentId, componentType) {
1455
1463
  const params = new HttpParams({ fromObject: { componentType } });
1456
1464
  return this.http.get(`${this.aiContextBaseUrl()}/${componentId}`, { headers: this.buildHeaders(), params });
@@ -1777,6 +1785,230 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
1777
1785
  args: [{ providedIn: 'root' }]
1778
1786
  }] });
1779
1787
 
1788
+ class PraxisBrowserSpeechTranscriptionError extends Error {
1789
+ code;
1790
+ constructor(code, message) {
1791
+ super(message);
1792
+ this.code = code;
1793
+ this.name = 'PraxisBrowserSpeechTranscriptionError';
1794
+ }
1795
+ }
1796
+ class PraxisBrowserSpeechTranscriptionService {
1797
+ activeRecognition = null;
1798
+ isSupported() {
1799
+ return this.resolveCtor() !== null;
1800
+ }
1801
+ transcribe(options = {}) {
1802
+ const RecognitionCtor = this.resolveCtor();
1803
+ if (!RecognitionCtor) {
1804
+ return Promise.reject(new PraxisBrowserSpeechTranscriptionError('unsupported', 'Browser speech recognition is not supported.'));
1805
+ }
1806
+ this.cancel();
1807
+ const recognition = new RecognitionCtor();
1808
+ recognition.lang = options.lang?.trim() || this.resolveNavigatorLanguage();
1809
+ recognition.continuous = false;
1810
+ recognition.interimResults = false;
1811
+ recognition.maxAlternatives = 1;
1812
+ this.activeRecognition = recognition;
1813
+ return new Promise((resolve, reject) => {
1814
+ let transcript = '';
1815
+ let failed = false;
1816
+ const cleanup = () => {
1817
+ if (this.activeRecognition === recognition) {
1818
+ this.activeRecognition = null;
1819
+ }
1820
+ recognition.onresult = null;
1821
+ recognition.onerror = null;
1822
+ recognition.onend = null;
1823
+ };
1824
+ recognition.onresult = (event) => {
1825
+ transcript = this.extractTranscript(event).trim();
1826
+ };
1827
+ recognition.onerror = (event) => {
1828
+ failed = true;
1829
+ cleanup();
1830
+ reject(this.toTranscriptionError(event));
1831
+ };
1832
+ recognition.onend = () => {
1833
+ cleanup();
1834
+ if (failed) {
1835
+ return;
1836
+ }
1837
+ if (!transcript) {
1838
+ reject(new PraxisBrowserSpeechTranscriptionError('no-speech', 'No speech was recognized.'));
1839
+ return;
1840
+ }
1841
+ resolve({
1842
+ text: transcript,
1843
+ language: recognition.lang,
1844
+ });
1845
+ };
1846
+ try {
1847
+ recognition.start();
1848
+ }
1849
+ catch (error) {
1850
+ cleanup();
1851
+ reject(new PraxisBrowserSpeechTranscriptionError('error', error instanceof Error ? error.message : 'Failed to start browser speech recognition.'));
1852
+ }
1853
+ });
1854
+ }
1855
+ stop() {
1856
+ this.activeRecognition?.stop();
1857
+ }
1858
+ cancel() {
1859
+ this.activeRecognition?.abort();
1860
+ this.activeRecognition = null;
1861
+ }
1862
+ extractTranscript(event) {
1863
+ const segments = [];
1864
+ for (let resultIndex = 0; resultIndex < event.results.length; resultIndex++) {
1865
+ const result = event.results[resultIndex] ?? event.results.item(resultIndex);
1866
+ if (!result?.length) {
1867
+ continue;
1868
+ }
1869
+ const alternative = result[0] ?? result.item(0);
1870
+ const text = alternative?.transcript?.trim();
1871
+ if (text) {
1872
+ segments.push(text);
1873
+ }
1874
+ }
1875
+ return segments.join(' ');
1876
+ }
1877
+ toTranscriptionError(event) {
1878
+ const error = (event.error || '').toLowerCase();
1879
+ if (error === 'not-allowed' || error === 'service-not-allowed') {
1880
+ return new PraxisBrowserSpeechTranscriptionError('permission-denied', event.message || 'Browser microphone permission was denied.');
1881
+ }
1882
+ if (error === 'no-speech') {
1883
+ return new PraxisBrowserSpeechTranscriptionError('no-speech', event.message || 'No speech was recognized.');
1884
+ }
1885
+ if (error === 'aborted') {
1886
+ return new PraxisBrowserSpeechTranscriptionError('aborted', event.message || 'Browser speech recognition was aborted.');
1887
+ }
1888
+ return new PraxisBrowserSpeechTranscriptionError('error', event.message || 'Browser speech recognition failed.');
1889
+ }
1890
+ resolveCtor() {
1891
+ if (typeof window === 'undefined') {
1892
+ return null;
1893
+ }
1894
+ const speechWindow = window;
1895
+ return speechWindow.SpeechRecognition ?? speechWindow.webkitSpeechRecognition ?? null;
1896
+ }
1897
+ resolveNavigatorLanguage() {
1898
+ if (typeof navigator !== 'undefined' && navigator.language?.trim()) {
1899
+ return navigator.language.trim();
1900
+ }
1901
+ return 'pt-BR';
1902
+ }
1903
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisBrowserSpeechTranscriptionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
1904
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisBrowserSpeechTranscriptionService, providedIn: 'root' });
1905
+ }
1906
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisBrowserSpeechTranscriptionService, decorators: [{
1907
+ type: Injectable,
1908
+ args: [{ providedIn: 'root' }]
1909
+ }] });
1910
+
1911
+ class PraxisGovernedAudioTranscriptionService {
1912
+ backend = inject(AiBackendApiService);
1913
+ activeRecorder = null;
1914
+ activeStream = null;
1915
+ cancelled = false;
1916
+ isSupported() {
1917
+ return typeof navigator !== 'undefined'
1918
+ && !!navigator.mediaDevices?.getUserMedia
1919
+ && typeof MediaRecorder !== 'undefined';
1920
+ }
1921
+ async transcribe(options = {}) {
1922
+ if (!this.isSupported()) {
1923
+ throw new PraxisBrowserSpeechTranscriptionError('unsupported', 'Audio capture is not supported.');
1924
+ }
1925
+ this.cancel();
1926
+ this.cancelled = false;
1927
+ let stream;
1928
+ try {
1929
+ stream = await navigator.mediaDevices.getUserMedia({ audio: true });
1930
+ }
1931
+ catch (error) {
1932
+ throw new PraxisBrowserSpeechTranscriptionError('permission-denied', error instanceof Error ? error.message : 'Microphone permission was denied.');
1933
+ }
1934
+ this.activeStream = stream;
1935
+ const mimeType = this.resolveMimeType();
1936
+ const recorder = mimeType ? new MediaRecorder(stream, { mimeType }) : new MediaRecorder(stream);
1937
+ this.activeRecorder = recorder;
1938
+ const chunks = [];
1939
+ return new Promise((resolve, reject) => {
1940
+ recorder.ondataavailable = (event) => {
1941
+ if (event.data.size > 0)
1942
+ chunks.push(event.data);
1943
+ };
1944
+ recorder.onerror = () => {
1945
+ this.cleanup(recorder, stream);
1946
+ reject(new PraxisBrowserSpeechTranscriptionError('error', 'Audio capture failed.'));
1947
+ };
1948
+ recorder.onstop = () => {
1949
+ const cancelled = this.cancelled;
1950
+ this.cleanup(recorder, stream);
1951
+ if (cancelled) {
1952
+ reject(new PraxisBrowserSpeechTranscriptionError('aborted', 'Audio capture was cancelled.'));
1953
+ return;
1954
+ }
1955
+ const audio = new Blob(chunks, { type: recorder.mimeType || mimeType || 'audio/webm' });
1956
+ if (!audio.size) {
1957
+ reject(new PraxisBrowserSpeechTranscriptionError('no-speech', 'No audio was captured.'));
1958
+ return;
1959
+ }
1960
+ const extension = audio.type.includes('mp4') ? 'm4a' : audio.type.includes('ogg') ? 'ogg' : 'webm';
1961
+ void firstValueFrom(this.backend.transcribeAudio(audio, `praxis-voice.${extension}`, options.lang))
1962
+ .then((response) => {
1963
+ if (!response.text?.trim()) {
1964
+ throw new PraxisBrowserSpeechTranscriptionError('no-speech', 'No speech was recognized.');
1965
+ }
1966
+ resolve({ text: response.text.trim(), language: response.language ?? options.lang });
1967
+ })
1968
+ .catch((error) => reject(error instanceof PraxisBrowserSpeechTranscriptionError
1969
+ ? error
1970
+ : new PraxisBrowserSpeechTranscriptionError('error', 'Governed transcription failed.')));
1971
+ };
1972
+ recorder.start();
1973
+ });
1974
+ }
1975
+ stop() {
1976
+ if (this.activeRecorder?.state === 'recording')
1977
+ this.activeRecorder.stop();
1978
+ }
1979
+ cancel() {
1980
+ this.cancelled = true;
1981
+ if (this.activeRecorder?.state === 'recording')
1982
+ this.activeRecorder.stop();
1983
+ this.stopTracks(this.activeStream);
1984
+ this.activeRecorder = null;
1985
+ this.activeStream = null;
1986
+ }
1987
+ resolveMimeType() {
1988
+ return ['audio/mp4', 'audio/webm;codecs=opus', 'audio/webm', 'audio/ogg;codecs=opus']
1989
+ .find((type) => MediaRecorder.isTypeSupported(type)) ?? '';
1990
+ }
1991
+ cleanup(recorder, stream) {
1992
+ recorder.ondataavailable = null;
1993
+ recorder.onerror = null;
1994
+ recorder.onstop = null;
1995
+ this.stopTracks(stream);
1996
+ if (this.activeRecorder === recorder)
1997
+ this.activeRecorder = null;
1998
+ if (this.activeStream === stream)
1999
+ this.activeStream = null;
2000
+ }
2001
+ stopTracks(stream) {
2002
+ stream?.getTracks().forEach((track) => track.stop());
2003
+ }
2004
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisGovernedAudioTranscriptionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
2005
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisGovernedAudioTranscriptionService, providedIn: 'root' });
2006
+ }
2007
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisGovernedAudioTranscriptionService, decorators: [{
2008
+ type: Injectable,
2009
+ args: [{ providedIn: 'root' }]
2010
+ }] });
2011
+
1780
2012
  class AgenticAuthoringTurnClientService {
1781
2013
  aiApi = inject(AiBackendApiService);
1782
2014
  logger = inject(LoggerService, { optional: true });
@@ -2940,6 +3172,9 @@ class PraxisAssistantTurnController {
2940
3172
  }
2941
3173
  const current = this.stateSubject.value;
2942
3174
  const effectiveAction = this.resolveSubmitAction(action, current);
3175
+ const pendingClarification = current.state === 'clarification'
3176
+ ? current.pendingClarification
3177
+ : undefined;
2943
3178
  const clientTurnId = this.createId('turn');
2944
3179
  const displayPrompt = typeof effectiveAction.displayPrompt === 'string'
2945
3180
  ? effectiveAction.displayPrompt.trim()
@@ -2956,7 +3191,7 @@ class PraxisAssistantTurnController {
2956
3191
  prompt: normalized,
2957
3192
  action: effectiveAction,
2958
3193
  phase: 'contextualize',
2959
- pendingClarification: current.pendingClarification,
3194
+ pendingClarification,
2960
3195
  });
2961
3196
  }
2962
3197
  answerClarification(option) {
@@ -3440,7 +3675,13 @@ function toPraxisAssistantClarificationOption(reply) {
3440
3675
  function submitPraxisAssistantQuickReply(controller, reply) {
3441
3676
  const state = controller.snapshot();
3442
3677
  const prompt = canonicalQuickReplyPrompt(reply);
3443
- const contextHints = cloneRecord(reply.contextHints);
3678
+ const semanticDecision = cloneRecord(reply.semanticDecision);
3679
+ const canonicalAction = cloneRecord(reply.canonicalAction);
3680
+ const contextHints = {
3681
+ ...(cloneRecord(reply.contextHints) ?? {}),
3682
+ ...(canonicalAction ? { canonicalAction } : {}),
3683
+ ...(semanticDecision ? { semanticDecision } : {}),
3684
+ };
3444
3685
  if (state.state === 'clarification') {
3445
3686
  return controller.answerClarification(toPraxisAssistantClarificationOption(reply));
3446
3687
  }
@@ -3449,7 +3690,8 @@ function submitPraxisAssistantQuickReply(controller, reply) {
3449
3690
  id: reply.id,
3450
3691
  value: cloneValue(reply.value) ?? prompt,
3451
3692
  displayPrompt: reply.label,
3452
- contextHints,
3693
+ contextHints: Object.keys(contextHints).length ? contextHints : undefined,
3694
+ activeSemanticDecision: semanticDecision,
3453
3695
  });
3454
3696
  }
3455
3697
  function canonicalQuickReplyPrompt(reply) {
@@ -7778,129 +8020,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
7778
8020
  args: ['inputEl']
7779
8021
  }] } });
7780
8022
 
7781
- class PraxisBrowserSpeechTranscriptionError extends Error {
7782
- code;
7783
- constructor(code, message) {
7784
- super(message);
7785
- this.code = code;
7786
- this.name = 'PraxisBrowserSpeechTranscriptionError';
7787
- }
7788
- }
7789
- class PraxisBrowserSpeechTranscriptionService {
7790
- activeRecognition = null;
7791
- isSupported() {
7792
- return this.resolveCtor() !== null;
7793
- }
7794
- transcribe(options = {}) {
7795
- const RecognitionCtor = this.resolveCtor();
7796
- if (!RecognitionCtor) {
7797
- return Promise.reject(new PraxisBrowserSpeechTranscriptionError('unsupported', 'Browser speech recognition is not supported.'));
7798
- }
7799
- this.cancel();
7800
- const recognition = new RecognitionCtor();
7801
- recognition.lang = options.lang?.trim() || this.resolveNavigatorLanguage();
7802
- recognition.continuous = false;
7803
- recognition.interimResults = false;
7804
- recognition.maxAlternatives = 1;
7805
- this.activeRecognition = recognition;
7806
- return new Promise((resolve, reject) => {
7807
- let transcript = '';
7808
- let failed = false;
7809
- const cleanup = () => {
7810
- if (this.activeRecognition === recognition) {
7811
- this.activeRecognition = null;
7812
- }
7813
- recognition.onresult = null;
7814
- recognition.onerror = null;
7815
- recognition.onend = null;
7816
- };
7817
- recognition.onresult = (event) => {
7818
- transcript = this.extractTranscript(event).trim();
7819
- };
7820
- recognition.onerror = (event) => {
7821
- failed = true;
7822
- cleanup();
7823
- reject(this.toTranscriptionError(event));
7824
- };
7825
- recognition.onend = () => {
7826
- cleanup();
7827
- if (failed) {
7828
- return;
7829
- }
7830
- if (!transcript) {
7831
- reject(new PraxisBrowserSpeechTranscriptionError('no-speech', 'No speech was recognized.'));
7832
- return;
7833
- }
7834
- resolve({
7835
- text: transcript,
7836
- language: recognition.lang,
7837
- });
7838
- };
7839
- try {
7840
- recognition.start();
7841
- }
7842
- catch (error) {
7843
- cleanup();
7844
- reject(new PraxisBrowserSpeechTranscriptionError('error', error instanceof Error ? error.message : 'Failed to start browser speech recognition.'));
7845
- }
7846
- });
7847
- }
7848
- stop() {
7849
- this.activeRecognition?.stop();
7850
- }
7851
- cancel() {
7852
- this.activeRecognition?.abort();
7853
- this.activeRecognition = null;
7854
- }
7855
- extractTranscript(event) {
7856
- const segments = [];
7857
- for (let resultIndex = 0; resultIndex < event.results.length; resultIndex++) {
7858
- const result = event.results[resultIndex] ?? event.results.item(resultIndex);
7859
- if (!result?.length) {
7860
- continue;
7861
- }
7862
- const alternative = result[0] ?? result.item(0);
7863
- const text = alternative?.transcript?.trim();
7864
- if (text) {
7865
- segments.push(text);
7866
- }
7867
- }
7868
- return segments.join(' ');
7869
- }
7870
- toTranscriptionError(event) {
7871
- const error = (event.error || '').toLowerCase();
7872
- if (error === 'not-allowed' || error === 'service-not-allowed') {
7873
- return new PraxisBrowserSpeechTranscriptionError('permission-denied', event.message || 'Browser microphone permission was denied.');
7874
- }
7875
- if (error === 'no-speech') {
7876
- return new PraxisBrowserSpeechTranscriptionError('no-speech', event.message || 'No speech was recognized.');
7877
- }
7878
- if (error === 'aborted') {
7879
- return new PraxisBrowserSpeechTranscriptionError('aborted', event.message || 'Browser speech recognition was aborted.');
7880
- }
7881
- return new PraxisBrowserSpeechTranscriptionError('error', event.message || 'Browser speech recognition failed.');
7882
- }
7883
- resolveCtor() {
7884
- if (typeof window === 'undefined') {
7885
- return null;
7886
- }
7887
- const speechWindow = window;
7888
- return speechWindow.SpeechRecognition ?? speechWindow.webkitSpeechRecognition ?? null;
7889
- }
7890
- resolveNavigatorLanguage() {
7891
- if (typeof navigator !== 'undefined' && navigator.language?.trim()) {
7892
- return navigator.language.trim();
7893
- }
7894
- return 'pt-BR';
7895
- }
7896
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisBrowserSpeechTranscriptionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
7897
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisBrowserSpeechTranscriptionService, providedIn: 'root' });
7898
- }
7899
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisBrowserSpeechTranscriptionService, decorators: [{
7900
- type: Injectable,
7901
- args: [{ providedIn: 'root' }]
7902
- }] });
7903
-
7904
8023
  const PRAXIS_ASSISTANT_VOICE_INPUT_MODE = new InjectionToken('PRAXIS_ASSISTANT_VOICE_INPUT_MODE', {
7905
8024
  providedIn: 'root',
7906
8025
  factory: () => 'disabled',
@@ -7948,6 +8067,7 @@ const DEFAULT_LABELS = {
7948
8067
  voiceStop: 'Parar ditado',
7949
8068
  voiceListening: 'Ouvindo...',
7950
8069
  voiceUnsupported: 'Ditado pelo navegador indisponível',
8070
+ voiceFailed: 'Não foi possível transcrever o áudio. Tente novamente.',
7951
8071
  voicePermissionDenied: 'Permissão do microfone negada pelo navegador.',
7952
8072
  voiceNoSpeech: 'Nenhuma fala reconhecida.',
7953
8073
  modeConfig: 'Configuração',
@@ -8026,6 +8146,7 @@ class PraxisAiAssistantShellComponent {
8026
8146
  cdr = inject(ChangeDetectorRef);
8027
8147
  injector = inject(Injector);
8028
8148
  browserSpeech = inject(PraxisBrowserSpeechTranscriptionService);
8149
+ governedSpeech = inject(PraxisGovernedAudioTranscriptionService);
8029
8150
  currentPrompt = '';
8030
8151
  resolvedLabels = DEFAULT_LABELS;
8031
8152
  voiceCaptureState = 'idle';
@@ -8044,7 +8165,10 @@ class PraxisAiAssistantShellComponent {
8044
8165
  onWindowPointerUp = (event) => this.finishPointerSession(event);
8045
8166
  ngAfterViewInit() {
8046
8167
  queueMicrotask(() => {
8047
- if (this.destroyed || this.busy)
8168
+ if (this.destroyed)
8169
+ return;
8170
+ this.resizePromptToContent();
8171
+ if (this.busy)
8048
8172
  return;
8049
8173
  this.promptInput?.nativeElement.focus({ preventScroll: true });
8050
8174
  });
@@ -8052,6 +8176,7 @@ class PraxisAiAssistantShellComponent {
8052
8176
  ngOnChanges(changes) {
8053
8177
  if (changes['prompt']) {
8054
8178
  this.currentPrompt = this.prompt ?? '';
8179
+ this.schedulePromptResize();
8055
8180
  }
8056
8181
  if (changes['labels']) {
8057
8182
  this.resolvedLabels = {
@@ -8068,7 +8193,7 @@ class PraxisAiAssistantShellComponent {
8068
8193
  if (changes['attachments']) {
8069
8194
  this.revokeDetachedPastedPreviewUrls();
8070
8195
  }
8071
- if (changes['voiceInputMode'] && this.voiceInputMode !== 'browser-speech') {
8196
+ if (changes['voiceInputMode'] && !changes['voiceInputMode'].firstChange) {
8072
8197
  this.cancelVoiceCapture();
8073
8198
  }
8074
8199
  if (changes['state'] || changes['busy']) {
@@ -8081,6 +8206,7 @@ class PraxisAiAssistantShellComponent {
8081
8206
  this.stopProcessingTimer();
8082
8207
  this.detachPointerListeners();
8083
8208
  this.browserSpeech.cancel();
8209
+ this.governedSpeech.cancel();
8084
8210
  this.revokeAllOwnedPreviewUrls();
8085
8211
  }
8086
8212
  onViewportResize() {
@@ -8093,6 +8219,14 @@ class PraxisAiAssistantShellComponent {
8093
8219
  this.currentPrompt = value;
8094
8220
  this.promptChange.emit(value);
8095
8221
  }
8222
+ resizePromptToContent() {
8223
+ const prompt = this.promptInput?.nativeElement;
8224
+ if (!prompt)
8225
+ return;
8226
+ prompt.style.height = 'auto';
8227
+ prompt.style.height = `${Math.min(prompt.scrollHeight, 160)}px`;
8228
+ prompt.style.overflowY = prompt.scrollHeight > 160 ? 'auto' : 'hidden';
8229
+ }
8096
8230
  onSubmit() {
8097
8231
  const value = this.currentPrompt.trim();
8098
8232
  if (!value || this.busy || !this.canSubmit)
@@ -8123,7 +8257,7 @@ class PraxisAiAssistantShellComponent {
8123
8257
  if (this.isVoiceInputBusy()) {
8124
8258
  this.voiceCaptureState = 'stopping';
8125
8259
  this.voiceFeedbackText = this.getVoiceLabel('voiceListening');
8126
- this.browserSpeech.stop();
8260
+ this.activeVoiceService().stop();
8127
8261
  return;
8128
8262
  }
8129
8263
  if (!this.canUseBrowserSpeech()) {
@@ -8135,7 +8269,7 @@ class PraxisAiAssistantShellComponent {
8135
8269
  this.voiceFeedbackText = this.getVoiceLabel('voiceListening');
8136
8270
  this.cdr.markForCheck();
8137
8271
  const captureSequence = ++this.voiceCaptureSequence;
8138
- void this.browserSpeech.transcribe({ lang: this.voiceLanguage }).then((result) => {
8272
+ void this.activeVoiceService().transcribe({ lang: this.voiceLanguage }).then((result) => {
8139
8273
  if (!this.isCurrentVoiceCapture(captureSequence)) {
8140
8274
  return;
8141
8275
  }
@@ -8159,7 +8293,7 @@ class PraxisAiAssistantShellComponent {
8159
8293
  });
8160
8294
  }
8161
8295
  shouldShowVoiceInput() {
8162
- return this.voiceInputMode === 'browser-speech';
8296
+ return this.voiceInputMode !== 'disabled';
8163
8297
  }
8164
8298
  isVoiceInputDisabled() {
8165
8299
  return (this.busy && !this.isVoiceInputBusy()) || (!this.isVoiceInputBusy() && !this.canUseBrowserSpeech());
@@ -8179,19 +8313,25 @@ class PraxisAiAssistantShellComponent {
8179
8313
  return !!this.voiceFeedbackText.trim();
8180
8314
  }
8181
8315
  canUseBrowserSpeech() {
8182
- return this.voiceInputMode === 'browser-speech' && this.browserSpeech.isSupported();
8316
+ return this.voiceInputMode === 'browser-speech'
8317
+ ? this.browserSpeech.isSupported()
8318
+ : this.voiceInputMode === 'governed-transcription' && this.governedSpeech.isSupported();
8183
8319
  }
8184
8320
  cancelVoiceCapture() {
8185
8321
  this.voiceCaptureSequence++;
8186
8322
  this.browserSpeech.cancel();
8323
+ this.governedSpeech.cancel();
8187
8324
  this.voiceCaptureState = 'idle';
8188
8325
  this.voiceFeedbackText = '';
8189
8326
  }
8190
8327
  isCurrentVoiceCapture(captureSequence) {
8191
8328
  return !this.destroyed
8192
- && this.voiceInputMode === 'browser-speech'
8329
+ && this.voiceInputMode !== 'disabled'
8193
8330
  && captureSequence === this.voiceCaptureSequence;
8194
8331
  }
8332
+ activeVoiceService() {
8333
+ return this.voiceInputMode === 'governed-transcription' ? this.governedSpeech : this.browserSpeech;
8334
+ }
8195
8335
  applyVoiceTranscript(text) {
8196
8336
  const transcript = text.trim();
8197
8337
  if (!transcript) {
@@ -8201,6 +8341,14 @@ class PraxisAiAssistantShellComponent {
8201
8341
  const next = current ? `${current}\n${transcript}` : transcript;
8202
8342
  this.currentPrompt = next;
8203
8343
  this.promptChange.emit(next);
8344
+ this.schedulePromptResize();
8345
+ }
8346
+ schedulePromptResize() {
8347
+ queueMicrotask(() => {
8348
+ if (!this.destroyed) {
8349
+ this.resizePromptToContent();
8350
+ }
8351
+ });
8204
8352
  }
8205
8353
  resolveVoiceErrorText(error) {
8206
8354
  if (error instanceof PraxisBrowserSpeechTranscriptionError) {
@@ -8215,10 +8363,10 @@ class PraxisAiAssistantShellComponent {
8215
8363
  return '';
8216
8364
  case 'error':
8217
8365
  default:
8218
- return this.getVoiceLabel('voiceUnsupported');
8366
+ return this.getVoiceLabel('voiceFailed');
8219
8367
  }
8220
8368
  }
8221
- return this.getVoiceLabel('voiceUnsupported');
8369
+ return this.getVoiceLabel('voiceFailed');
8222
8370
  }
8223
8371
  getVoiceLabel(key) {
8224
8372
  return this.resolvedLabels[key] ?? DEFAULT_LABELS[key] ?? '';
@@ -8251,13 +8399,21 @@ class PraxisAiAssistantShellComponent {
8251
8399
  renderMessageText(text) {
8252
8400
  const lines = (text ?? '').replace(/\r\n?/g, '\n').split('\n');
8253
8401
  const html = [];
8254
- let listOpen = false;
8402
+ let listType = null;
8255
8403
  const closeList = () => {
8256
- if (listOpen) {
8257
- html.push('</ul>');
8258
- listOpen = false;
8404
+ if (listType) {
8405
+ html.push(`</${listType}>`);
8406
+ listType = null;
8259
8407
  }
8260
8408
  };
8409
+ const appendListItem = (type, value) => {
8410
+ if (listType !== type) {
8411
+ closeList();
8412
+ html.push(`<${type}>`);
8413
+ listType = type;
8414
+ }
8415
+ html.push(`<li>${this.renderInlineMarkdown(value)}</li>`);
8416
+ };
8261
8417
  for (const rawLine of lines) {
8262
8418
  const line = rawLine.trim();
8263
8419
  if (!line) {
@@ -8273,11 +8429,12 @@ class PraxisAiAssistantShellComponent {
8273
8429
  }
8274
8430
  const bullet = line.match(/^[-*]\s+(.+)$/);
8275
8431
  if (bullet) {
8276
- if (!listOpen) {
8277
- html.push('<ul>');
8278
- listOpen = true;
8279
- }
8280
- html.push(`<li>${this.renderInlineMarkdown(bullet[1])}</li>`);
8432
+ appendListItem('ul', bullet[1]);
8433
+ continue;
8434
+ }
8435
+ const ordered = line.match(/^\d+[.)]\s+(.+)$/);
8436
+ if (ordered) {
8437
+ appendListItem('ol', ordered[1]);
8281
8438
  continue;
8282
8439
  }
8283
8440
  closeList();
@@ -8730,6 +8887,8 @@ class PraxisAiAssistantShellComponent {
8730
8887
  ].filter(Boolean).join('\n');
8731
8888
  }
8732
8889
  isRichQuickReply(reply) {
8890
+ if (this.isConversationQuickActionQuickReply(reply))
8891
+ return false;
8733
8892
  return Boolean(this.getQuickReplyDescription(reply)
8734
8893
  || this.getQuickReplyPresentationItems(reply).length
8735
8894
  || this.getQuickReplyContextChips(reply).length);
@@ -9096,6 +9255,9 @@ class PraxisAiAssistantShellComponent {
9096
9255
  || this.quickReplyPresentation(reply)?.description?.trim());
9097
9256
  return kind === 'clarification-option' && hasActionPresentation;
9098
9257
  }
9258
+ isConversationQuickActionQuickReply(reply) {
9259
+ return this.quickReplyPresentationKind(reply) === 'quick-action';
9260
+ }
9099
9261
  quickReplyPresentation(reply) {
9100
9262
  const presentation = reply.presentation;
9101
9263
  return presentation && typeof presentation === 'object' && !Array.isArray(presentation)
@@ -9653,7 +9815,7 @@ class PraxisAiAssistantShellComponent {
9653
9815
  this.ownedPreviewUrls.delete(previewUrl);
9654
9816
  }
9655
9817
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisAiAssistantShellComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
9656
- 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" }, host: { listeners: { "window:resize": "onViewportResize()" } }, providers: [PraxisBrowserSpeechTranscriptionService], viewQueries: [{ propertyName: "panel", first: true, predicate: ["panel"], descendants: true, static: true }, { propertyName: "conversation", first: true, predicate: ["conversation"], descendants: true }, { propertyName: "promptInput", first: true, predicate: ["promptInput"], 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 [attr.data-mode]=\"mode\"\n [attr.data-state]=\"state\"\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\">{{ getContextItemValue(item) }}</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 >\n @if (hasStructuredAssistantContent(message)) {\n <div class=\"praxis-ai-assistant-shell__assistant-content\">\n @for (block of getAssistantContentBlocks(message); track trackAssistantContentBlock($index, block)) {\n @switch (getAssistantContentBlockType(block)) {\n @case ('paragraph') {\n <section class=\"praxis-ai-assistant-shell__assistant-block praxis-ai-assistant-shell__assistant-block--summary\">\n <span class=\"praxis-ai-assistant-shell__assistant-block-icon\" aria-hidden=\"true\">\n <mat-icon>lightbulb</mat-icon>\n </span>\n <div\n class=\"praxis-ai-assistant-shell__assistant-block-copy\"\n [innerHTML]=\"renderMessageText(getAssistantContentBlockText(block))\"\n ></div>\n </section>\n }\n @case ('resource-list') {\n <section class=\"praxis-ai-assistant-shell__assistant-block\">\n <div class=\"praxis-ai-assistant-shell__assistant-block-heading\">\n <mat-icon aria-hidden=\"true\">database</mat-icon>\n <span>{{ getAssistantContentBlockTitle(block, 'Fontes confirmadas') }}</span>\n </div>\n <div class=\"praxis-ai-assistant-shell__assistant-resources\">\n @for (resource of getAssistantContentResources(block); track trackAssistantContentResource($index, resource)) {\n <article class=\"praxis-ai-assistant-shell__assistant-resource\">\n <div class=\"praxis-ai-assistant-shell__assistant-resource-head\">\n <strong>{{ resource.label }}</strong>\n @if (getAssistantContentResourceMeta(resource).length) {\n <span class=\"praxis-ai-assistant-shell__assistant-resource-meta\">\n @for (item of getAssistantContentResourceMeta(resource); track trackAssistantContentValue($index, item)) {\n <span>{{ item }}</span>\n }\n </span>\n }\n </div>\n @if (resource.description) {\n <p>{{ resource.description }}</p>\n }\n @if (resource.fields.length) {\n <div class=\"praxis-ai-assistant-shell__assistant-field-list\" aria-label=\"Campos dispon\u00EDveis\">\n @for (field of resource.fields; track trackAssistantContentField($index, field)) {\n <span\n class=\"praxis-ai-assistant-shell__assistant-field\"\n [matTooltip]=\"field.description || field.name\"\n >\n {{ field.label }}\n </span>\n }\n </div>\n }\n @if (resource.evidence.length) {\n <div class=\"praxis-ai-assistant-shell__assistant-evidence\" aria-label=\"Evid\u00EAncias\">\n @for (item of resource.evidence; track trackAssistantContentValue($index, item)) {\n <span>\n <mat-icon aria-hidden=\"true\">verified</mat-icon>\n {{ item }}\n </span>\n }\n </div>\n }\n </article>\n }\n </div>\n </section>\n }\n @case ('recommendation') {\n <section class=\"praxis-ai-assistant-shell__assistant-block praxis-ai-assistant-shell__assistant-block--recommendation\">\n <span class=\"praxis-ai-assistant-shell__assistant-block-icon\" aria-hidden=\"true\">\n <mat-icon>recommend</mat-icon>\n </span>\n <div class=\"praxis-ai-assistant-shell__assistant-block-copy\">\n <strong>{{ getAssistantContentBlockTitle(block, 'Recomenda\u00E7\u00E3o') }}</strong>\n <p>{{ getAssistantContentBlockText(block) }}</p>\n </div>\n </section>\n }\n }\n }\n </div>\n } @else {\n <div [innerHTML]=\"renderMessageText(message.text)\"></div>\n }\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 [class.praxis-ai-assistant-shell__quick-reply--source-review]=\"isSourceReviewQuickReply(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\">{{ getQuickReplyLabel(reply) }}</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 {{ getAuxiliaryStatusText() }}\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 #promptInput\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;position:fixed;inset:0;z-index:var(--praxis-ai-assistant-shell-z-index, 1200);pointer-events:none}.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:0;min-height:0;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);pointer-events:auto;z-index:var(--praxis-ai-assistant-shell-z-index, 1200);container-type:inline-size}.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;scrollbar-width:thin}.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__assistant-content{display:grid;gap:8px}.praxis-ai-assistant-shell__assistant-block{display:grid;gap:8px;min-width:0}.praxis-ai-assistant-shell__assistant-block--summary,.praxis-ai-assistant-shell__assistant-block--recommendation{grid-template-columns:auto minmax(0,1fr);align-items:flex-start;padding:9px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 22%,transparent);border-radius:8px;background:color-mix(in srgb,var(--md-sys-color-primary) 7%,transparent)}.praxis-ai-assistant-shell__assistant-block--recommendation{border-color:color-mix(in srgb,var(--praxis-ai-assistant-shell-tone-success) 26%,transparent);background:color-mix(in srgb,var(--praxis-ai-assistant-shell-tone-success) 8%,transparent)}.praxis-ai-assistant-shell__assistant-block-icon{display:grid;place-items:center;width:24px;height:24px;border-radius:8px;color:var(--md-sys-color-primary);background:color-mix(in srgb,var(--md-sys-color-primary) 14%,transparent)}.praxis-ai-assistant-shell__assistant-block--recommendation .praxis-ai-assistant-shell__assistant-block-icon{color:var(--praxis-ai-assistant-shell-tone-success);background:color-mix(in srgb,var(--praxis-ai-assistant-shell-tone-success) 14%,transparent)}.praxis-ai-assistant-shell__assistant-block-icon mat-icon{width:16px;height:16px;font-size:16px;line-height:16px}.praxis-ai-assistant-shell__assistant-block-copy{min-width:0}.praxis-ai-assistant-shell__assistant-block-copy strong{display:block;margin-bottom:3px}.praxis-ai-assistant-shell__assistant-block-heading{display:inline-flex;align-items:center;gap:6px;color:var(--md-sys-color-on-surface);font-size:12px;font-weight:700}.praxis-ai-assistant-shell__assistant-block-heading mat-icon{width:16px;height:16px;color:var(--md-sys-color-primary);font-size:16px}.praxis-ai-assistant-shell__assistant-resources{display:grid;gap:7px}.praxis-ai-assistant-shell__assistant-resource{display:grid;gap:7px;min-width:0;padding:9px;border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant) 76%,transparent);border-radius:8px;background:color-mix(in srgb,var(--md-sys-color-surface-container-highest) 74%,transparent)}.praxis-ai-assistant-shell__assistant-resource-head{display:flex;align-items:flex-start;justify-content:space-between;gap:8px;min-width:0}.praxis-ai-assistant-shell__assistant-resource-head strong{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.praxis-ai-assistant-shell__assistant-resource-meta,.praxis-ai-assistant-shell__assistant-field-list,.praxis-ai-assistant-shell__assistant-evidence{display:flex;flex-wrap:wrap;gap:5px}.praxis-ai-assistant-shell__assistant-resource-meta span,.praxis-ai-assistant-shell__assistant-field,.praxis-ai-assistant-shell__assistant-evidence span{display:inline-flex;align-items:center;gap:4px;min-width:0;max-width:100%;padding:3px 6px;border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant) 62%,transparent);border-radius:999px;color:var(--md-sys-color-on-surface-variant);background:color-mix(in srgb,var(--md-sys-color-surface-container-low) 82%,transparent);font-size:11px;line-height:1.25}.praxis-ai-assistant-shell__assistant-field{color:color-mix(in srgb,var(--md-sys-color-primary) 88%,var(--md-sys-color-on-surface));background:color-mix(in srgb,var(--md-sys-color-primary) 9%,transparent);border-color:color-mix(in srgb,var(--md-sys-color-primary) 22%,transparent)}.praxis-ai-assistant-shell__assistant-evidence span{color:color-mix(in srgb,var(--praxis-ai-assistant-shell-tone-success) 85%,var(--md-sys-color-on-surface));background:color-mix(in srgb,var(--praxis-ai-assistant-shell-tone-success) 9%,transparent);border-color:color-mix(in srgb,var(--praxis-ai-assistant-shell-tone-success) 22%,transparent)}.praxis-ai-assistant-shell__assistant-evidence mat-icon{width:13px;height:13px;font-size:13px}.praxis-ai-assistant-shell__assistant-resource p{margin:0;color:var(--md-sys-color-on-surface-variant)}.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--source-review{padding:11px 12px;border-color:color-mix(in srgb,var(--md-sys-color-outline-variant) 88%,transparent);border-radius:8px;background:linear-gradient(90deg,color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 7%,transparent),transparent 58%),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,.praxis-ai-assistant-shell__quick-reply--source-review:hover:not(:disabled),.praxis-ai-assistant-shell__quick-reply--source-review: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,.praxis-ai-assistant-shell__quick-reply--source-review .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,.praxis-ai-assistant-shell__quick-reply--source-review ::ng-deep .mdc-button__label{gap:10px;align-items:flex-start}.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,.praxis-ai-assistant-shell__quick-reply--source-review .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,.praxis-ai-assistant-shell__quick-reply--source-review .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,.praxis-ai-assistant-shell__quick-reply--source-review .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,.praxis-ai-assistant-shell__quick-reply--source-review .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,.praxis-ai-assistant-shell__quick-reply--source-review .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,.praxis-ai-assistant-shell__quick-reply--source-review .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,.praxis-ai-assistant-shell__quick-reply--source-review .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,.praxis-ai-assistant-shell__quick-reply--source-review .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,.praxis-ai-assistant-shell__quick-reply--source-review .praxis-ai-assistant-shell__quick-reply-cta{color:var(--md-sys-color-primary)}.praxis-ai-assistant-shell__quick-reply--source-review .praxis-ai-assistant-shell__quick-reply-context{gap:5px}.praxis-ai-assistant-shell__quick-reply--source-review .praxis-ai-assistant-shell__quick-reply-context-chip{border-radius:8px;padding:4px 7px;background:color-mix(in srgb,var(--md-sys-color-surface-container-lowest) 66%,transparent);font-size:10.5px;font-weight:650}.praxis-ai-assistant-shell__quick-reply--source-review .praxis-ai-assistant-shell__quick-reply-actions{max-width:40%}.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,.praxis-ai-assistant-shell__quick-reply--source-review .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__context{flex-wrap:wrap;overflow-x:visible}.praxis-ai-assistant-shell__context-item{max-width:min(100%,240px)}.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)}}@container (max-width: 400px){.praxis-ai-assistant-shell__header{display:grid;grid-template-columns:auto minmax(0,1fr) auto}.praxis-ai-assistant-shell__title-row{display:grid;gap:5px}.praxis-ai-assistant-shell__badges{justify-content:flex-start}.praxis-ai-assistant-shell__badge{max-width:100%}.praxis-ai-assistant-shell__context{flex-wrap:wrap;overflow-x:visible}.praxis-ai-assistant-shell__context-item{flex:1 1 150px;max-width:100%}.praxis-ai-assistant-shell__context-label,.praxis-ai-assistant-shell__context-value{overflow:visible;text-overflow:clip;white-space:normal;overflow-wrap:anywhere}.praxis-ai-assistant-shell__recommended-title-row,.praxis-ai-assistant-shell__assistant-resource-head{display:grid;justify-content:stretch}.praxis-ai-assistant-shell__recommended-group{max-width:100%;width:fit-content}.praxis-ai-assistant-shell__assistant-resource-head strong{overflow:visible;text-overflow:clip;white-space:normal;overflow-wrap:anywhere}}.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 });
9818
+ 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" }, host: { listeners: { "window:resize": "onViewportResize()" } }, providers: [PraxisBrowserSpeechTranscriptionService], viewQueries: [{ propertyName: "panel", first: true, predicate: ["panel"], descendants: true, static: true }, { propertyName: "conversation", first: true, predicate: ["conversation"], descendants: true }, { propertyName: "promptInput", first: true, predicate: ["promptInput"], 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 [attr.data-mode]=\"mode\"\n [attr.data-state]=\"state\"\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\">{{ getContextItemValue(item) }}</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 >\n @if (hasStructuredAssistantContent(message)) {\n <div class=\"praxis-ai-assistant-shell__assistant-content\">\n @for (block of getAssistantContentBlocks(message); track trackAssistantContentBlock($index, block)) {\n @switch (getAssistantContentBlockType(block)) {\n @case ('paragraph') {\n <section class=\"praxis-ai-assistant-shell__assistant-block praxis-ai-assistant-shell__assistant-block--summary\">\n <span class=\"praxis-ai-assistant-shell__assistant-block-icon\" aria-hidden=\"true\">\n <mat-icon>lightbulb</mat-icon>\n </span>\n <div\n class=\"praxis-ai-assistant-shell__assistant-block-copy\"\n [innerHTML]=\"renderMessageText(getAssistantContentBlockText(block))\"\n ></div>\n </section>\n }\n @case ('resource-list') {\n <section class=\"praxis-ai-assistant-shell__assistant-block\">\n <div class=\"praxis-ai-assistant-shell__assistant-block-heading\">\n <mat-icon aria-hidden=\"true\">database</mat-icon>\n <span>{{ getAssistantContentBlockTitle(block, 'Fontes confirmadas') }}</span>\n </div>\n <div class=\"praxis-ai-assistant-shell__assistant-resources\">\n @for (resource of getAssistantContentResources(block); track trackAssistantContentResource($index, resource)) {\n <article class=\"praxis-ai-assistant-shell__assistant-resource\">\n <div class=\"praxis-ai-assistant-shell__assistant-resource-head\">\n <strong>{{ resource.label }}</strong>\n @if (getAssistantContentResourceMeta(resource).length) {\n <span class=\"praxis-ai-assistant-shell__assistant-resource-meta\">\n @for (item of getAssistantContentResourceMeta(resource); track trackAssistantContentValue($index, item)) {\n <span>{{ item }}</span>\n }\n </span>\n }\n </div>\n @if (resource.description) {\n <p>{{ resource.description }}</p>\n }\n @if (resource.fields.length) {\n <div class=\"praxis-ai-assistant-shell__assistant-field-list\" aria-label=\"Campos dispon\u00EDveis\">\n @for (field of resource.fields; track trackAssistantContentField($index, field)) {\n <span\n class=\"praxis-ai-assistant-shell__assistant-field\"\n [matTooltip]=\"field.description || field.name\"\n >\n {{ field.label }}\n </span>\n }\n </div>\n }\n @if (resource.evidence.length) {\n <div class=\"praxis-ai-assistant-shell__assistant-evidence\" aria-label=\"Evid\u00EAncias\">\n @for (item of resource.evidence; track trackAssistantContentValue($index, item)) {\n <span>\n <mat-icon aria-hidden=\"true\">verified</mat-icon>\n {{ item }}\n </span>\n }\n </div>\n }\n </article>\n }\n </div>\n </section>\n }\n @case ('recommendation') {\n <section class=\"praxis-ai-assistant-shell__assistant-block praxis-ai-assistant-shell__assistant-block--recommendation\">\n <span class=\"praxis-ai-assistant-shell__assistant-block-icon\" aria-hidden=\"true\">\n <mat-icon>recommend</mat-icon>\n </span>\n <div class=\"praxis-ai-assistant-shell__assistant-block-copy\">\n <strong>{{ getAssistantContentBlockTitle(block, 'Recomenda\u00E7\u00E3o') }}</strong>\n <p>{{ getAssistantContentBlockText(block) }}</p>\n </div>\n </section>\n }\n }\n }\n </div>\n } @else {\n <div [innerHTML]=\"renderMessageText(message.text)\"></div>\n }\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--conversation-action]=\"isConversationQuickActionQuickReply(reply)\"\n [class.praxis-ai-assistant-shell__quick-reply--contextual-action]=\"isContextualPreviewActionQuickReply(reply)\"\n [class.praxis-ai-assistant-shell__quick-reply--source-review]=\"isSourceReviewQuickReply(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\">{{ getQuickReplyLabel(reply) }}</span>\n @if (!isConversationQuickActionQuickReply(reply) && getQuickReplyDescription(reply)) {\n <span\n class=\"praxis-ai-assistant-shell__quick-reply-description\"\n >\n {{ getQuickReplyDescription(reply) }}\n </span>\n }\n </span>\n @if (!isConversationQuickActionQuickReply(reply)) {\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 }\n </span>\n @if (!isConversationQuickActionQuickReply(reply) && 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 (!isConversationQuickActionQuickReply(reply) && 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 @if (!isConversationQuickActionQuickReply(reply)) {\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 }\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 {{ getAuxiliaryStatusText() }}\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 #promptInput\n id=\"praxis-ai-assistant-shell-prompt\"\n class=\"praxis-ai-assistant-shell__prompt\"\n rows=\"1\"\n [attr.data-testid]=\"testIdPrefix + '-prompt'\"\n [placeholder]=\"resolvedLabels.promptPlaceholder\"\n [ngModel]=\"currentPrompt\"\n [disabled]=\"busy\"\n (ngModelChange)=\"onPromptInput($event)\"\n (input)=\"resizePromptToContent()\"\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;position:fixed;inset:0;z-index:var(--praxis-ai-assistant-shell-z-index, 1200);pointer-events:none}.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:0;min-height:0;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);pointer-events:auto;z-index:var(--praxis-ai-assistant-shell-z-index, 1200);container-type:inline-size}.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;scrollbar-width:thin}.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:48px;max-height:160px;resize:none;border:0;padding:12px 14px 4px;color:var(--md-sys-color-on-surface);background:transparent;font:inherit;line-height:1.45;outline:none;overflow-y:hidden;scrollbar-width:thin}.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,.praxis-ai-assistant-shell__message-content ol{margin:8px 0;padding-left:18px}.praxis-ai-assistant-shell__message-content li+li{margin-top:7px}.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__assistant-content{display:grid;gap:8px}.praxis-ai-assistant-shell__assistant-block{display:grid;gap:8px;min-width:0}.praxis-ai-assistant-shell__assistant-block--summary,.praxis-ai-assistant-shell__assistant-block--recommendation{grid-template-columns:auto minmax(0,1fr);align-items:flex-start;padding:9px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 22%,transparent);border-radius:8px;background:color-mix(in srgb,var(--md-sys-color-primary) 7%,transparent)}.praxis-ai-assistant-shell__assistant-block--recommendation{border-color:color-mix(in srgb,var(--praxis-ai-assistant-shell-tone-success) 26%,transparent);background:color-mix(in srgb,var(--praxis-ai-assistant-shell-tone-success) 8%,transparent)}.praxis-ai-assistant-shell__assistant-block-icon{display:grid;place-items:center;width:24px;height:24px;border-radius:8px;color:var(--md-sys-color-primary);background:color-mix(in srgb,var(--md-sys-color-primary) 14%,transparent)}.praxis-ai-assistant-shell__assistant-block--recommendation .praxis-ai-assistant-shell__assistant-block-icon{color:var(--praxis-ai-assistant-shell-tone-success);background:color-mix(in srgb,var(--praxis-ai-assistant-shell-tone-success) 14%,transparent)}.praxis-ai-assistant-shell__assistant-block-icon mat-icon{width:16px;height:16px;font-size:16px;line-height:16px}.praxis-ai-assistant-shell__assistant-block-copy{min-width:0}.praxis-ai-assistant-shell__assistant-block-copy strong{display:block;margin-bottom:3px}.praxis-ai-assistant-shell__assistant-block-heading{display:inline-flex;align-items:center;gap:6px;color:var(--md-sys-color-on-surface);font-size:12px;font-weight:700}.praxis-ai-assistant-shell__assistant-block-heading mat-icon{width:16px;height:16px;color:var(--md-sys-color-primary);font-size:16px}.praxis-ai-assistant-shell__assistant-resources{display:grid;gap:7px}.praxis-ai-assistant-shell__assistant-resource{display:grid;gap:7px;min-width:0;padding:9px;border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant) 76%,transparent);border-radius:8px;background:color-mix(in srgb,var(--md-sys-color-surface-container-highest) 74%,transparent)}.praxis-ai-assistant-shell__assistant-resource-head{display:flex;align-items:flex-start;justify-content:space-between;gap:8px;min-width:0}.praxis-ai-assistant-shell__assistant-resource-head strong{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.praxis-ai-assistant-shell__assistant-resource-meta,.praxis-ai-assistant-shell__assistant-field-list,.praxis-ai-assistant-shell__assistant-evidence{display:flex;flex-wrap:wrap;gap:5px}.praxis-ai-assistant-shell__assistant-resource-meta span,.praxis-ai-assistant-shell__assistant-field,.praxis-ai-assistant-shell__assistant-evidence span{display:inline-flex;align-items:center;gap:4px;min-width:0;max-width:100%;padding:3px 6px;border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant) 62%,transparent);border-radius:999px;color:var(--md-sys-color-on-surface-variant);background:color-mix(in srgb,var(--md-sys-color-surface-container-low) 82%,transparent);font-size:11px;line-height:1.25}.praxis-ai-assistant-shell__assistant-field{color:color-mix(in srgb,var(--md-sys-color-primary) 88%,var(--md-sys-color-on-surface));background:color-mix(in srgb,var(--md-sys-color-primary) 9%,transparent);border-color:color-mix(in srgb,var(--md-sys-color-primary) 22%,transparent)}.praxis-ai-assistant-shell__assistant-evidence span{color:color-mix(in srgb,var(--praxis-ai-assistant-shell-tone-success) 85%,var(--md-sys-color-on-surface));background:color-mix(in srgb,var(--praxis-ai-assistant-shell-tone-success) 9%,transparent);border-color:color-mix(in srgb,var(--praxis-ai-assistant-shell-tone-success) 22%,transparent)}.praxis-ai-assistant-shell__assistant-evidence mat-icon{width:13px;height:13px;font-size:13px}.praxis-ai-assistant-shell__assistant-resource p{margin:0;color:var(--md-sys-color-on-surface-variant)}.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--conversation-action{width:auto;min-width:0;padding:7px 11px;border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-primary-container) 22%,var(--md-sys-color-surface-container-high));box-shadow:none}.praxis-ai-assistant-shell__quick-reply--conversation-action ::ng-deep .mdc-button__label{display:inline-flex;grid-template-columns:none;align-items:center;gap:7px}.praxis-ai-assistant-shell__quick-reply--conversation-action .praxis-ai-assistant-shell__quick-reply-icon-frame{width:22px;height:22px;border:0;background:transparent;box-shadow:none}.praxis-ai-assistant-shell__quick-reply--conversation-action .praxis-ai-assistant-shell__quick-reply-icon{width:17px;height:17px;font-size:17px}.praxis-ai-assistant-shell__quick-reply--conversation-action .praxis-ai-assistant-shell__quick-reply-copy,.praxis-ai-assistant-shell__quick-reply--conversation-action .praxis-ai-assistant-shell__quick-reply-heading{display:inline-flex;gap:0}.praxis-ai-assistant-shell__quick-reply--conversation-action .praxis-ai-assistant-shell__quick-reply-label{font-size:12.5px;font-weight:680;white-space:nowrap}.praxis-ai-assistant-shell__quick-reply--source-review{padding:11px 12px;border-color:color-mix(in srgb,var(--md-sys-color-outline-variant) 88%,transparent);border-radius:8px;background:linear-gradient(90deg,color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 7%,transparent),transparent 58%),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,.praxis-ai-assistant-shell__quick-reply--source-review:hover:not(:disabled),.praxis-ai-assistant-shell__quick-reply--source-review: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,.praxis-ai-assistant-shell__quick-reply--source-review .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,.praxis-ai-assistant-shell__quick-reply--source-review ::ng-deep .mdc-button__label{gap:10px;align-items:flex-start}.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,.praxis-ai-assistant-shell__quick-reply--source-review .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,.praxis-ai-assistant-shell__quick-reply--source-review .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,.praxis-ai-assistant-shell__quick-reply--source-review .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,.praxis-ai-assistant-shell__quick-reply--source-review .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,.praxis-ai-assistant-shell__quick-reply--source-review .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,.praxis-ai-assistant-shell__quick-reply--source-review .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,.praxis-ai-assistant-shell__quick-reply--source-review .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,.praxis-ai-assistant-shell__quick-reply--source-review .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,.praxis-ai-assistant-shell__quick-reply--source-review .praxis-ai-assistant-shell__quick-reply-cta{color:var(--md-sys-color-primary)}.praxis-ai-assistant-shell__quick-reply--source-review .praxis-ai-assistant-shell__quick-reply-context{gap:5px}.praxis-ai-assistant-shell__quick-reply--source-review .praxis-ai-assistant-shell__quick-reply-context-chip{border-radius:8px;padding:4px 7px;background:color-mix(in srgb,var(--md-sys-color-surface-container-lowest) 66%,transparent);font-size:10.5px;font-weight:650}.praxis-ai-assistant-shell__quick-reply--source-review .praxis-ai-assistant-shell__quick-reply-actions{max-width:40%}.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,.praxis-ai-assistant-shell__quick-reply--source-review .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__context{flex-wrap:wrap;overflow-x:visible}.praxis-ai-assistant-shell__context-item{max-width:min(100%,240px)}.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)}}@container (max-width: 400px){.praxis-ai-assistant-shell__header{display:grid;grid-template-columns:auto minmax(0,1fr) auto}.praxis-ai-assistant-shell__title-row{display:grid;gap:5px}.praxis-ai-assistant-shell__badges{justify-content:flex-start}.praxis-ai-assistant-shell__badge{max-width:100%}.praxis-ai-assistant-shell__context{flex-wrap:wrap;overflow-x:visible}.praxis-ai-assistant-shell__context-item{flex:1 1 150px;max-width:100%}.praxis-ai-assistant-shell__context-label,.praxis-ai-assistant-shell__context-value{overflow:visible;text-overflow:clip;white-space:normal;overflow-wrap:anywhere}.praxis-ai-assistant-shell__recommended-title-row,.praxis-ai-assistant-shell__assistant-resource-head{display:grid;justify-content:stretch}.praxis-ai-assistant-shell__recommended-group{max-width:100%;width:fit-content}.praxis-ai-assistant-shell__assistant-resource-head strong{overflow:visible;text-overflow:clip;white-space:normal;overflow-wrap:anywhere}}.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:4px;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:4px;min-height:44px;padding:0 7px 6px;flex-wrap:nowrap}.praxis-ai-assistant-shell__voice-action{--mdc-icon-button-state-layer-size: 36px;--mat-icon-button-state-layer-size: 36px;width:36px;height:36px;margin-right:auto;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:38px;min-width:38px;height:38px;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 });
9657
9819
  }
9658
9820
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisAiAssistantShellComponent, decorators: [{
9659
9821
  type: Component,
@@ -9664,7 +9826,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
9664
9826
  MatIconModule,
9665
9827
  MatProgressSpinnerModule,
9666
9828
  MatTooltipModule,
9667
- ], 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 [attr.data-mode]=\"mode\"\n [attr.data-state]=\"state\"\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\">{{ getContextItemValue(item) }}</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 >\n @if (hasStructuredAssistantContent(message)) {\n <div class=\"praxis-ai-assistant-shell__assistant-content\">\n @for (block of getAssistantContentBlocks(message); track trackAssistantContentBlock($index, block)) {\n @switch (getAssistantContentBlockType(block)) {\n @case ('paragraph') {\n <section class=\"praxis-ai-assistant-shell__assistant-block praxis-ai-assistant-shell__assistant-block--summary\">\n <span class=\"praxis-ai-assistant-shell__assistant-block-icon\" aria-hidden=\"true\">\n <mat-icon>lightbulb</mat-icon>\n </span>\n <div\n class=\"praxis-ai-assistant-shell__assistant-block-copy\"\n [innerHTML]=\"renderMessageText(getAssistantContentBlockText(block))\"\n ></div>\n </section>\n }\n @case ('resource-list') {\n <section class=\"praxis-ai-assistant-shell__assistant-block\">\n <div class=\"praxis-ai-assistant-shell__assistant-block-heading\">\n <mat-icon aria-hidden=\"true\">database</mat-icon>\n <span>{{ getAssistantContentBlockTitle(block, 'Fontes confirmadas') }}</span>\n </div>\n <div class=\"praxis-ai-assistant-shell__assistant-resources\">\n @for (resource of getAssistantContentResources(block); track trackAssistantContentResource($index, resource)) {\n <article class=\"praxis-ai-assistant-shell__assistant-resource\">\n <div class=\"praxis-ai-assistant-shell__assistant-resource-head\">\n <strong>{{ resource.label }}</strong>\n @if (getAssistantContentResourceMeta(resource).length) {\n <span class=\"praxis-ai-assistant-shell__assistant-resource-meta\">\n @for (item of getAssistantContentResourceMeta(resource); track trackAssistantContentValue($index, item)) {\n <span>{{ item }}</span>\n }\n </span>\n }\n </div>\n @if (resource.description) {\n <p>{{ resource.description }}</p>\n }\n @if (resource.fields.length) {\n <div class=\"praxis-ai-assistant-shell__assistant-field-list\" aria-label=\"Campos dispon\u00EDveis\">\n @for (field of resource.fields; track trackAssistantContentField($index, field)) {\n <span\n class=\"praxis-ai-assistant-shell__assistant-field\"\n [matTooltip]=\"field.description || field.name\"\n >\n {{ field.label }}\n </span>\n }\n </div>\n }\n @if (resource.evidence.length) {\n <div class=\"praxis-ai-assistant-shell__assistant-evidence\" aria-label=\"Evid\u00EAncias\">\n @for (item of resource.evidence; track trackAssistantContentValue($index, item)) {\n <span>\n <mat-icon aria-hidden=\"true\">verified</mat-icon>\n {{ item }}\n </span>\n }\n </div>\n }\n </article>\n }\n </div>\n </section>\n }\n @case ('recommendation') {\n <section class=\"praxis-ai-assistant-shell__assistant-block praxis-ai-assistant-shell__assistant-block--recommendation\">\n <span class=\"praxis-ai-assistant-shell__assistant-block-icon\" aria-hidden=\"true\">\n <mat-icon>recommend</mat-icon>\n </span>\n <div class=\"praxis-ai-assistant-shell__assistant-block-copy\">\n <strong>{{ getAssistantContentBlockTitle(block, 'Recomenda\u00E7\u00E3o') }}</strong>\n <p>{{ getAssistantContentBlockText(block) }}</p>\n </div>\n </section>\n }\n }\n }\n </div>\n } @else {\n <div [innerHTML]=\"renderMessageText(message.text)\"></div>\n }\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 [class.praxis-ai-assistant-shell__quick-reply--source-review]=\"isSourceReviewQuickReply(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\">{{ getQuickReplyLabel(reply) }}</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 {{ getAuxiliaryStatusText() }}\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 #promptInput\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;position:fixed;inset:0;z-index:var(--praxis-ai-assistant-shell-z-index, 1200);pointer-events:none}.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:0;min-height:0;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);pointer-events:auto;z-index:var(--praxis-ai-assistant-shell-z-index, 1200);container-type:inline-size}.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;scrollbar-width:thin}.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__assistant-content{display:grid;gap:8px}.praxis-ai-assistant-shell__assistant-block{display:grid;gap:8px;min-width:0}.praxis-ai-assistant-shell__assistant-block--summary,.praxis-ai-assistant-shell__assistant-block--recommendation{grid-template-columns:auto minmax(0,1fr);align-items:flex-start;padding:9px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 22%,transparent);border-radius:8px;background:color-mix(in srgb,var(--md-sys-color-primary) 7%,transparent)}.praxis-ai-assistant-shell__assistant-block--recommendation{border-color:color-mix(in srgb,var(--praxis-ai-assistant-shell-tone-success) 26%,transparent);background:color-mix(in srgb,var(--praxis-ai-assistant-shell-tone-success) 8%,transparent)}.praxis-ai-assistant-shell__assistant-block-icon{display:grid;place-items:center;width:24px;height:24px;border-radius:8px;color:var(--md-sys-color-primary);background:color-mix(in srgb,var(--md-sys-color-primary) 14%,transparent)}.praxis-ai-assistant-shell__assistant-block--recommendation .praxis-ai-assistant-shell__assistant-block-icon{color:var(--praxis-ai-assistant-shell-tone-success);background:color-mix(in srgb,var(--praxis-ai-assistant-shell-tone-success) 14%,transparent)}.praxis-ai-assistant-shell__assistant-block-icon mat-icon{width:16px;height:16px;font-size:16px;line-height:16px}.praxis-ai-assistant-shell__assistant-block-copy{min-width:0}.praxis-ai-assistant-shell__assistant-block-copy strong{display:block;margin-bottom:3px}.praxis-ai-assistant-shell__assistant-block-heading{display:inline-flex;align-items:center;gap:6px;color:var(--md-sys-color-on-surface);font-size:12px;font-weight:700}.praxis-ai-assistant-shell__assistant-block-heading mat-icon{width:16px;height:16px;color:var(--md-sys-color-primary);font-size:16px}.praxis-ai-assistant-shell__assistant-resources{display:grid;gap:7px}.praxis-ai-assistant-shell__assistant-resource{display:grid;gap:7px;min-width:0;padding:9px;border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant) 76%,transparent);border-radius:8px;background:color-mix(in srgb,var(--md-sys-color-surface-container-highest) 74%,transparent)}.praxis-ai-assistant-shell__assistant-resource-head{display:flex;align-items:flex-start;justify-content:space-between;gap:8px;min-width:0}.praxis-ai-assistant-shell__assistant-resource-head strong{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.praxis-ai-assistant-shell__assistant-resource-meta,.praxis-ai-assistant-shell__assistant-field-list,.praxis-ai-assistant-shell__assistant-evidence{display:flex;flex-wrap:wrap;gap:5px}.praxis-ai-assistant-shell__assistant-resource-meta span,.praxis-ai-assistant-shell__assistant-field,.praxis-ai-assistant-shell__assistant-evidence span{display:inline-flex;align-items:center;gap:4px;min-width:0;max-width:100%;padding:3px 6px;border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant) 62%,transparent);border-radius:999px;color:var(--md-sys-color-on-surface-variant);background:color-mix(in srgb,var(--md-sys-color-surface-container-low) 82%,transparent);font-size:11px;line-height:1.25}.praxis-ai-assistant-shell__assistant-field{color:color-mix(in srgb,var(--md-sys-color-primary) 88%,var(--md-sys-color-on-surface));background:color-mix(in srgb,var(--md-sys-color-primary) 9%,transparent);border-color:color-mix(in srgb,var(--md-sys-color-primary) 22%,transparent)}.praxis-ai-assistant-shell__assistant-evidence span{color:color-mix(in srgb,var(--praxis-ai-assistant-shell-tone-success) 85%,var(--md-sys-color-on-surface));background:color-mix(in srgb,var(--praxis-ai-assistant-shell-tone-success) 9%,transparent);border-color:color-mix(in srgb,var(--praxis-ai-assistant-shell-tone-success) 22%,transparent)}.praxis-ai-assistant-shell__assistant-evidence mat-icon{width:13px;height:13px;font-size:13px}.praxis-ai-assistant-shell__assistant-resource p{margin:0;color:var(--md-sys-color-on-surface-variant)}.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--source-review{padding:11px 12px;border-color:color-mix(in srgb,var(--md-sys-color-outline-variant) 88%,transparent);border-radius:8px;background:linear-gradient(90deg,color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 7%,transparent),transparent 58%),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,.praxis-ai-assistant-shell__quick-reply--source-review:hover:not(:disabled),.praxis-ai-assistant-shell__quick-reply--source-review: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,.praxis-ai-assistant-shell__quick-reply--source-review .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,.praxis-ai-assistant-shell__quick-reply--source-review ::ng-deep .mdc-button__label{gap:10px;align-items:flex-start}.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,.praxis-ai-assistant-shell__quick-reply--source-review .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,.praxis-ai-assistant-shell__quick-reply--source-review .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,.praxis-ai-assistant-shell__quick-reply--source-review .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,.praxis-ai-assistant-shell__quick-reply--source-review .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,.praxis-ai-assistant-shell__quick-reply--source-review .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,.praxis-ai-assistant-shell__quick-reply--source-review .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,.praxis-ai-assistant-shell__quick-reply--source-review .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,.praxis-ai-assistant-shell__quick-reply--source-review .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,.praxis-ai-assistant-shell__quick-reply--source-review .praxis-ai-assistant-shell__quick-reply-cta{color:var(--md-sys-color-primary)}.praxis-ai-assistant-shell__quick-reply--source-review .praxis-ai-assistant-shell__quick-reply-context{gap:5px}.praxis-ai-assistant-shell__quick-reply--source-review .praxis-ai-assistant-shell__quick-reply-context-chip{border-radius:8px;padding:4px 7px;background:color-mix(in srgb,var(--md-sys-color-surface-container-lowest) 66%,transparent);font-size:10.5px;font-weight:650}.praxis-ai-assistant-shell__quick-reply--source-review .praxis-ai-assistant-shell__quick-reply-actions{max-width:40%}.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,.praxis-ai-assistant-shell__quick-reply--source-review .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__context{flex-wrap:wrap;overflow-x:visible}.praxis-ai-assistant-shell__context-item{max-width:min(100%,240px)}.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)}}@container (max-width: 400px){.praxis-ai-assistant-shell__header{display:grid;grid-template-columns:auto minmax(0,1fr) auto}.praxis-ai-assistant-shell__title-row{display:grid;gap:5px}.praxis-ai-assistant-shell__badges{justify-content:flex-start}.praxis-ai-assistant-shell__badge{max-width:100%}.praxis-ai-assistant-shell__context{flex-wrap:wrap;overflow-x:visible}.praxis-ai-assistant-shell__context-item{flex:1 1 150px;max-width:100%}.praxis-ai-assistant-shell__context-label,.praxis-ai-assistant-shell__context-value{overflow:visible;text-overflow:clip;white-space:normal;overflow-wrap:anywhere}.praxis-ai-assistant-shell__recommended-title-row,.praxis-ai-assistant-shell__assistant-resource-head{display:grid;justify-content:stretch}.praxis-ai-assistant-shell__recommended-group{max-width:100%;width:fit-content}.praxis-ai-assistant-shell__assistant-resource-head strong{overflow:visible;text-overflow:clip;white-space:normal;overflow-wrap:anywhere}}.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"] }]
9829
+ ], 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 [attr.data-mode]=\"mode\"\n [attr.data-state]=\"state\"\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\">{{ getContextItemValue(item) }}</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 >\n @if (hasStructuredAssistantContent(message)) {\n <div class=\"praxis-ai-assistant-shell__assistant-content\">\n @for (block of getAssistantContentBlocks(message); track trackAssistantContentBlock($index, block)) {\n @switch (getAssistantContentBlockType(block)) {\n @case ('paragraph') {\n <section class=\"praxis-ai-assistant-shell__assistant-block praxis-ai-assistant-shell__assistant-block--summary\">\n <span class=\"praxis-ai-assistant-shell__assistant-block-icon\" aria-hidden=\"true\">\n <mat-icon>lightbulb</mat-icon>\n </span>\n <div\n class=\"praxis-ai-assistant-shell__assistant-block-copy\"\n [innerHTML]=\"renderMessageText(getAssistantContentBlockText(block))\"\n ></div>\n </section>\n }\n @case ('resource-list') {\n <section class=\"praxis-ai-assistant-shell__assistant-block\">\n <div class=\"praxis-ai-assistant-shell__assistant-block-heading\">\n <mat-icon aria-hidden=\"true\">database</mat-icon>\n <span>{{ getAssistantContentBlockTitle(block, 'Fontes confirmadas') }}</span>\n </div>\n <div class=\"praxis-ai-assistant-shell__assistant-resources\">\n @for (resource of getAssistantContentResources(block); track trackAssistantContentResource($index, resource)) {\n <article class=\"praxis-ai-assistant-shell__assistant-resource\">\n <div class=\"praxis-ai-assistant-shell__assistant-resource-head\">\n <strong>{{ resource.label }}</strong>\n @if (getAssistantContentResourceMeta(resource).length) {\n <span class=\"praxis-ai-assistant-shell__assistant-resource-meta\">\n @for (item of getAssistantContentResourceMeta(resource); track trackAssistantContentValue($index, item)) {\n <span>{{ item }}</span>\n }\n </span>\n }\n </div>\n @if (resource.description) {\n <p>{{ resource.description }}</p>\n }\n @if (resource.fields.length) {\n <div class=\"praxis-ai-assistant-shell__assistant-field-list\" aria-label=\"Campos dispon\u00EDveis\">\n @for (field of resource.fields; track trackAssistantContentField($index, field)) {\n <span\n class=\"praxis-ai-assistant-shell__assistant-field\"\n [matTooltip]=\"field.description || field.name\"\n >\n {{ field.label }}\n </span>\n }\n </div>\n }\n @if (resource.evidence.length) {\n <div class=\"praxis-ai-assistant-shell__assistant-evidence\" aria-label=\"Evid\u00EAncias\">\n @for (item of resource.evidence; track trackAssistantContentValue($index, item)) {\n <span>\n <mat-icon aria-hidden=\"true\">verified</mat-icon>\n {{ item }}\n </span>\n }\n </div>\n }\n </article>\n }\n </div>\n </section>\n }\n @case ('recommendation') {\n <section class=\"praxis-ai-assistant-shell__assistant-block praxis-ai-assistant-shell__assistant-block--recommendation\">\n <span class=\"praxis-ai-assistant-shell__assistant-block-icon\" aria-hidden=\"true\">\n <mat-icon>recommend</mat-icon>\n </span>\n <div class=\"praxis-ai-assistant-shell__assistant-block-copy\">\n <strong>{{ getAssistantContentBlockTitle(block, 'Recomenda\u00E7\u00E3o') }}</strong>\n <p>{{ getAssistantContentBlockText(block) }}</p>\n </div>\n </section>\n }\n }\n }\n </div>\n } @else {\n <div [innerHTML]=\"renderMessageText(message.text)\"></div>\n }\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--conversation-action]=\"isConversationQuickActionQuickReply(reply)\"\n [class.praxis-ai-assistant-shell__quick-reply--contextual-action]=\"isContextualPreviewActionQuickReply(reply)\"\n [class.praxis-ai-assistant-shell__quick-reply--source-review]=\"isSourceReviewQuickReply(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\">{{ getQuickReplyLabel(reply) }}</span>\n @if (!isConversationQuickActionQuickReply(reply) && getQuickReplyDescription(reply)) {\n <span\n class=\"praxis-ai-assistant-shell__quick-reply-description\"\n >\n {{ getQuickReplyDescription(reply) }}\n </span>\n }\n </span>\n @if (!isConversationQuickActionQuickReply(reply)) {\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 }\n </span>\n @if (!isConversationQuickActionQuickReply(reply) && 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 (!isConversationQuickActionQuickReply(reply) && 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 @if (!isConversationQuickActionQuickReply(reply)) {\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 }\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 {{ getAuxiliaryStatusText() }}\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 #promptInput\n id=\"praxis-ai-assistant-shell-prompt\"\n class=\"praxis-ai-assistant-shell__prompt\"\n rows=\"1\"\n [attr.data-testid]=\"testIdPrefix + '-prompt'\"\n [placeholder]=\"resolvedLabels.promptPlaceholder\"\n [ngModel]=\"currentPrompt\"\n [disabled]=\"busy\"\n (ngModelChange)=\"onPromptInput($event)\"\n (input)=\"resizePromptToContent()\"\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;position:fixed;inset:0;z-index:var(--praxis-ai-assistant-shell-z-index, 1200);pointer-events:none}.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:0;min-height:0;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);pointer-events:auto;z-index:var(--praxis-ai-assistant-shell-z-index, 1200);container-type:inline-size}.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;scrollbar-width:thin}.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:48px;max-height:160px;resize:none;border:0;padding:12px 14px 4px;color:var(--md-sys-color-on-surface);background:transparent;font:inherit;line-height:1.45;outline:none;overflow-y:hidden;scrollbar-width:thin}.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,.praxis-ai-assistant-shell__message-content ol{margin:8px 0;padding-left:18px}.praxis-ai-assistant-shell__message-content li+li{margin-top:7px}.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__assistant-content{display:grid;gap:8px}.praxis-ai-assistant-shell__assistant-block{display:grid;gap:8px;min-width:0}.praxis-ai-assistant-shell__assistant-block--summary,.praxis-ai-assistant-shell__assistant-block--recommendation{grid-template-columns:auto minmax(0,1fr);align-items:flex-start;padding:9px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 22%,transparent);border-radius:8px;background:color-mix(in srgb,var(--md-sys-color-primary) 7%,transparent)}.praxis-ai-assistant-shell__assistant-block--recommendation{border-color:color-mix(in srgb,var(--praxis-ai-assistant-shell-tone-success) 26%,transparent);background:color-mix(in srgb,var(--praxis-ai-assistant-shell-tone-success) 8%,transparent)}.praxis-ai-assistant-shell__assistant-block-icon{display:grid;place-items:center;width:24px;height:24px;border-radius:8px;color:var(--md-sys-color-primary);background:color-mix(in srgb,var(--md-sys-color-primary) 14%,transparent)}.praxis-ai-assistant-shell__assistant-block--recommendation .praxis-ai-assistant-shell__assistant-block-icon{color:var(--praxis-ai-assistant-shell-tone-success);background:color-mix(in srgb,var(--praxis-ai-assistant-shell-tone-success) 14%,transparent)}.praxis-ai-assistant-shell__assistant-block-icon mat-icon{width:16px;height:16px;font-size:16px;line-height:16px}.praxis-ai-assistant-shell__assistant-block-copy{min-width:0}.praxis-ai-assistant-shell__assistant-block-copy strong{display:block;margin-bottom:3px}.praxis-ai-assistant-shell__assistant-block-heading{display:inline-flex;align-items:center;gap:6px;color:var(--md-sys-color-on-surface);font-size:12px;font-weight:700}.praxis-ai-assistant-shell__assistant-block-heading mat-icon{width:16px;height:16px;color:var(--md-sys-color-primary);font-size:16px}.praxis-ai-assistant-shell__assistant-resources{display:grid;gap:7px}.praxis-ai-assistant-shell__assistant-resource{display:grid;gap:7px;min-width:0;padding:9px;border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant) 76%,transparent);border-radius:8px;background:color-mix(in srgb,var(--md-sys-color-surface-container-highest) 74%,transparent)}.praxis-ai-assistant-shell__assistant-resource-head{display:flex;align-items:flex-start;justify-content:space-between;gap:8px;min-width:0}.praxis-ai-assistant-shell__assistant-resource-head strong{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.praxis-ai-assistant-shell__assistant-resource-meta,.praxis-ai-assistant-shell__assistant-field-list,.praxis-ai-assistant-shell__assistant-evidence{display:flex;flex-wrap:wrap;gap:5px}.praxis-ai-assistant-shell__assistant-resource-meta span,.praxis-ai-assistant-shell__assistant-field,.praxis-ai-assistant-shell__assistant-evidence span{display:inline-flex;align-items:center;gap:4px;min-width:0;max-width:100%;padding:3px 6px;border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant) 62%,transparent);border-radius:999px;color:var(--md-sys-color-on-surface-variant);background:color-mix(in srgb,var(--md-sys-color-surface-container-low) 82%,transparent);font-size:11px;line-height:1.25}.praxis-ai-assistant-shell__assistant-field{color:color-mix(in srgb,var(--md-sys-color-primary) 88%,var(--md-sys-color-on-surface));background:color-mix(in srgb,var(--md-sys-color-primary) 9%,transparent);border-color:color-mix(in srgb,var(--md-sys-color-primary) 22%,transparent)}.praxis-ai-assistant-shell__assistant-evidence span{color:color-mix(in srgb,var(--praxis-ai-assistant-shell-tone-success) 85%,var(--md-sys-color-on-surface));background:color-mix(in srgb,var(--praxis-ai-assistant-shell-tone-success) 9%,transparent);border-color:color-mix(in srgb,var(--praxis-ai-assistant-shell-tone-success) 22%,transparent)}.praxis-ai-assistant-shell__assistant-evidence mat-icon{width:13px;height:13px;font-size:13px}.praxis-ai-assistant-shell__assistant-resource p{margin:0;color:var(--md-sys-color-on-surface-variant)}.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--conversation-action{width:auto;min-width:0;padding:7px 11px;border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-primary-container) 22%,var(--md-sys-color-surface-container-high));box-shadow:none}.praxis-ai-assistant-shell__quick-reply--conversation-action ::ng-deep .mdc-button__label{display:inline-flex;grid-template-columns:none;align-items:center;gap:7px}.praxis-ai-assistant-shell__quick-reply--conversation-action .praxis-ai-assistant-shell__quick-reply-icon-frame{width:22px;height:22px;border:0;background:transparent;box-shadow:none}.praxis-ai-assistant-shell__quick-reply--conversation-action .praxis-ai-assistant-shell__quick-reply-icon{width:17px;height:17px;font-size:17px}.praxis-ai-assistant-shell__quick-reply--conversation-action .praxis-ai-assistant-shell__quick-reply-copy,.praxis-ai-assistant-shell__quick-reply--conversation-action .praxis-ai-assistant-shell__quick-reply-heading{display:inline-flex;gap:0}.praxis-ai-assistant-shell__quick-reply--conversation-action .praxis-ai-assistant-shell__quick-reply-label{font-size:12.5px;font-weight:680;white-space:nowrap}.praxis-ai-assistant-shell__quick-reply--source-review{padding:11px 12px;border-color:color-mix(in srgb,var(--md-sys-color-outline-variant) 88%,transparent);border-radius:8px;background:linear-gradient(90deg,color-mix(in srgb,var(--praxis-ai-assistant-shell-quick-reply-accent) 7%,transparent),transparent 58%),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,.praxis-ai-assistant-shell__quick-reply--source-review:hover:not(:disabled),.praxis-ai-assistant-shell__quick-reply--source-review: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,.praxis-ai-assistant-shell__quick-reply--source-review .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,.praxis-ai-assistant-shell__quick-reply--source-review ::ng-deep .mdc-button__label{gap:10px;align-items:flex-start}.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,.praxis-ai-assistant-shell__quick-reply--source-review .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,.praxis-ai-assistant-shell__quick-reply--source-review .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,.praxis-ai-assistant-shell__quick-reply--source-review .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,.praxis-ai-assistant-shell__quick-reply--source-review .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,.praxis-ai-assistant-shell__quick-reply--source-review .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,.praxis-ai-assistant-shell__quick-reply--source-review .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,.praxis-ai-assistant-shell__quick-reply--source-review .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,.praxis-ai-assistant-shell__quick-reply--source-review .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,.praxis-ai-assistant-shell__quick-reply--source-review .praxis-ai-assistant-shell__quick-reply-cta{color:var(--md-sys-color-primary)}.praxis-ai-assistant-shell__quick-reply--source-review .praxis-ai-assistant-shell__quick-reply-context{gap:5px}.praxis-ai-assistant-shell__quick-reply--source-review .praxis-ai-assistant-shell__quick-reply-context-chip{border-radius:8px;padding:4px 7px;background:color-mix(in srgb,var(--md-sys-color-surface-container-lowest) 66%,transparent);font-size:10.5px;font-weight:650}.praxis-ai-assistant-shell__quick-reply--source-review .praxis-ai-assistant-shell__quick-reply-actions{max-width:40%}.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,.praxis-ai-assistant-shell__quick-reply--source-review .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__context{flex-wrap:wrap;overflow-x:visible}.praxis-ai-assistant-shell__context-item{max-width:min(100%,240px)}.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)}}@container (max-width: 400px){.praxis-ai-assistant-shell__header{display:grid;grid-template-columns:auto minmax(0,1fr) auto}.praxis-ai-assistant-shell__title-row{display:grid;gap:5px}.praxis-ai-assistant-shell__badges{justify-content:flex-start}.praxis-ai-assistant-shell__badge{max-width:100%}.praxis-ai-assistant-shell__context{flex-wrap:wrap;overflow-x:visible}.praxis-ai-assistant-shell__context-item{flex:1 1 150px;max-width:100%}.praxis-ai-assistant-shell__context-label,.praxis-ai-assistant-shell__context-value{overflow:visible;text-overflow:clip;white-space:normal;overflow-wrap:anywhere}.praxis-ai-assistant-shell__recommended-title-row,.praxis-ai-assistant-shell__assistant-resource-head{display:grid;justify-content:stretch}.praxis-ai-assistant-shell__recommended-group{max-width:100%;width:fit-content}.praxis-ai-assistant-shell__assistant-resource-head strong{overflow:visible;text-overflow:clip;white-space:normal;overflow-wrap:anywhere}}.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:4px;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:4px;min-height:44px;padding:0 7px 6px;flex-wrap:nowrap}.praxis-ai-assistant-shell__voice-action{--mdc-icon-button-state-layer-size: 36px;--mat-icon-button-state-layer-size: 36px;width:36px;height:36px;margin-right:auto;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:38px;min-width:38px;height:38px;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"] }]
9668
9830
  }], propDecorators: { labels: [{
9669
9831
  type: Input
9670
9832
  }], mode: [{
@@ -10948,4 +11110,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
10948
11110
  * Generated bundle index. Do not edit.
10949
11111
  */
10950
11112
 
10951
- 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, AgenticAuthoringTurnClientService, 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, PRAXIS_AUTHORING_SCOPE_POLICY_KIND, PRAXIS_AUTHORING_SCOPE_POLICY_VERSION, PraxisAi, PraxisAiAssistantComponent, PraxisAiAssistantDockComponent, PraxisAiAssistantSessionHostComponent, PraxisAiAssistantShellComponent, PraxisAiService, PraxisAssistantSessionRegistryService, PraxisAssistantTurnController, PraxisAssistantTurnOrchestratorService, SchemaMinifierService, createAuthoringScopePolicyContext, createAuthoringScopePolicySystemMessage, createComponentAuthoringContext, createPraxisAssistantViewportLayout, normalizeAuthoringPrompt, normalizePraxisAssistantAttachmentSummary, normalizePraxisAssistantContextSnapshot, sanitizePraxisAssistantText, shouldRoutePromptToGovernedDecision, submitPraxisAssistantQuickReply, toAiJsonObject, toPraxisAssistantClarificationOption, toPraxisAssistantConversationMessages, withAuthoringScopePolicy, withAuthoringScopePolicyContextHints, withAuthoringScopePolicyMessage };
11113
+ 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, AgenticAuthoringTurnClientService, 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, PRAXIS_AUTHORING_SCOPE_POLICY_KIND, PRAXIS_AUTHORING_SCOPE_POLICY_VERSION, PraxisAi, PraxisAiAssistantComponent, PraxisAiAssistantDockComponent, PraxisAiAssistantSessionHostComponent, PraxisAiAssistantShellComponent, PraxisAiService, PraxisAssistantSessionRegistryService, PraxisAssistantTurnController, PraxisAssistantTurnOrchestratorService, PraxisGovernedAudioTranscriptionService, SchemaMinifierService, createAuthoringScopePolicyContext, createAuthoringScopePolicySystemMessage, createComponentAuthoringContext, createPraxisAssistantViewportLayout, normalizeAuthoringPrompt, normalizePraxisAssistantAttachmentSummary, normalizePraxisAssistantContextSnapshot, sanitizePraxisAssistantText, shouldRoutePromptToGovernedDecision, submitPraxisAssistantQuickReply, toAiJsonObject, toPraxisAssistantClarificationOption, toPraxisAssistantConversationMessages, withAuthoringScopePolicy, withAuthoringScopePolicyContextHints, withAuthoringScopePolicyMessage };