@testgorilla/tgo-ui 5.2.4 → 6.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/ai-audio-circle/ai-audio-circle.component.d.ts +2 -1
- package/components/alert-banner/alert-banner.component.d.ts +4 -8
- package/components/autocomplete/autocomplete.component.d.ts +4 -6
- package/components/card/card.component.d.ts +12 -7
- package/components/card/card.model.d.ts +1 -0
- package/components/checklist/checklist.component.d.ts +1 -2
- package/components/datepicker/datepicker.component.d.ts +3 -5
- package/components/dialog/confirm-dialog/confirm-dialog.component.d.ts +3 -5
- package/components/empty-state/empty-state.component.d.ts +1 -4
- package/components/field/field.component.d.ts +4 -4
- package/components/media-dialog/media-dialog.component.d.ts +2 -4
- package/components/phone-input/phone-input.component.d.ts +4 -6
- package/components/snackbar/snackbar.component.d.ts +3 -5
- package/fesm2022/testgorilla-tgo-ui-components-ai-audio-circle.mjs +16 -5
- package/fesm2022/testgorilla-tgo-ui-components-ai-audio-circle.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-ai-feedback.mjs +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-ai-feedback.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-alert-banner.mjs +16 -24
- package/fesm2022/testgorilla-tgo-ui-components-alert-banner.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-autocomplete.mjs +19 -21
- package/fesm2022/testgorilla-tgo-ui-components-autocomplete.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-card.mjs +20 -12
- package/fesm2022/testgorilla-tgo-ui-components-card.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-checklist.mjs +2 -6
- package/fesm2022/testgorilla-tgo-ui-components-checklist.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-datepicker.mjs +13 -15
- package/fesm2022/testgorilla-tgo-ui-components-datepicker.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-dialog.mjs +4 -8
- package/fesm2022/testgorilla-tgo-ui-components-dialog.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-empty-state.mjs +9 -16
- package/fesm2022/testgorilla-tgo-ui-components-empty-state.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-field.mjs +3 -5
- package/fesm2022/testgorilla-tgo-ui-components-field.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-media-dialog.mjs +9 -11
- package/fesm2022/testgorilla-tgo-ui-components-media-dialog.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-phone-input.mjs +13 -15
- package/fesm2022/testgorilla-tgo-ui-components-phone-input.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-selectable-card.mjs +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-selectable-card.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-snackbar.mjs +11 -13
- package/fesm2022/testgorilla-tgo-ui-components-snackbar.mjs.map +1 -1
- package/package.json +29 -29
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testgorilla-tgo-ui-components-ai-audio-circle.mjs","sources":["../../../components/ai-audio-circle/ai-audio-circle.component.ts","../../../components/ai-audio-circle/ai-audio-circle.component.html","../../../components/ai-audio-circle/ai-audio-circle.module.ts","../../../components/ai-audio-circle/testgorilla-tgo-ui-components-ai-audio-circle.ts"],"sourcesContent":["import {\n Component,\n input,\n model,\n OnDestroy,\n ChangeDetectionStrategy,\n WritableSignal,\n signal,\n ElementRef,\n ViewChild,\n AfterViewInit,\n effect,\n computed,\n} from '@angular/core';\nimport { Color } from '@testgorilla/tgo-ui/components/core';\n\nexport enum InterviewState {\n CandidateSpeaking = 'candidate-speaking',\n AiListening = 'ai-listening',\n AiSpeaking = 'ai-speaking',\n}\n\n@Component({\n selector: 'ui-ai-audio-circle',\n templateUrl: './ai-audio-circle.component.html',\n styleUrls: ['./ai-audio-circle.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false,\n})\nexport class AiAudioCircleComponent implements OnDestroy, AfterViewInit {\n @ViewChild('pulseCanvas', { static: false }) pulseCanvasRef?: ElementRef<HTMLCanvasElement>;\n\n audioTrack = input<MediaStreamTrack>();\n candidateAudioTrack = input<MediaStreamTrack>();\n state = model<InterviewState>(InterviewState.AiListening);\n canvasSize = input<number>(280);\n\n isSpeaking: WritableSignal<boolean> = signal(false);\n scaleValue: WritableSignal<number> = signal(1);\n\n audioContext?: AudioContext;\n analyser?: AnalyserNode;\n candidateAnalyser?: AnalyserNode;\n dataArray?: Uint8Array<ArrayBuffer>;\n candidateDataArray?: Uint8Array<ArrayBuffer>;\n animationFrameId?: number;\n source?: MediaStreamAudioSourceNode;\n candidateSource?: MediaStreamAudioSourceNode;\n\n pulseCtx?: CanvasRenderingContext2D;\n currentAmp = 0.02;\n simTime = 0;\n baseRadius = computed(() => this.canvasSize() * 0.38);\n\n // Audio detection thresholds\n readonly AI_SPEAKING_THRESHOLD = 0.02;\n readonly CANDIDATE_SPEAKING_THRESHOLD = 0.5;\n\n readonly SHADOW_COLOR_RGB = this.hexToRgb(Color.BRAND_50);\n\n pulseTime = 0;\n pulseScale = 1;\n pulseTargetScale = 1;\n pulseAnimationId?: number;\n blobs: Array<{\n x: number;\n y: number;\n vx: number;\n vy: number;\n radius: number;\n color: string;\n opacity: number;\n }> = [];\n\n constructor() {\n effect(() => {\n const audioTrack = this.audioTrack();\n if (audioTrack) {\n this.setupAudioAnalysis();\n }\n });\n\n effect(() => {\n const candidateAudioTrack = this.candidateAudioTrack();\n if (candidateAudioTrack) {\n this.setupCandidateAudioAnalysis();\n }\n });\n }\n\n ngAfterViewInit(): void {\n this.initializeCanvas();\n this.initializeBlobs();\n this.startAnimations();\n }\n\n private initializeCanvas(): void {\n if (!this.pulseCanvasRef) {\n return;\n }\n\n const pulseCanvas = this.pulseCanvasRef.nativeElement;\n\n const dpr = window.devicePixelRatio || 1;\n\n // Setup pulse canvas\n const size = this.canvasSize();\n pulseCanvas.width = size * dpr;\n pulseCanvas.height = size * dpr;\n pulseCanvas.style.width = `${size}px`;\n pulseCanvas.style.height = `${size}px`;\n const ctx = pulseCanvas.getContext('2d');\n if (!ctx) {\n console.error('[AI_AUDIO_CIRCLE] Failed to get 2d context');\n return;\n }\n this.pulseCtx = ctx;\n this.pulseCtx.scale(dpr, dpr);\n }\n\n private initializeBlobs(): void {\n const size = this.canvasSize();\n const centerX = size / 2;\n const centerY = size / 2;\n const baseRadius = this.baseRadius();\n\n const colors = [\n { color: Color.INFORMATIVE_30, opacity: 0.8 },\n { color: Color.INFORMATIVE_20, opacity: 0.7 },\n { color: Color.BRAND_50, opacity: 0.75 },\n { color: Color.BRAND_20, opacity: 0.6 },\n { color: Color.INFORMATIVE_30, opacity: 0.65 },\n ];\n\n this.blobs = colors.map((c, i) => {\n const angle = (i / colors.length) * Math.PI * 2;\n const dist = baseRadius * 0.25;\n return {\n x: centerX + Math.cos(angle) * dist,\n y: centerY + Math.sin(angle) * dist,\n vx: (Math.random() - 0.5) * 0.4,\n vy: (Math.random() - 0.5) * 0.4,\n radius: baseRadius * (0.6 + Math.random() * 0.4),\n color: c.color,\n opacity: c.opacity,\n };\n });\n }\n\n private setupAudioAnalysis(): void {\n const audioTrack = this.audioTrack();\n if (!audioTrack) {\n return;\n }\n\n try {\n if (!this.audioContext) {\n this.audioContext = new AudioContext();\n }\n\n this.analyser = this.audioContext.createAnalyser();\n this.analyser.fftSize = 256;\n this.analyser.smoothingTimeConstant = 0.8;\n\n const bufferLength = this.analyser.frequencyBinCount;\n this.dataArray = new Uint8Array(bufferLength);\n\n const stream = new MediaStream([audioTrack]);\n this.source = this.audioContext.createMediaStreamSource(stream);\n this.source.connect(this.analyser);\n\n this.analyzeAudio();\n } catch (error) {\n console.error('[AI_AUDIO_CIRCLE] Error setting up audio analysis:', error);\n }\n }\n\n private setupCandidateAudioAnalysis(): void {\n const candidateAudioTrack = this.candidateAudioTrack();\n if (!candidateAudioTrack) {\n return;\n }\n\n try {\n if (!this.audioContext) {\n this.audioContext = new AudioContext();\n }\n\n this.candidateAnalyser = this.audioContext.createAnalyser();\n this.candidateAnalyser.fftSize = 256;\n this.candidateAnalyser.smoothingTimeConstant = 0.8;\n\n const bufferLength = this.candidateAnalyser.frequencyBinCount;\n this.candidateDataArray = new Uint8Array(bufferLength);\n\n const stream = new MediaStream([candidateAudioTrack]);\n this.candidateSource = this.audioContext.createMediaStreamSource(stream);\n this.candidateSource.connect(this.candidateAnalyser);\n } catch (error) {\n console.error('[AI_AUDIO_CIRCLE] Error setting up candidate audio analysis:', error);\n }\n }\n\n private analyzeAudio(): void {\n if (!this.analyser || !this.dataArray) {\n return;\n }\n\n const analyze = () => {\n if (!this.analyser || !this.dataArray) {\n return;\n }\n\n // Analyze AI audio\n this.analyser.getByteFrequencyData(this.dataArray);\n const sum = Array.from(this.dataArray).reduce((a, b) => a + b, 0);\n const aiVolume = sum / this.dataArray.length / 255;\n\n // Analyze candidate audio if available\n let candidateVolume = 0;\n if (this.candidateAnalyser && this.candidateDataArray) {\n this.candidateAnalyser.getByteFrequencyData(this.candidateDataArray);\n const candidateSum = Array.from(this.candidateDataArray).reduce((a, b) => a + b, 0);\n candidateVolume = candidateSum / this.candidateDataArray.length / 255;\n }\n\n const aiSpeaking = aiVolume > this.AI_SPEAKING_THRESHOLD;\n const candidateSpeaking = candidateVolume > this.CANDIDATE_SPEAKING_THRESHOLD;\n\n if (candidateSpeaking) {\n this.state.set(InterviewState.CandidateSpeaking);\n } else if (aiSpeaking) {\n this.state.set(InterviewState.AiSpeaking);\n } else {\n this.state.set(InterviewState.AiListening);\n }\n\n this.isSpeaking.set(aiSpeaking);\n\n // Update amplitude for animations\n const currentStateValue = this.state();\n if (currentStateValue === InterviewState.AiSpeaking && aiSpeaking) {\n const target = Math.pow(aiVolume, 0.8) * 1.3;\n this.currentAmp += (target - this.currentAmp) * 0.4;\n } else if (currentStateValue === InterviewState.CandidateSpeaking) {\n const target = 0.55;\n this.currentAmp += (target - this.currentAmp) * 0.1;\n } else {\n const fixedBase = 0.2;\n this.currentAmp += (fixedBase - this.currentAmp) * 0.05;\n }\n\n this.animationFrameId = requestAnimationFrame(analyze);\n };\n\n this.animationFrameId = requestAnimationFrame(analyze);\n }\n\n private startAnimations(): void {\n this.animatePulse = this.animatePulse.bind(this);\n this.mainLoop = this.mainLoop.bind(this);\n this.animatePulse();\n this.mainLoop();\n }\n\n private mainLoop(): void {\n this.simTime += 0.05;\n\n const currentStateValue = this.state();\n\n if (currentStateValue === InterviewState.AiSpeaking) {\n if (this.analyser && this.dataArray) {\n // Use real audio amplitude (already handled in analyzeAudio)\n } else {\n // Simulated speaking\n const rhythm = Math.sin(this.simTime * 0.8) * 0.5 + 0.5;\n const spikes = Math.random() * 0.6;\n const target = rhythm * spikes;\n this.currentAmp += (target - this.currentAmp) * 0.2;\n }\n } else if (currentStateValue === InterviewState.CandidateSpeaking) {\n const target = 0.55;\n this.currentAmp += (target - this.currentAmp) * 0.1;\n } else {\n const fixedBase = 0.2;\n this.currentAmp += (fixedBase - this.currentAmp) * 0.05;\n }\n\n requestAnimationFrame(this.mainLoop);\n }\n\n private animatePulse(): void {\n if (!this.pulseCtx) {\n return;\n }\n\n const ctx = this.pulseCtx;\n this.pulseTime += 0.016;\n const size = this.canvasSize();\n const centerX = size / 2;\n const centerY = size / 2;\n const baseRadius = this.baseRadius();\n\n ctx.clearRect(0, 0, size, size);\n\n const currentStateValue = this.state();\n const effectiveAmp = this.currentAmp;\n const isListening = currentStateValue === InterviewState.AiListening;\n const isCandidate = currentStateValue === InterviewState.CandidateSpeaking;\n\n // Scale logic\n if (isCandidate) {\n // Candidate speaking: Fixed enlarged scale (115%), no breathing effect\n this.pulseTargetScale = 1.15;\n const breathing = 0;\n this.pulseScale += (this.pulseTargetScale + breathing - this.pulseScale) * 0.05;\n } else {\n // AI speaking/listening: Scale reacts to audio amplitude, with optional breathing\n // When AI is speaking: effectiveAmp is high, scale grows with voice\n // When AI is listening: effectiveAmp is low (~0.2), scale stays near 1.0 with breathing effect\n this.pulseTargetScale = 1 + effectiveAmp * 0.3;\n const breathing = isListening ? Math.sin(this.pulseTime * 1.5) * 0.035 : 0;\n this.pulseScale += (this.pulseTargetScale + breathing - this.pulseScale) * 0.05;\n }\n\n const currentRadius = baseRadius * this.pulseScale;\n\n // Draw shadows\n for (let i = 3; i >= 1; i--) {\n const shadowRadius = currentRadius + i * 6;\n const shadowOpacity = 0.24 - i * 0.04;\n const shadowGradient = ctx.createRadialGradient(\n centerX,\n centerY,\n currentRadius * 0.98,\n centerX,\n centerY,\n shadowRadius\n );\n shadowGradient.addColorStop(0, `rgba(${this.SHADOW_COLOR_RGB}, ${shadowOpacity})`);\n shadowGradient.addColorStop(0.6, `rgba(${this.SHADOW_COLOR_RGB}, ${shadowOpacity * 0.4})`);\n shadowGradient.addColorStop(1, `rgba(${this.SHADOW_COLOR_RGB}, 0)`);\n ctx.beginPath();\n ctx.arc(centerX, centerY, shadowRadius, 0, Math.PI * 2);\n ctx.fillStyle = shadowGradient;\n ctx.fill();\n }\n\n // Clip to circle\n ctx.save();\n ctx.beginPath();\n ctx.arc(centerX, centerY, currentRadius, 0, Math.PI * 2);\n ctx.clip();\n\n // Background gradient\n const bgGradient = ctx.createLinearGradient(\n centerX - currentRadius,\n centerY - currentRadius,\n centerX + currentRadius,\n centerY + currentRadius\n );\n bgGradient.addColorStop(0, Color.BRAND_50);\n bgGradient.addColorStop(0.5, Color.INFORMATIVE_20);\n bgGradient.addColorStop(1, Color.INFORMATIVE_30);\n ctx.beginPath();\n ctx.arc(centerX, centerY, currentRadius, 0, Math.PI * 2);\n ctx.fillStyle = bgGradient;\n ctx.fill();\n\n // Animate blobs\n let speedMultiplier;\n if (isCandidate) {\n speedMultiplier = 2.0;\n } else if (isListening) {\n speedMultiplier = 1.2;\n } else {\n speedMultiplier = 0.8 + effectiveAmp * 1.5;\n }\n\n this.blobs.forEach((blob, index) => {\n // Chaos forces\n const chaos1 = Math.sin(this.pulseTime * 0.6 + index * 2.5 + blob.x * 0.02) * 0.15;\n const chaos2 = Math.cos(this.pulseTime * 0.4 + index * 1.8 + blob.y * 0.015) * 0.12;\n const chaos3 = Math.sin(this.pulseTime * 1.0 + index * 0.7) * 0.08;\n\n // Apply forces\n blob.vx += (chaos1 + chaos3 * Math.cos(this.pulseTime * 1.5 + index)) * 0.025 * speedMultiplier;\n blob.vy += (chaos2 + chaos3 * Math.sin(this.pulseTime * 1.2 + index)) * 0.025 * speedMultiplier;\n\n // Friction\n blob.vx *= 0.98;\n blob.vy *= 0.98;\n\n // Max velocity\n const maxVel = (isListening ? 1.5 : 2.2) * speedMultiplier;\n const vel = Math.sqrt(blob.vx * blob.vx + blob.vy * blob.vy);\n if (vel > maxVel) {\n blob.vx = (blob.vx / vel) * maxVel;\n blob.vy = (blob.vy / vel) * maxVel;\n }\n\n // Update position\n blob.x += blob.vx;\n blob.y += blob.vy;\n\n // Keep within bounds\n const dx = blob.x - centerX;\n const dy = blob.y - centerY;\n const dist = Math.sqrt(dx * dx + dy * dy);\n const maxDist = currentRadius * 0.55;\n if (dist > maxDist) {\n const angle = Math.atan2(dy, dx);\n blob.x = centerX + Math.cos(angle) * maxDist;\n blob.y = centerY + Math.sin(angle) * maxDist;\n blob.vx -= dx * 0.065;\n blob.vy -= dy * 0.065;\n }\n\n // Parse color to RGB\n const rgb = this.hexToRgb(blob.color);\n\n // Draw blob with glow\n const blurRadius = blob.radius * 1.3;\n const outerGlow = ctx.createRadialGradient(blob.x, blob.y, 0, blob.x, blob.y, blurRadius);\n outerGlow.addColorStop(0, `rgba(${rgb}, ${blob.opacity * 0.9})`);\n outerGlow.addColorStop(0.2, `rgba(${rgb}, ${blob.opacity * 0.7})`);\n outerGlow.addColorStop(0.4, `rgba(${rgb}, ${blob.opacity * 0.5})`);\n outerGlow.addColorStop(0.6, `rgba(${rgb}, ${blob.opacity * 0.3})`);\n outerGlow.addColorStop(0.8, `rgba(${rgb}, ${blob.opacity * 0.1})`);\n outerGlow.addColorStop(1, `rgba(${rgb}, 0)`);\n ctx.beginPath();\n ctx.arc(blob.x, blob.y, blurRadius, 0, Math.PI * 2);\n ctx.fillStyle = outerGlow;\n ctx.fill();\n });\n\n // Highlight\n const highlightGradient = ctx.createRadialGradient(\n centerX - currentRadius * 0.3,\n centerY - currentRadius * 0.3,\n 0,\n centerX - currentRadius * 0.3,\n centerY - currentRadius * 0.3,\n currentRadius * 0.6\n );\n highlightGradient.addColorStop(0, 'rgba(255, 255, 255, 0.12)');\n highlightGradient.addColorStop(0.5, 'rgba(255, 255, 255, 0.03)');\n highlightGradient.addColorStop(1, 'rgba(255, 255, 255, 0)');\n ctx.beginPath();\n ctx.arc(centerX, centerY, currentRadius, 0, Math.PI * 2);\n ctx.fillStyle = highlightGradient;\n ctx.fill();\n\n ctx.restore();\n\n this.pulseAnimationId = requestAnimationFrame(this.animatePulse);\n }\n\n private hexToRgb(hex: string): string {\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n if (!result) {\n return '0, 0, 0';\n }\n const r = parseInt(result[1], 16);\n const g = parseInt(result[2], 16);\n const b = parseInt(result[3], 16);\n return `${r}, ${g}, ${b}`;\n }\n\n private cleanup(): void {\n if (this.animationFrameId) {\n cancelAnimationFrame(this.animationFrameId);\n this.animationFrameId = undefined;\n }\n if (this.pulseAnimationId) {\n cancelAnimationFrame(this.pulseAnimationId);\n this.pulseAnimationId = undefined;\n }\n if (this.source) {\n this.source.disconnect();\n this.source = undefined;\n }\n if (this.candidateSource) {\n this.candidateSource.disconnect();\n this.candidateSource = undefined;\n }\n if (this.audioContext && this.audioContext.state !== 'closed') {\n void this.audioContext.close();\n this.audioContext = undefined;\n }\n this.analyser = undefined;\n this.candidateAnalyser = undefined;\n this.dataArray = undefined;\n this.candidateDataArray = undefined;\n }\n\n ngOnDestroy(): void {\n this.cleanup();\n }\n}\n","<div class=\"ai-audio-visualizer\">\n <div class=\"canvas-container\">\n <canvas #pulseCanvas></canvas>\n </div>\n</div>\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { AiAudioCircleComponent } from './ai-audio-circle.component';\n\n@NgModule({\n declarations: [AiAudioCircleComponent],\n imports: [CommonModule],\n exports: [AiAudioCircleComponent],\n})\nexport class AiAudioCircleModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"testgorilla-tgo-ui-components-ai-audio-circle.mjs","sources":["../../../components/ai-audio-circle/ai-audio-circle.component.ts","../../../components/ai-audio-circle/ai-audio-circle.component.html","../../../components/ai-audio-circle/ai-audio-circle.module.ts","../../../components/ai-audio-circle/testgorilla-tgo-ui-components-ai-audio-circle.ts"],"sourcesContent":["import {\n Component,\n input,\n model,\n OnDestroy,\n ChangeDetectionStrategy,\n WritableSignal,\n signal,\n ElementRef,\n ViewChild,\n AfterViewInit,\n effect,\n computed,\n} from '@angular/core';\nimport { Color } from '@testgorilla/tgo-ui/components/core';\n\nexport enum InterviewState {\n CandidateSpeaking = 'candidate-speaking',\n AiListening = 'ai-listening',\n AiSpeaking = 'ai-speaking',\n}\n\n@Component({\n selector: 'ui-ai-audio-circle',\n templateUrl: './ai-audio-circle.component.html',\n styleUrls: ['./ai-audio-circle.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false,\n})\nexport class AiAudioCircleComponent implements OnDestroy, AfterViewInit {\n @ViewChild('pulseCanvas', { static: false }) pulseCanvasRef?: ElementRef<HTMLCanvasElement>;\n\n audioTrack = input<MediaStreamTrack>();\n candidateAudioTrack = input<MediaStreamTrack>();\n state = model<InterviewState>(InterviewState.AiListening);\n canvasSize = input<number>(280);\n animated = input<boolean>(true);\n\n isSpeaking: WritableSignal<boolean> = signal(false);\n scaleValue: WritableSignal<number> = signal(1);\n\n audioContext?: AudioContext;\n analyser?: AnalyserNode;\n candidateAnalyser?: AnalyserNode;\n dataArray?: Uint8Array<ArrayBuffer>;\n candidateDataArray?: Uint8Array<ArrayBuffer>;\n animationFrameId?: number;\n source?: MediaStreamAudioSourceNode;\n candidateSource?: MediaStreamAudioSourceNode;\n\n pulseCtx?: CanvasRenderingContext2D;\n currentAmp = 0.02;\n simTime = 0;\n baseRadius = computed(() => this.canvasSize() * 0.38);\n\n // Audio detection thresholds\n readonly AI_SPEAKING_THRESHOLD = 0.02;\n readonly CANDIDATE_SPEAKING_THRESHOLD = 0.5;\n\n readonly SHADOW_COLOR_RGB = this.hexToRgb(Color.BRAND_50);\n\n pulseTime = 0;\n pulseScale = 1;\n pulseTargetScale = 1;\n pulseAnimationId?: number;\n blobs: Array<{\n x: number;\n y: number;\n vx: number;\n vy: number;\n radius: number;\n color: string;\n opacity: number;\n }> = [];\n\n constructor() {\n effect(() => {\n const audioTrack = this.audioTrack();\n if (audioTrack) {\n this.setupAudioAnalysis();\n }\n });\n\n effect(() => {\n const candidateAudioTrack = this.candidateAudioTrack();\n if (candidateAudioTrack) {\n this.setupCandidateAudioAnalysis();\n }\n });\n }\n\n ngAfterViewInit(): void {\n this.initializeCanvas();\n this.initializeBlobs();\n this.startAnimations();\n }\n\n private initializeCanvas(): void {\n if (!this.pulseCanvasRef) {\n return;\n }\n\n const pulseCanvas = this.pulseCanvasRef.nativeElement;\n\n const dpr = window.devicePixelRatio || 1;\n\n // Setup pulse canvas\n const size = this.canvasSize();\n pulseCanvas.width = size * dpr;\n pulseCanvas.height = size * dpr;\n pulseCanvas.style.width = `${size}px`;\n pulseCanvas.style.height = `${size}px`;\n const ctx = pulseCanvas.getContext('2d');\n if (!ctx) {\n console.error('[AI_AUDIO_CIRCLE] Failed to get 2d context');\n return;\n }\n this.pulseCtx = ctx;\n this.pulseCtx.scale(dpr, dpr);\n }\n\n private initializeBlobs(): void {\n const size = this.canvasSize();\n const centerX = size / 2;\n const centerY = size / 2;\n const baseRadius = this.baseRadius();\n\n const colors = [\n { color: Color.INFORMATIVE_30, opacity: 0.8 },\n { color: Color.INFORMATIVE_20, opacity: 0.7 },\n { color: Color.BRAND_50, opacity: 0.75 },\n { color: Color.BRAND_20, opacity: 0.6 },\n { color: Color.INFORMATIVE_30, opacity: 0.65 },\n ];\n\n // Use deterministic seed values when not animated for stable visual tests\n const seedVelocities = [0.12, -0.08, 0.15, -0.1, 0.06];\n const seedRadii = [0.72, 0.65, 0.8, 0.68, 0.76];\n\n this.blobs = colors.map((c, i) => {\n const angle = (i / colors.length) * Math.PI * 2;\n const dist = baseRadius * 0.25;\n return {\n x: centerX + Math.cos(angle) * dist,\n y: centerY + Math.sin(angle) * dist,\n vx: this.animated() ? (Math.random() - 0.5) * 0.4 : seedVelocities[i],\n vy: this.animated() ? (Math.random() - 0.5) * 0.4 : seedVelocities[(i + 2) % 5],\n radius: baseRadius * (this.animated() ? 0.6 + Math.random() * 0.4 : seedRadii[i]),\n color: c.color,\n opacity: c.opacity,\n };\n });\n }\n\n private setupAudioAnalysis(): void {\n const audioTrack = this.audioTrack();\n if (!audioTrack) {\n return;\n }\n\n try {\n if (!this.audioContext) {\n this.audioContext = new AudioContext();\n }\n\n this.analyser = this.audioContext.createAnalyser();\n this.analyser.fftSize = 256;\n this.analyser.smoothingTimeConstant = 0.8;\n\n const bufferLength = this.analyser.frequencyBinCount;\n this.dataArray = new Uint8Array(bufferLength);\n\n const stream = new MediaStream([audioTrack]);\n this.source = this.audioContext.createMediaStreamSource(stream);\n this.source.connect(this.analyser);\n\n this.analyzeAudio();\n } catch (error) {\n console.error('[AI_AUDIO_CIRCLE] Error setting up audio analysis:', error);\n }\n }\n\n private setupCandidateAudioAnalysis(): void {\n const candidateAudioTrack = this.candidateAudioTrack();\n if (!candidateAudioTrack) {\n return;\n }\n\n try {\n if (!this.audioContext) {\n this.audioContext = new AudioContext();\n }\n\n this.candidateAnalyser = this.audioContext.createAnalyser();\n this.candidateAnalyser.fftSize = 256;\n this.candidateAnalyser.smoothingTimeConstant = 0.8;\n\n const bufferLength = this.candidateAnalyser.frequencyBinCount;\n this.candidateDataArray = new Uint8Array(bufferLength);\n\n const stream = new MediaStream([candidateAudioTrack]);\n this.candidateSource = this.audioContext.createMediaStreamSource(stream);\n this.candidateSource.connect(this.candidateAnalyser);\n } catch (error) {\n console.error('[AI_AUDIO_CIRCLE] Error setting up candidate audio analysis:', error);\n }\n }\n\n private analyzeAudio(): void {\n if (!this.analyser || !this.dataArray) {\n return;\n }\n\n const analyze = () => {\n if (!this.analyser || !this.dataArray) {\n return;\n }\n\n // Analyze AI audio\n this.analyser.getByteFrequencyData(this.dataArray);\n const sum = Array.from(this.dataArray).reduce((a, b) => a + b, 0);\n const aiVolume = sum / this.dataArray.length / 255;\n\n // Analyze candidate audio if available\n let candidateVolume = 0;\n if (this.candidateAnalyser && this.candidateDataArray) {\n this.candidateAnalyser.getByteFrequencyData(this.candidateDataArray);\n const candidateSum = Array.from(this.candidateDataArray).reduce((a, b) => a + b, 0);\n candidateVolume = candidateSum / this.candidateDataArray.length / 255;\n }\n\n const aiSpeaking = aiVolume > this.AI_SPEAKING_THRESHOLD;\n const candidateSpeaking = candidateVolume > this.CANDIDATE_SPEAKING_THRESHOLD;\n\n if (candidateSpeaking) {\n this.state.set(InterviewState.CandidateSpeaking);\n } else if (aiSpeaking) {\n this.state.set(InterviewState.AiSpeaking);\n } else {\n this.state.set(InterviewState.AiListening);\n }\n\n this.isSpeaking.set(aiSpeaking);\n\n // Update amplitude for animations\n const currentStateValue = this.state();\n if (currentStateValue === InterviewState.AiSpeaking && aiSpeaking) {\n const target = Math.pow(aiVolume, 0.8) * 1.3;\n this.currentAmp += (target - this.currentAmp) * 0.4;\n } else if (currentStateValue === InterviewState.CandidateSpeaking) {\n const target = 0.55;\n this.currentAmp += (target - this.currentAmp) * 0.1;\n } else {\n const fixedBase = 0.2;\n this.currentAmp += (fixedBase - this.currentAmp) * 0.05;\n }\n\n this.animationFrameId = requestAnimationFrame(analyze);\n };\n\n this.animationFrameId = requestAnimationFrame(analyze);\n }\n\n private startAnimations(): void {\n this.animatePulse = this.animatePulse.bind(this);\n this.mainLoop = this.mainLoop.bind(this);\n\n if (!this.animated()) {\n // Render a single static frame for deterministic visual tests\n this.animatePulse();\n return;\n }\n\n this.animatePulse();\n this.mainLoop();\n }\n\n private mainLoop(): void {\n this.simTime += 0.05;\n\n const currentStateValue = this.state();\n\n if (currentStateValue === InterviewState.AiSpeaking) {\n if (this.analyser && this.dataArray) {\n // Use real audio amplitude (already handled in analyzeAudio)\n } else {\n // Simulated speaking\n const rhythm = Math.sin(this.simTime * 0.8) * 0.5 + 0.5;\n const spikes = Math.random() * 0.6;\n const target = rhythm * spikes;\n this.currentAmp += (target - this.currentAmp) * 0.2;\n }\n } else if (currentStateValue === InterviewState.CandidateSpeaking) {\n const target = 0.55;\n this.currentAmp += (target - this.currentAmp) * 0.1;\n } else {\n const fixedBase = 0.2;\n this.currentAmp += (fixedBase - this.currentAmp) * 0.05;\n }\n\n requestAnimationFrame(this.mainLoop);\n }\n\n private animatePulse(): void {\n if (!this.pulseCtx) {\n return;\n }\n\n const ctx = this.pulseCtx;\n this.pulseTime += 0.016;\n const size = this.canvasSize();\n const centerX = size / 2;\n const centerY = size / 2;\n const baseRadius = this.baseRadius();\n\n ctx.clearRect(0, 0, size, size);\n\n const currentStateValue = this.state();\n const effectiveAmp = this.currentAmp;\n const isListening = currentStateValue === InterviewState.AiListening;\n const isCandidate = currentStateValue === InterviewState.CandidateSpeaking;\n\n // Scale logic\n if (isCandidate) {\n // Candidate speaking: Fixed enlarged scale (115%), no breathing effect\n this.pulseTargetScale = 1.15;\n const breathing = 0;\n this.pulseScale += (this.pulseTargetScale + breathing - this.pulseScale) * 0.05;\n } else {\n // AI speaking/listening: Scale reacts to audio amplitude, with optional breathing\n // When AI is speaking: effectiveAmp is high, scale grows with voice\n // When AI is listening: effectiveAmp is low (~0.2), scale stays near 1.0 with breathing effect\n this.pulseTargetScale = 1 + effectiveAmp * 0.3;\n const breathing = isListening ? Math.sin(this.pulseTime * 1.5) * 0.035 : 0;\n this.pulseScale += (this.pulseTargetScale + breathing - this.pulseScale) * 0.05;\n }\n\n const currentRadius = baseRadius * this.pulseScale;\n\n // Draw shadows\n for (let i = 3; i >= 1; i--) {\n const shadowRadius = currentRadius + i * 6;\n const shadowOpacity = 0.24 - i * 0.04;\n const shadowGradient = ctx.createRadialGradient(\n centerX,\n centerY,\n currentRadius * 0.98,\n centerX,\n centerY,\n shadowRadius\n );\n shadowGradient.addColorStop(0, `rgba(${this.SHADOW_COLOR_RGB}, ${shadowOpacity})`);\n shadowGradient.addColorStop(0.6, `rgba(${this.SHADOW_COLOR_RGB}, ${shadowOpacity * 0.4})`);\n shadowGradient.addColorStop(1, `rgba(${this.SHADOW_COLOR_RGB}, 0)`);\n ctx.beginPath();\n ctx.arc(centerX, centerY, shadowRadius, 0, Math.PI * 2);\n ctx.fillStyle = shadowGradient;\n ctx.fill();\n }\n\n // Clip to circle\n ctx.save();\n ctx.beginPath();\n ctx.arc(centerX, centerY, currentRadius, 0, Math.PI * 2);\n ctx.clip();\n\n // Background gradient\n const bgGradient = ctx.createLinearGradient(\n centerX - currentRadius,\n centerY - currentRadius,\n centerX + currentRadius,\n centerY + currentRadius\n );\n bgGradient.addColorStop(0, Color.BRAND_50);\n bgGradient.addColorStop(0.5, Color.INFORMATIVE_20);\n bgGradient.addColorStop(1, Color.INFORMATIVE_30);\n ctx.beginPath();\n ctx.arc(centerX, centerY, currentRadius, 0, Math.PI * 2);\n ctx.fillStyle = bgGradient;\n ctx.fill();\n\n // Animate blobs\n let speedMultiplier;\n if (isCandidate) {\n speedMultiplier = 2.0;\n } else if (isListening) {\n speedMultiplier = 1.2;\n } else {\n speedMultiplier = 0.8 + effectiveAmp * 1.5;\n }\n\n this.blobs.forEach((blob, index) => {\n // Chaos forces\n const chaos1 = Math.sin(this.pulseTime * 0.6 + index * 2.5 + blob.x * 0.02) * 0.15;\n const chaos2 = Math.cos(this.pulseTime * 0.4 + index * 1.8 + blob.y * 0.015) * 0.12;\n const chaos3 = Math.sin(this.pulseTime * 1.0 + index * 0.7) * 0.08;\n\n // Apply forces\n blob.vx += (chaos1 + chaos3 * Math.cos(this.pulseTime * 1.5 + index)) * 0.025 * speedMultiplier;\n blob.vy += (chaos2 + chaos3 * Math.sin(this.pulseTime * 1.2 + index)) * 0.025 * speedMultiplier;\n\n // Friction\n blob.vx *= 0.98;\n blob.vy *= 0.98;\n\n // Max velocity\n const maxVel = (isListening ? 1.5 : 2.2) * speedMultiplier;\n const vel = Math.sqrt(blob.vx * blob.vx + blob.vy * blob.vy);\n if (vel > maxVel) {\n blob.vx = (blob.vx / vel) * maxVel;\n blob.vy = (blob.vy / vel) * maxVel;\n }\n\n // Update position\n blob.x += blob.vx;\n blob.y += blob.vy;\n\n // Keep within bounds\n const dx = blob.x - centerX;\n const dy = blob.y - centerY;\n const dist = Math.sqrt(dx * dx + dy * dy);\n const maxDist = currentRadius * 0.55;\n if (dist > maxDist) {\n const angle = Math.atan2(dy, dx);\n blob.x = centerX + Math.cos(angle) * maxDist;\n blob.y = centerY + Math.sin(angle) * maxDist;\n blob.vx -= dx * 0.065;\n blob.vy -= dy * 0.065;\n }\n\n // Parse color to RGB\n const rgb = this.hexToRgb(blob.color);\n\n // Draw blob with glow\n const blurRadius = blob.radius * 1.3;\n const outerGlow = ctx.createRadialGradient(blob.x, blob.y, 0, blob.x, blob.y, blurRadius);\n outerGlow.addColorStop(0, `rgba(${rgb}, ${blob.opacity * 0.9})`);\n outerGlow.addColorStop(0.2, `rgba(${rgb}, ${blob.opacity * 0.7})`);\n outerGlow.addColorStop(0.4, `rgba(${rgb}, ${blob.opacity * 0.5})`);\n outerGlow.addColorStop(0.6, `rgba(${rgb}, ${blob.opacity * 0.3})`);\n outerGlow.addColorStop(0.8, `rgba(${rgb}, ${blob.opacity * 0.1})`);\n outerGlow.addColorStop(1, `rgba(${rgb}, 0)`);\n ctx.beginPath();\n ctx.arc(blob.x, blob.y, blurRadius, 0, Math.PI * 2);\n ctx.fillStyle = outerGlow;\n ctx.fill();\n });\n\n // Highlight\n const highlightGradient = ctx.createRadialGradient(\n centerX - currentRadius * 0.3,\n centerY - currentRadius * 0.3,\n 0,\n centerX - currentRadius * 0.3,\n centerY - currentRadius * 0.3,\n currentRadius * 0.6\n );\n highlightGradient.addColorStop(0, 'rgba(255, 255, 255, 0.12)');\n highlightGradient.addColorStop(0.5, 'rgba(255, 255, 255, 0.03)');\n highlightGradient.addColorStop(1, 'rgba(255, 255, 255, 0)');\n ctx.beginPath();\n ctx.arc(centerX, centerY, currentRadius, 0, Math.PI * 2);\n ctx.fillStyle = highlightGradient;\n ctx.fill();\n\n ctx.restore();\n\n if (this.animated()) {\n this.pulseAnimationId = requestAnimationFrame(this.animatePulse);\n }\n }\n\n private hexToRgb(hex: string): string {\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n if (!result) {\n return '0, 0, 0';\n }\n const r = parseInt(result[1], 16);\n const g = parseInt(result[2], 16);\n const b = parseInt(result[3], 16);\n return `${r}, ${g}, ${b}`;\n }\n\n private cleanup(): void {\n if (this.animationFrameId) {\n cancelAnimationFrame(this.animationFrameId);\n this.animationFrameId = undefined;\n }\n if (this.pulseAnimationId) {\n cancelAnimationFrame(this.pulseAnimationId);\n this.pulseAnimationId = undefined;\n }\n if (this.source) {\n this.source.disconnect();\n this.source = undefined;\n }\n if (this.candidateSource) {\n this.candidateSource.disconnect();\n this.candidateSource = undefined;\n }\n if (this.audioContext && this.audioContext.state !== 'closed') {\n void this.audioContext.close();\n this.audioContext = undefined;\n }\n this.analyser = undefined;\n this.candidateAnalyser = undefined;\n this.dataArray = undefined;\n this.candidateDataArray = undefined;\n }\n\n ngOnDestroy(): void {\n this.cleanup();\n }\n}\n","<div class=\"ai-audio-visualizer\">\n <div class=\"canvas-container\">\n <canvas #pulseCanvas></canvas>\n </div>\n</div>\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { AiAudioCircleComponent } from './ai-audio-circle.component';\n\n@NgModule({\n declarations: [AiAudioCircleComponent],\n imports: [CommonModule],\n exports: [AiAudioCircleComponent],\n})\nexport class AiAudioCircleModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
@@ -195,7 +195,7 @@ class AiFeedbackComponent {
|
|
|
195
195
|
this.resetPanelState();
|
|
196
196
|
}
|
|
197
197
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: AiFeedbackComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
198
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.18", type: AiFeedbackComponent, isStandalone: false, selector: "ui-ai-feedback", inputs: { positiveConfig: { classPropertyName: "positiveConfig", publicName: "positiveConfig", isSignal: true, isRequired: false, transformFunction: null }, negativeConfig: { classPropertyName: "negativeConfig", publicName: "negativeConfig", isSignal: true, isRequired: false, transformFunction: null }, skipPanelForPositive: { classPropertyName: "skipPanelForPositive", publicName: "skipPanelForPositive", isSignal: true, isRequired: false, transformFunction: null }, applicationTheme: { classPropertyName: "applicationTheme", publicName: "applicationTheme", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, isRatingDisabled: { classPropertyName: "isRatingDisabled", publicName: "isRatingDisabled", isSignal: true, isRequired: false, transformFunction: null }, enableAutoEmit: { classPropertyName: "enableAutoEmit", publicName: "enableAutoEmit", isSignal: true, isRequired: false, transformFunction: null }, isPositiveFeedback: { classPropertyName: "isPositiveFeedback", publicName: "isPositiveFeedback", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { isPositiveFeedback: "isPositiveFeedbackChange", selectionChange: "selectionChange", feedbackSubmitted: "feedbackSubmitted", feedbackCancelled: "feedbackCancelled", feedbackChanged: "feedbackChanged" }, ngImport: i0, template: "<div class=\"ai-feedback-wrapper\">\n <div class=\"ai-feedback\" [attr.aria-label]=\"translationContext + 'TITLE' | uiTranslate\" role=\"group\">\n <ui-ai-caveat [applicationTheme]=\"applicationTheme()\"></ui-ai-caveat>\n\n <div class=\"ai-feedback-buttons-section\">\n @if (isRatingDisabled()) {\n <div class=\"ai-feedback-saved\">\n <span class=\"ai-feedback-saved-text\">{{ translationContext + 'RATING_SAVED' | uiTranslate | async }}</span>\n <ui-icon\n [name]=\"isPositiveFeedback() ? 'Thumb-up-filled' : 'Thumb-down-filled'\"\n [filled]=\"true\"\n [applicationTheme]=\"applicationTheme()\"\n [color]=\"'gray'\"\n />\n </div>\n } @else {\n <span class=\"ai-feedback-label\">{{ translationContext + 'TITLE' | uiTranslate | async }}</span>\n\n <div\n class=\"ai-feedback-buttons\"\n role=\"group\"\n [attr.aria-expanded]=\"showPanel()\"\n [attr.aria-controls]=\"showPanel() ? 'feedback-panel' : null\"\n >\n <ui-button\n class=\"ai-feedback-button-positive\"\n data-testid=\"ai-feedback-button-positive\"\n [justIcon]=\"true\"\n [iconName]=\"'Thumb-up-in-line'\"\n [size]=\"'small'\"\n [tooltip]=\"('COMMON.YES' | uiTranslate | async)!\"\n [ariaLabel]=\"('COMMON.YES' | uiTranslate | async)!\"\n [iconFilled]=\"isPositiveFeedback() === true\"\n (buttonClickEvent)=\"onSelectionChange(true)\"\n variant=\"icon-button\"\n role=\"button\"\n >\n </ui-button>\n\n <ui-button\n data-testid=\"ai-feedback-button-negative\"\n [justIcon]=\"true\"\n [iconName]=\"'Thumb-down-in-line'\"\n [size]=\"'small'\"\n [tooltip]=\"('COMMON.NO' | uiTranslate | async)!\"\n [ariaLabel]=\"('COMMON.NO' | uiTranslate | async)!\"\n [iconFilled]=\"isPositiveFeedback() === false\"\n (buttonClickEvent)=\"onSelectionChange(false)\"\n variant=\"icon-button\"\n role=\"button\"\n >\n </ui-button>\n </div>\n }\n </div>\n </div>\n\n @if (showPanel()) {\n @let panelTitle =\n activeConfig()?.title ??\n (panelType() | memoizeFunc: getDefaultPanelTitleTranslation : this | uiTranslate | async);\n\n <ui-card\n id=\"feedback-panel\"\n class=\"feedback-panel\"\n [class.arrow-left]=\"arrowPosition() === 'left'\"\n [class.arrow-right]=\"arrowPosition() === 'right'\"\n [applicationTheme]=\"applicationTheme()\"\n [size]=\"isMobile() ? 'small' : 'medium'\"\n role=\"region\"\n [attr.aria-label]=\"panelTitle\"\n [@slideDown]\n >\n <div class=\"feedback-panel-arrow\"></div>\n\n <div class=\"feedback-panel-content\">\n <div class=\"feedback-panel-title-container\">\n <h4 class=\"feedback-panel-title\">\n {{ panelTitle }}\n </h4>\n\n <ui-button\n [justIcon]=\"true\"\n [iconName]=\"'Close-filled'\"\n [size]=\"'small'\"\n [ariaLabel]=\"'Close feedback panel'\"\n variant=\"icon-button\"\n (buttonClickEvent)=\"closePanel()\"\n >\n </ui-button>\n </div>\n\n @if (variant() === 'panel' && activeConfig()?.options && activeConfig()!.options!.length > 0) {\n <div class=\"feedback-options\">\n @for (option of activeConfig()?.options; track option.id) {\n <ui-tag\n [label]=\"option.label\"\n [isSelected]=\"isOptionSelected(option.id)\"\n [showIconWhenSelected]=\"true\"\n [applicationTheme]=\"applicationTheme()\"\n (press)=\"toggleOption(option.id)\"\n >\n </ui-tag>\n }\n </div>\n }\n\n @if (showOtherField()) {\n <ui-field\n class=\"feedback-field\"\n type=\"text\"\n [label]=\"\n activeConfig()?.otherPlaceholder ?? (translationContext + 'OTHER_PLACEHOLDER' | uiTranslate | async) ?? ''\n \"\n [formControl]=\"otherTextControl\"\n [applicationTheme]=\"applicationTheme()\"\n [fullWidth]=\"true\"\n [showBottomContent]=\"false\"\n >\n </ui-field>\n }\n\n <div class=\"feedback-submit-container\">\n <ui-button\n [label]=\"(translationContext + 'SUBMIT' | uiTranslate | async) || ''\"\n [disabled]=\"isSubmitDisabled()\"\n [size]=\"'small'\"\n [fullWidth]=\"isMobile()\"\n (buttonClickEvent)=\"onSubmit()\"\n variant=\"primary\"\n >\n </ui-button>\n </div>\n </div>\n </ui-card>\n }\n</div>\n", styles: [".bg-teal-60b{background:#1c443c}.bg-teal-30b{background:#31766a}.bg-teal-default{background:#46a997}.bg-teal-30w{background:#7ec3b6}.bg-teal-60w{background:#b5ddd5}.bg-teal-secondary{background:#cbd6cb}.bg-teal-90w{background:#ecf6f5}.bg-petrol-60b{background:#102930}.bg-petrol-30b{background:#1b4754}.bg-petrol-default{background:#276678}.bg-petrol-30w{background:#6894a0}.bg-petrol-60w{background:#a9c2c9}.bg-petrol-secondary{background:#c8d7de}.bg-petrol-90w{background:#e9f0f1}.bg-error-60b{background:#513131}.bg-error-30b{background:#8e5655}.bg-error-60w{background:#e3c3c6}.bg-error-secondary{background:#f0dad9}.bg-error-default{background:#cb7b7a}.bg-warning-secondary{background:#f0d6bb}.bg-warning-default{background:#cca45f}.bg-black{background:#000}.bg-dark{background:#888}.bg-medium{background:#e0e0e0}.bg-grey{background:#ededed}.bg-light{background:#f6f6f6}.bg-white{background:#fff}.bg-box-shadow{background:#00000014}.bg-navigation-subtitle{background:#528593}.bgc-teal-60b{background-color:#1c443c}.bgc-teal-30b{background-color:#31766a}.bgc-teal-default{background-color:#46a997}.bgc-teal-30w{background-color:#7ec3b6}.bgc-teal-60w{background-color:#b5ddd5}.bgc-teal-secondary{background-color:#cbd6cb}.bgc-teal-90w{background-color:#ecf6f5}.bgc-petrol-60b{background-color:#102930}.bgc-petrol-30b{background-color:#1b4754}.bgc-petrol-default{background-color:#276678}.bgc-petrol-30w{background-color:#6894a0}.bgc-petrol-60w{background-color:#a9c2c9}.bgc-petrol-secondary{background-color:#c8d7de}.bgc-petrol-90w{background-color:#e9f0f1}.bgc-error-60b{background-color:#513131}.bgc-error-30b{background-color:#8e5655}.bgc-error-60w{background-color:#e3c3c6}.bgc-error-secondary{background-color:#f0dad9}.bgc-error-default{background-color:#cb7b7a}.bgc-warning-secondary{background-color:#f0d6bb}.bgc-warning-default{background-color:#cca45f}.bgc-black{background-color:#000}.bgc-dark{background-color:#888}.bgc-medium{background-color:#e0e0e0}.bgc-grey{background-color:#ededed}.bgc-light{background-color:#f6f6f6}.bgc-white{background-color:#fff}.bgc-box-shadow{background-color:#00000014}.bgc-navigation-subtitle{background-color:#528593}.ai-feedback-wrapper{position:relative}.ai-feedback{display:flex;flex-flow:row nowrap;align-items:center;justify-content:space-between;gap:16px;padding-right:4px}@media (max-width: 600px){.ai-feedback{flex-wrap:wrap}}.ai-feedback-buttons-section{display:flex;flex-flow:row nowrap;align-items:center;gap:8px;color:#666}@media (max-width: 600px){.ai-feedback-buttons-section{flex:1 0 100%;justify-content:space-between}}.ai-feedback-buttons{display:flex;flex-flow:row nowrap;align-items:center;justify-content:center}.ai-feedback-button-positive{margin-right:8px}.ai-feedback-saved{display:flex;flex-flow:row nowrap;align-items:center;gap:8px}.ai-feedback-saved-text{font-size:12px;color:#666}.feedback-panel{display:block;margin-top:16px}.feedback-panel-arrow{position:absolute;top:-8px;width:16px;height:16px;background:inherit;border-left:1px solid;border-top:1px solid;border-color:inherit;transform:rotate(45deg);transition:right .2s ease-out}.feedback-panel.arrow-left .feedback-panel-arrow{right:40px}.feedback-panel.arrow-right .feedback-panel-arrow{right:8px}.feedback-panel-content{position:relative}.feedback-panel-title-container{display:flex;justify-content:space-between;align-items:center;margin-bottom:16px}.feedback-panel-title{font-size:16px;font-weight:600;color:#242424}.feedback-options{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:16px}.feedback-field{margin-bottom:16px}.feedback-submit-container{display:flex;justify-content:flex-end}@media (max-width: 600px){.feedback-submit-container{display:block}}\n"], dependencies: [{ kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i2.ButtonComponent, selector: "ui-button", inputs: ["size", "variant", "label", "iconPosition", "justIcon", "iconName", "disabled", "loading", "fullWidth", "url", "urlTarget", "value", "tooltip", "isPremium", "type", "companyColor", "buttonBadgeConfig", "applicationTheme", "disabledScaleOnClick", "ariaLabel", "ariaRequired", "ariaLabelledby", "ariaDescribedby", "preventDefault", "hasBackground", "tooltipPosition", "role", "iconFilled"], outputs: ["buttonClickEvent", "buttonHoverEvent"] }, { kind: "component", type: i3.CardComponent, selector: "ui-card", inputs: ["size", "variant", "applicationTheme", "errors", "errorsSize", "selected", "allowSelect", "allowFocus"], outputs: ["cardSelected"] }, { kind: "component", type: i4.TagComponent, selector: "ui-tag", inputs: ["label", "icon", "allowClose", "readOnly", "isSelected", "showIconWhenSelected", "isDisabled", "applicationTheme", "ariaLabel", "ariaRequired"], outputs: ["close", "press"] }, { kind: "component", type: i5.FieldComponent, selector: "ui-field", inputs: ["fullWidth", "fullHeight", "label", "labelHtml", "labelIcon", "fieldName", "placeholder", "id", "value", "badgeVariant", "errors", "disabled", "required", "readOnly", "hintMessage", "type", "updateOnBlur", "allowOnlyDigits", "isAutocompleteOff", "allowNegative", "showBottomContent", "applicationTheme", "ariaLabel", "loading", "isValid", "maxCharacters", "trimOnBlur", "trimOnSubmit", "maxRows", "hasTextAreaCounter", "hideBuiltInErrors", "hideLabelInErrors", "max", "min", "textareaHeight", "borderless", "autosizableTextarea", "isAIVariant", "ariaLabelledby", "ariaDescribedby", "hasError"], outputs: ["validateEvent", "fieldBlur"] }, { kind: "component", type: i6.AiCaveatComponent, selector: "ui-ai-caveat", inputs: ["applicationTheme"] }, { kind: "component", type: i7.IconComponent, selector: "ui-icon", inputs: ["size", "cssClass", "name", "color", "filled", "toggleIconStyle", "applicationTheme", "useFullIconName"] }, { kind: "pipe", type: i8.AsyncPipe, name: "async" }, { kind: "pipe", type: i9.UiTranslatePipe, name: "uiTranslate" }, { kind: "pipe", type: i9.MemoizeFuncPipe, name: "memoizeFunc" }], animations: [
|
|
198
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.18", type: AiFeedbackComponent, isStandalone: false, selector: "ui-ai-feedback", inputs: { positiveConfig: { classPropertyName: "positiveConfig", publicName: "positiveConfig", isSignal: true, isRequired: false, transformFunction: null }, negativeConfig: { classPropertyName: "negativeConfig", publicName: "negativeConfig", isSignal: true, isRequired: false, transformFunction: null }, skipPanelForPositive: { classPropertyName: "skipPanelForPositive", publicName: "skipPanelForPositive", isSignal: true, isRequired: false, transformFunction: null }, applicationTheme: { classPropertyName: "applicationTheme", publicName: "applicationTheme", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, isRatingDisabled: { classPropertyName: "isRatingDisabled", publicName: "isRatingDisabled", isSignal: true, isRequired: false, transformFunction: null }, enableAutoEmit: { classPropertyName: "enableAutoEmit", publicName: "enableAutoEmit", isSignal: true, isRequired: false, transformFunction: null }, isPositiveFeedback: { classPropertyName: "isPositiveFeedback", publicName: "isPositiveFeedback", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { isPositiveFeedback: "isPositiveFeedbackChange", selectionChange: "selectionChange", feedbackSubmitted: "feedbackSubmitted", feedbackCancelled: "feedbackCancelled", feedbackChanged: "feedbackChanged" }, ngImport: i0, template: "<div class=\"ai-feedback-wrapper\">\n <div class=\"ai-feedback\" [attr.aria-label]=\"translationContext + 'TITLE' | uiTranslate\" role=\"group\">\n <ui-ai-caveat [applicationTheme]=\"applicationTheme()\"></ui-ai-caveat>\n\n <div class=\"ai-feedback-buttons-section\">\n @if (isRatingDisabled()) {\n <div class=\"ai-feedback-saved\">\n <span class=\"ai-feedback-saved-text\">{{ translationContext + 'RATING_SAVED' | uiTranslate | async }}</span>\n <ui-icon\n [name]=\"isPositiveFeedback() ? 'Thumb-up-filled' : 'Thumb-down-filled'\"\n [filled]=\"true\"\n [applicationTheme]=\"applicationTheme()\"\n [color]=\"'gray'\"\n />\n </div>\n } @else {\n <span class=\"ai-feedback-label\">{{ translationContext + 'TITLE' | uiTranslate | async }}</span>\n\n <div\n class=\"ai-feedback-buttons\"\n role=\"group\"\n [attr.aria-expanded]=\"showPanel()\"\n [attr.aria-controls]=\"showPanel() ? 'feedback-panel' : null\"\n >\n <ui-button\n class=\"ai-feedback-button-positive\"\n data-testid=\"ai-feedback-button-positive\"\n [justIcon]=\"true\"\n [iconName]=\"'Thumb-up-in-line'\"\n [size]=\"'small'\"\n [tooltip]=\"('COMMON.YES' | uiTranslate | async)!\"\n [ariaLabel]=\"('COMMON.YES' | uiTranslate | async)!\"\n [iconFilled]=\"isPositiveFeedback() === true\"\n (buttonClickEvent)=\"onSelectionChange(true)\"\n variant=\"icon-button\"\n role=\"button\"\n >\n </ui-button>\n\n <ui-button\n data-testid=\"ai-feedback-button-negative\"\n [justIcon]=\"true\"\n [iconName]=\"'Thumb-down-in-line'\"\n [size]=\"'small'\"\n [tooltip]=\"('COMMON.NO' | uiTranslate | async)!\"\n [ariaLabel]=\"('COMMON.NO' | uiTranslate | async)!\"\n [iconFilled]=\"isPositiveFeedback() === false\"\n (buttonClickEvent)=\"onSelectionChange(false)\"\n variant=\"icon-button\"\n role=\"button\"\n >\n </ui-button>\n </div>\n }\n </div>\n </div>\n\n @if (showPanel()) {\n @let panelTitle =\n activeConfig()?.title ??\n (panelType() | memoizeFunc: getDefaultPanelTitleTranslation : this | uiTranslate | async);\n\n <ui-card\n id=\"feedback-panel\"\n class=\"feedback-panel\"\n [class.arrow-left]=\"arrowPosition() === 'left'\"\n [class.arrow-right]=\"arrowPosition() === 'right'\"\n [applicationTheme]=\"applicationTheme()\"\n [size]=\"isMobile() ? 'small' : 'medium'\"\n role=\"region\"\n [attr.aria-label]=\"panelTitle\"\n [@slideDown]\n >\n <div class=\"feedback-panel-arrow\"></div>\n\n <div class=\"feedback-panel-content\">\n <div class=\"feedback-panel-title-container\">\n <h4 class=\"feedback-panel-title\">\n {{ panelTitle }}\n </h4>\n\n <ui-button\n [justIcon]=\"true\"\n [iconName]=\"'Close-filled'\"\n [size]=\"'small'\"\n [ariaLabel]=\"'Close feedback panel'\"\n variant=\"icon-button\"\n (buttonClickEvent)=\"closePanel()\"\n >\n </ui-button>\n </div>\n\n @if (variant() === 'panel' && activeConfig()?.options && activeConfig()!.options!.length > 0) {\n <div class=\"feedback-options\">\n @for (option of activeConfig()?.options; track option.id) {\n <ui-tag\n [label]=\"option.label\"\n [isSelected]=\"isOptionSelected(option.id)\"\n [showIconWhenSelected]=\"true\"\n [applicationTheme]=\"applicationTheme()\"\n (press)=\"toggleOption(option.id)\"\n >\n </ui-tag>\n }\n </div>\n }\n\n @if (showOtherField()) {\n <ui-field\n class=\"feedback-field\"\n type=\"text\"\n [label]=\"\n activeConfig()?.otherPlaceholder ?? (translationContext + 'OTHER_PLACEHOLDER' | uiTranslate | async) ?? ''\n \"\n [formControl]=\"otherTextControl\"\n [applicationTheme]=\"applicationTheme()\"\n [fullWidth]=\"true\"\n [showBottomContent]=\"false\"\n >\n </ui-field>\n }\n\n <div class=\"feedback-submit-container\">\n <ui-button\n [label]=\"(translationContext + 'SUBMIT' | uiTranslate | async) || ''\"\n [disabled]=\"isSubmitDisabled()\"\n [size]=\"'small'\"\n [fullWidth]=\"isMobile()\"\n (buttonClickEvent)=\"onSubmit()\"\n variant=\"primary\"\n >\n </ui-button>\n </div>\n </div>\n </ui-card>\n }\n</div>\n", styles: [".bg-teal-60b{background:#1c443c}.bg-teal-30b{background:#31766a}.bg-teal-default{background:#46a997}.bg-teal-30w{background:#7ec3b6}.bg-teal-60w{background:#b5ddd5}.bg-teal-secondary{background:#cbd6cb}.bg-teal-90w{background:#ecf6f5}.bg-petrol-60b{background:#102930}.bg-petrol-30b{background:#1b4754}.bg-petrol-default{background:#276678}.bg-petrol-30w{background:#6894a0}.bg-petrol-60w{background:#a9c2c9}.bg-petrol-secondary{background:#c8d7de}.bg-petrol-90w{background:#e9f0f1}.bg-error-60b{background:#513131}.bg-error-30b{background:#8e5655}.bg-error-60w{background:#e3c3c6}.bg-error-secondary{background:#f0dad9}.bg-error-default{background:#cb7b7a}.bg-warning-secondary{background:#f0d6bb}.bg-warning-default{background:#cca45f}.bg-black{background:#000}.bg-dark{background:#888}.bg-medium{background:#e0e0e0}.bg-grey{background:#ededed}.bg-light{background:#f6f6f6}.bg-white{background:#fff}.bg-box-shadow{background:#00000014}.bg-navigation-subtitle{background:#528593}.bgc-teal-60b{background-color:#1c443c}.bgc-teal-30b{background-color:#31766a}.bgc-teal-default{background-color:#46a997}.bgc-teal-30w{background-color:#7ec3b6}.bgc-teal-60w{background-color:#b5ddd5}.bgc-teal-secondary{background-color:#cbd6cb}.bgc-teal-90w{background-color:#ecf6f5}.bgc-petrol-60b{background-color:#102930}.bgc-petrol-30b{background-color:#1b4754}.bgc-petrol-default{background-color:#276678}.bgc-petrol-30w{background-color:#6894a0}.bgc-petrol-60w{background-color:#a9c2c9}.bgc-petrol-secondary{background-color:#c8d7de}.bgc-petrol-90w{background-color:#e9f0f1}.bgc-error-60b{background-color:#513131}.bgc-error-30b{background-color:#8e5655}.bgc-error-60w{background-color:#e3c3c6}.bgc-error-secondary{background-color:#f0dad9}.bgc-error-default{background-color:#cb7b7a}.bgc-warning-secondary{background-color:#f0d6bb}.bgc-warning-default{background-color:#cca45f}.bgc-black{background-color:#000}.bgc-dark{background-color:#888}.bgc-medium{background-color:#e0e0e0}.bgc-grey{background-color:#ededed}.bgc-light{background-color:#f6f6f6}.bgc-white{background-color:#fff}.bgc-box-shadow{background-color:#00000014}.bgc-navigation-subtitle{background-color:#528593}.ai-feedback-wrapper{position:relative}.ai-feedback{display:flex;flex-flow:row nowrap;align-items:center;justify-content:space-between;gap:16px;padding-right:4px}@media (max-width: 600px){.ai-feedback{flex-wrap:wrap}}.ai-feedback-buttons-section{display:flex;flex-flow:row nowrap;align-items:center;gap:8px;color:#666}@media (max-width: 600px){.ai-feedback-buttons-section{flex:1 0 100%;justify-content:space-between}}.ai-feedback-buttons{display:flex;flex-flow:row nowrap;align-items:center;justify-content:center}.ai-feedback-button-positive{margin-right:8px}.ai-feedback-saved{display:flex;flex-flow:row nowrap;align-items:center;gap:8px}.ai-feedback-saved-text{font-size:12px;color:#666}.feedback-panel{display:block;margin-top:16px}.feedback-panel-arrow{position:absolute;top:-8px;width:16px;height:16px;background:inherit;border-left:1px solid;border-top:1px solid;border-color:inherit;transform:rotate(45deg);transition:right .2s ease-out}.feedback-panel.arrow-left .feedback-panel-arrow{right:40px}.feedback-panel.arrow-right .feedback-panel-arrow{right:8px}.feedback-panel-content{position:relative}.feedback-panel-title-container{display:flex;justify-content:space-between;align-items:center;margin-bottom:16px}.feedback-panel-title{font-size:16px;font-weight:600;color:#242424}.feedback-options{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:16px}.feedback-field{margin-bottom:16px}.feedback-submit-container{display:flex;justify-content:flex-end}@media (max-width: 600px){.feedback-submit-container{display:block}}\n"], dependencies: [{ kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i2.ButtonComponent, selector: "ui-button", inputs: ["size", "variant", "label", "iconPosition", "justIcon", "iconName", "disabled", "loading", "fullWidth", "url", "urlTarget", "value", "tooltip", "isPremium", "type", "companyColor", "buttonBadgeConfig", "applicationTheme", "disabledScaleOnClick", "ariaLabel", "ariaRequired", "ariaLabelledby", "ariaDescribedby", "preventDefault", "hasBackground", "tooltipPosition", "role", "iconFilled"], outputs: ["buttonClickEvent", "buttonHoverEvent"] }, { kind: "component", type: i3.CardComponent, selector: "ui-card", inputs: ["size", "sizeVariant", "variant", "applicationTheme", "errors", "errorsSize", "selected", "allowSelect", "allowFocus"], outputs: ["cardSelected"] }, { kind: "component", type: i4.TagComponent, selector: "ui-tag", inputs: ["label", "icon", "allowClose", "readOnly", "isSelected", "showIconWhenSelected", "isDisabled", "applicationTheme", "ariaLabel", "ariaRequired"], outputs: ["close", "press"] }, { kind: "component", type: i5.FieldComponent, selector: "ui-field", inputs: ["fullWidth", "fullHeight", "label", "labelHtml", "labelIcon", "fieldName", "placeholder", "id", "value", "badgeVariant", "errors", "disabled", "required", "readOnly", "hintMessage", "type", "updateOnBlur", "allowOnlyDigits", "isAutocompleteOff", "allowNegative", "showBottomContent", "applicationTheme", "ariaLabel", "loading", "isValid", "maxCharacters", "trimOnBlur", "trimOnSubmit", "maxRows", "hasTextAreaCounter", "hideBuiltInErrors", "hideLabelInErrors", "max", "min", "textareaHeight", "borderless", "autosizableTextarea", "isAIVariant", "ariaLabelledby", "ariaDescribedby", "hasError"], outputs: ["validateEvent", "fieldBlur"] }, { kind: "component", type: i6.AiCaveatComponent, selector: "ui-ai-caveat", inputs: ["applicationTheme"] }, { kind: "component", type: i7.IconComponent, selector: "ui-icon", inputs: ["size", "cssClass", "name", "color", "filled", "toggleIconStyle", "applicationTheme", "useFullIconName"] }, { kind: "pipe", type: i8.AsyncPipe, name: "async" }, { kind: "pipe", type: i9.UiTranslatePipe, name: "uiTranslate" }, { kind: "pipe", type: i9.MemoizeFuncPipe, name: "memoizeFunc" }], animations: [
|
|
199
199
|
trigger('slideDown', [
|
|
200
200
|
transition(':enter', [
|
|
201
201
|
style({ height: 0, opacity: 0, overflow: 'hidden' }),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testgorilla-tgo-ui-components-ai-feedback.mjs","sources":["../../../components/ai-feedback/ai-feedback.model.ts","../../../components/ai-feedback/ai-feedback.component.ts","../../../components/ai-feedback/ai-feedback.component.html","../../../components/ai-feedback/ai-feedback.module.ts","../../../components/ai-feedback/testgorilla-tgo-ui-components-ai-feedback.ts"],"sourcesContent":["export enum AiFeedbackPanelType {\n POSITIVE = 'positive',\n NEGATIVE = 'negative',\n}\n\nexport type AiFeedbackVariant = 'default' | 'panel' | 'input-only';\n\nexport interface AiFeedbackOption {\n id: string;\n label: string;\n}\n\nexport interface AiFeedbackConfig {\n title: string;\n options?: AiFeedbackOption[]; // \"Other\" option will be automatically appended if options are provided\n otherPlaceholder?: string;\n}\n\nexport interface AiFeedbackData {\n isPositiveFeedback: boolean | null;\n selectedOptions?: string[];\n otherText?: string;\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n inject,\n input,\n model,\n OnInit,\n output,\n signal,\n} from '@angular/core';\nimport { trigger, transition, style, animate } from '@angular/animations';\nimport { FormControl } from '@angular/forms';\nimport { AiFeedbackPanelType, AiFeedbackConfig, AiFeedbackData, AiFeedbackVariant } from './ai-feedback.model';\nimport { ApplicationTheme, IS_MOBILE_TOKEN } from '@testgorilla/tgo-ui/components/core';\nimport { toSignal, takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { Subject, debounceTime, distinctUntilChanged } from 'rxjs';\n\n@Component({\n selector: 'ui-ai-feedback',\n templateUrl: './ai-feedback.component.html',\n styleUrl: './ai-feedback.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false,\n animations: [\n trigger('slideDown', [\n transition(':enter', [\n style({ height: 0, opacity: 0, overflow: 'hidden' }),\n animate('200ms ease-out', style({ height: '*', opacity: 1 })),\n ]),\n transition(':leave', [animate('200ms ease-in', style({ height: 0, opacity: 0, overflow: 'hidden' }))]),\n ]),\n ],\n})\nexport class AiFeedbackComponent implements OnInit {\n positiveConfig = input<AiFeedbackConfig>();\n negativeConfig = input<AiFeedbackConfig>();\n skipPanelForPositive = input<boolean>(false);\n applicationTheme = input<ApplicationTheme>('light');\n variant = input<AiFeedbackVariant>('default');\n isRatingDisabled = input<boolean>(false);\n enableAutoEmit = input<boolean>(false);\n isPositiveFeedback = model<boolean | null>(null);\n\n selectionChange = output<boolean | null>();\n feedbackSubmitted = output<AiFeedbackData>();\n feedbackCancelled = output<AiFeedbackData>();\n feedbackChanged = output<AiFeedbackData>();\n\n protected readonly isMobile$ = inject(IS_MOBILE_TOKEN);\n private destroyRef = inject(DestroyRef);\n\n isMobile = toSignal(this.isMobile$, { initialValue: false });\n\n showPanel = signal<boolean>(false);\n panelType = signal<AiFeedbackPanelType | null>(null);\n selectedOptions = signal<string[]>([]);\n otherTextControl = new FormControl<string>('');\n otherTextValue = signal<string>('');\n\n private selectedOptionsSubject = new Subject<string[]>();\n private otherTextSubject = new Subject<string>();\n\n readonly translationContext = 'AI_FEEDBACK.';\n readonly AiFeedbackPanelType = AiFeedbackPanelType;\n private readonly defaultPositiveTitle = `${this.translationContext}POSITIVE_TITLE`;\n private readonly defaultNegativeTitle = `${this.translationContext}NEGATIVE_TITLE`;\n private readonly OTHER_OPTION_ID = 'other';\n\n shouldAutoEmit = computed(() => this.enableAutoEmit() && this.variant() !== 'default');\n\n ngOnInit(): void {\n this.otherTextControl.valueChanges.subscribe(value => {\n this.otherTextValue.set(value || '');\n\n if (this.shouldAutoEmit()) {\n this.otherTextSubject.next(value || '');\n }\n });\n\n this.selectedOptionsSubject\n .pipe(\n debounceTime(500),\n distinctUntilChanged((prev, curr) => JSON.stringify(prev) === JSON.stringify(curr)),\n takeUntilDestroyed(this.destroyRef)\n )\n .subscribe(() => {\n this.feedbackChanged.emit({\n isPositiveFeedback: this.isPositiveFeedback(),\n selectedOptions: this.selectedOptions(),\n otherText: this.otherTextControl.value || undefined,\n });\n });\n\n this.otherTextSubject\n .pipe(debounceTime(500), distinctUntilChanged(), takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.feedbackChanged.emit({\n isPositiveFeedback: this.isPositiveFeedback(),\n selectedOptions: this.selectedOptions(),\n otherText: this.otherTextControl.value || undefined,\n });\n });\n }\n\n getDefaultPanelTitleTranslation(panelType: AiFeedbackPanelType | null): string {\n return panelType === AiFeedbackPanelType.POSITIVE ? this.defaultPositiveTitle : this.defaultNegativeTitle;\n }\n\n activeConfig = computed(() => {\n const type = this.panelType();\n\n if (type === AiFeedbackPanelType.POSITIVE) {\n const config = this.positiveConfig();\n if (this.variant() === 'panel' && config?.options?.length) {\n return this.ensureOtherOption(config);\n }\n return config;\n }\n\n if (type === AiFeedbackPanelType.NEGATIVE) {\n const config = this.negativeConfig();\n if (this.variant() === 'panel' && config?.options?.length) {\n return this.ensureOtherOption(config);\n }\n return config;\n }\n\n return null;\n });\n\n arrowPosition = computed(() => (this.panelType() === AiFeedbackPanelType.POSITIVE ? 'left' : 'right'));\n\n isSubmitDisabled = computed(() => {\n switch (this.variant()) {\n case 'input-only':\n return this.otherTextValue().trim().length === 0;\n case 'panel':\n return this.selectedOptions().length === 0;\n case 'default':\n default:\n return false;\n }\n });\n\n private ensureOtherOption(config: AiFeedbackConfig): AiFeedbackConfig {\n if (this.variant() === 'input-only') {\n return config;\n }\n const hasOther = config.options?.some(opt => opt.id === this.OTHER_OPTION_ID);\n return hasOther\n ? config\n : {\n ...config,\n options: [...(config.options || []), { id: this.OTHER_OPTION_ID, label: 'Other' }],\n };\n }\n\n private buildFeedbackData(): AiFeedbackData {\n if (this.variant() === 'input-only') {\n return {\n isPositiveFeedback: this.isPositiveFeedback(),\n otherText: this.otherTextControl.value || undefined,\n };\n }\n return {\n isPositiveFeedback: this.isPositiveFeedback(),\n selectedOptions: this.selectedOptions(),\n otherText: this.otherTextControl.value || undefined,\n };\n }\n\n private resetPanelState(): void {\n this.showPanel.set(false);\n this.panelType.set(null);\n this.selectedOptions.set([]);\n this.otherTextControl.setValue('');\n }\n\n private shouldShowPanelForVariant(): boolean {\n return this.variant() === 'panel' || this.variant() === 'input-only';\n }\n\n onSelectionChange(isPositive: boolean): void {\n if (this.isRatingDisabled()) {\n return;\n }\n\n const newValue = this.isPositiveFeedback() === isPositive ? null : isPositive;\n this.isPositiveFeedback.set(newValue);\n\n this.selectionChange.emit(newValue);\n\n if (newValue !== null) {\n const shouldSkipPanel = isPositive && this.skipPanelForPositive();\n\n if (this.shouldShowPanelForVariant() && !shouldSkipPanel) {\n this.panelType.set(isPositive ? AiFeedbackPanelType.POSITIVE : AiFeedbackPanelType.NEGATIVE);\n this.showPanel.set(true);\n this.selectedOptions.set([]);\n this.otherTextControl.setValue('');\n }\n } else {\n this.closePanel();\n }\n }\n\n toggleOption(optionId: string): void {\n const current = this.selectedOptions();\n const updated = current.includes(optionId) ? current.filter(id => id !== optionId) : [...current, optionId];\n this.selectedOptions.set(updated);\n\n if (this.shouldAutoEmit()) {\n this.selectedOptionsSubject.next(updated);\n }\n }\n\n isOptionSelected(optionId: string): boolean {\n return this.selectedOptions().includes(optionId);\n }\n\n showOtherField(): boolean {\n return this.variant() === 'input-only' || this.selectedOptions().includes(this.OTHER_OPTION_ID);\n }\n\n onSubmit(): void {\n this.feedbackSubmitted.emit(this.buildFeedbackData());\n this.showPanel.set(false);\n }\n\n closePanel(): void {\n this.feedbackCancelled.emit(this.buildFeedbackData());\n this.resetPanelState();\n }\n}\n","<div class=\"ai-feedback-wrapper\">\n <div class=\"ai-feedback\" [attr.aria-label]=\"translationContext + 'TITLE' | uiTranslate\" role=\"group\">\n <ui-ai-caveat [applicationTheme]=\"applicationTheme()\"></ui-ai-caveat>\n\n <div class=\"ai-feedback-buttons-section\">\n @if (isRatingDisabled()) {\n <div class=\"ai-feedback-saved\">\n <span class=\"ai-feedback-saved-text\">{{ translationContext + 'RATING_SAVED' | uiTranslate | async }}</span>\n <ui-icon\n [name]=\"isPositiveFeedback() ? 'Thumb-up-filled' : 'Thumb-down-filled'\"\n [filled]=\"true\"\n [applicationTheme]=\"applicationTheme()\"\n [color]=\"'gray'\"\n />\n </div>\n } @else {\n <span class=\"ai-feedback-label\">{{ translationContext + 'TITLE' | uiTranslate | async }}</span>\n\n <div\n class=\"ai-feedback-buttons\"\n role=\"group\"\n [attr.aria-expanded]=\"showPanel()\"\n [attr.aria-controls]=\"showPanel() ? 'feedback-panel' : null\"\n >\n <ui-button\n class=\"ai-feedback-button-positive\"\n data-testid=\"ai-feedback-button-positive\"\n [justIcon]=\"true\"\n [iconName]=\"'Thumb-up-in-line'\"\n [size]=\"'small'\"\n [tooltip]=\"('COMMON.YES' | uiTranslate | async)!\"\n [ariaLabel]=\"('COMMON.YES' | uiTranslate | async)!\"\n [iconFilled]=\"isPositiveFeedback() === true\"\n (buttonClickEvent)=\"onSelectionChange(true)\"\n variant=\"icon-button\"\n role=\"button\"\n >\n </ui-button>\n\n <ui-button\n data-testid=\"ai-feedback-button-negative\"\n [justIcon]=\"true\"\n [iconName]=\"'Thumb-down-in-line'\"\n [size]=\"'small'\"\n [tooltip]=\"('COMMON.NO' | uiTranslate | async)!\"\n [ariaLabel]=\"('COMMON.NO' | uiTranslate | async)!\"\n [iconFilled]=\"isPositiveFeedback() === false\"\n (buttonClickEvent)=\"onSelectionChange(false)\"\n variant=\"icon-button\"\n role=\"button\"\n >\n </ui-button>\n </div>\n }\n </div>\n </div>\n\n @if (showPanel()) {\n @let panelTitle =\n activeConfig()?.title ??\n (panelType() | memoizeFunc: getDefaultPanelTitleTranslation : this | uiTranslate | async);\n\n <ui-card\n id=\"feedback-panel\"\n class=\"feedback-panel\"\n [class.arrow-left]=\"arrowPosition() === 'left'\"\n [class.arrow-right]=\"arrowPosition() === 'right'\"\n [applicationTheme]=\"applicationTheme()\"\n [size]=\"isMobile() ? 'small' : 'medium'\"\n role=\"region\"\n [attr.aria-label]=\"panelTitle\"\n [@slideDown]\n >\n <div class=\"feedback-panel-arrow\"></div>\n\n <div class=\"feedback-panel-content\">\n <div class=\"feedback-panel-title-container\">\n <h4 class=\"feedback-panel-title\">\n {{ panelTitle }}\n </h4>\n\n <ui-button\n [justIcon]=\"true\"\n [iconName]=\"'Close-filled'\"\n [size]=\"'small'\"\n [ariaLabel]=\"'Close feedback panel'\"\n variant=\"icon-button\"\n (buttonClickEvent)=\"closePanel()\"\n >\n </ui-button>\n </div>\n\n @if (variant() === 'panel' && activeConfig()?.options && activeConfig()!.options!.length > 0) {\n <div class=\"feedback-options\">\n @for (option of activeConfig()?.options; track option.id) {\n <ui-tag\n [label]=\"option.label\"\n [isSelected]=\"isOptionSelected(option.id)\"\n [showIconWhenSelected]=\"true\"\n [applicationTheme]=\"applicationTheme()\"\n (press)=\"toggleOption(option.id)\"\n >\n </ui-tag>\n }\n </div>\n }\n\n @if (showOtherField()) {\n <ui-field\n class=\"feedback-field\"\n type=\"text\"\n [label]=\"\n activeConfig()?.otherPlaceholder ?? (translationContext + 'OTHER_PLACEHOLDER' | uiTranslate | async) ?? ''\n \"\n [formControl]=\"otherTextControl\"\n [applicationTheme]=\"applicationTheme()\"\n [fullWidth]=\"true\"\n [showBottomContent]=\"false\"\n >\n </ui-field>\n }\n\n <div class=\"feedback-submit-container\">\n <ui-button\n [label]=\"(translationContext + 'SUBMIT' | uiTranslate | async) || ''\"\n [disabled]=\"isSubmitDisabled()\"\n [size]=\"'small'\"\n [fullWidth]=\"isMobile()\"\n (buttonClickEvent)=\"onSubmit()\"\n variant=\"primary\"\n >\n </ui-button>\n </div>\n </div>\n </ui-card>\n }\n</div>\n","import { NgModule } from '@angular/core';\nimport { CommonModule, AsyncPipe } from '@angular/common';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { AiFeedbackComponent } from './ai-feedback.component';\nimport { UiTranslatePipe, MemoizeFuncPipe } from '@testgorilla/tgo-ui/components/core';\nimport { ButtonComponentModule } from '@testgorilla/tgo-ui/components/button';\nimport { CardComponentModule } from '@testgorilla/tgo-ui/components/card';\nimport { TagComponentModule } from '@testgorilla/tgo-ui/components/tag';\nimport { FieldComponentModule } from '@testgorilla/tgo-ui/components/field';\nimport { AiCaveatComponentModule } from '@testgorilla/tgo-ui/components/ai-caveat';\nimport { IconComponentModule } from '@testgorilla/tgo-ui/components/icon';\n\n@NgModule({\n declarations: [AiFeedbackComponent],\n imports: [\n CommonModule,\n AsyncPipe,\n ReactiveFormsModule,\n ButtonComponentModule,\n CardComponentModule,\n TagComponentModule,\n FieldComponentModule,\n AiCaveatComponentModule,\n IconComponentModule,\n UiTranslatePipe,\n MemoizeFuncPipe,\n ],\n exports: [AiFeedbackComponent],\n})\nexport class AiFeedbackModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"testgorilla-tgo-ui-components-ai-feedback.mjs","sources":["../../../components/ai-feedback/ai-feedback.model.ts","../../../components/ai-feedback/ai-feedback.component.ts","../../../components/ai-feedback/ai-feedback.component.html","../../../components/ai-feedback/ai-feedback.module.ts","../../../components/ai-feedback/testgorilla-tgo-ui-components-ai-feedback.ts"],"sourcesContent":["export enum AiFeedbackPanelType {\n POSITIVE = 'positive',\n NEGATIVE = 'negative',\n}\n\nexport type AiFeedbackVariant = 'default' | 'panel' | 'input-only';\n\nexport interface AiFeedbackOption {\n id: string;\n label: string;\n}\n\nexport interface AiFeedbackConfig {\n title: string;\n options?: AiFeedbackOption[]; // \"Other\" option will be automatically appended if options are provided\n otherPlaceholder?: string;\n}\n\nexport interface AiFeedbackData {\n isPositiveFeedback: boolean | null;\n selectedOptions?: string[];\n otherText?: string;\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n inject,\n input,\n model,\n OnInit,\n output,\n signal,\n} from '@angular/core';\nimport { trigger, transition, style, animate } from '@angular/animations';\nimport { FormControl } from '@angular/forms';\nimport { AiFeedbackPanelType, AiFeedbackConfig, AiFeedbackData, AiFeedbackVariant } from './ai-feedback.model';\nimport { ApplicationTheme, IS_MOBILE_TOKEN } from '@testgorilla/tgo-ui/components/core';\nimport { toSignal, takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { Subject, debounceTime, distinctUntilChanged } from 'rxjs';\n\n@Component({\n selector: 'ui-ai-feedback',\n templateUrl: './ai-feedback.component.html',\n styleUrl: './ai-feedback.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false,\n animations: [\n trigger('slideDown', [\n transition(':enter', [\n style({ height: 0, opacity: 0, overflow: 'hidden' }),\n animate('200ms ease-out', style({ height: '*', opacity: 1 })),\n ]),\n transition(':leave', [animate('200ms ease-in', style({ height: 0, opacity: 0, overflow: 'hidden' }))]),\n ]),\n ],\n})\nexport class AiFeedbackComponent implements OnInit {\n positiveConfig = input<AiFeedbackConfig>();\n negativeConfig = input<AiFeedbackConfig>();\n skipPanelForPositive = input<boolean>(false);\n applicationTheme = input<ApplicationTheme>('light');\n variant = input<AiFeedbackVariant>('default');\n isRatingDisabled = input<boolean>(false);\n enableAutoEmit = input<boolean>(false);\n isPositiveFeedback = model<boolean | null>(null);\n\n selectionChange = output<boolean | null>();\n feedbackSubmitted = output<AiFeedbackData>();\n feedbackCancelled = output<AiFeedbackData>();\n feedbackChanged = output<AiFeedbackData>();\n\n protected readonly isMobile$ = inject(IS_MOBILE_TOKEN);\n private destroyRef = inject(DestroyRef);\n\n isMobile = toSignal(this.isMobile$, { initialValue: false });\n\n showPanel = signal<boolean>(false);\n panelType = signal<AiFeedbackPanelType | null>(null);\n selectedOptions = signal<string[]>([]);\n otherTextControl = new FormControl<string>('');\n otherTextValue = signal<string>('');\n\n private selectedOptionsSubject = new Subject<string[]>();\n private otherTextSubject = new Subject<string>();\n\n readonly translationContext = 'AI_FEEDBACK.';\n readonly AiFeedbackPanelType = AiFeedbackPanelType;\n private readonly defaultPositiveTitle = `${this.translationContext}POSITIVE_TITLE`;\n private readonly defaultNegativeTitle = `${this.translationContext}NEGATIVE_TITLE`;\n private readonly OTHER_OPTION_ID = 'other';\n\n shouldAutoEmit = computed(() => this.enableAutoEmit() && this.variant() !== 'default');\n\n ngOnInit(): void {\n this.otherTextControl.valueChanges.subscribe(value => {\n this.otherTextValue.set(value || '');\n\n if (this.shouldAutoEmit()) {\n this.otherTextSubject.next(value || '');\n }\n });\n\n this.selectedOptionsSubject\n .pipe(\n debounceTime(500),\n distinctUntilChanged((prev, curr) => JSON.stringify(prev) === JSON.stringify(curr)),\n takeUntilDestroyed(this.destroyRef)\n )\n .subscribe(() => {\n this.feedbackChanged.emit({\n isPositiveFeedback: this.isPositiveFeedback(),\n selectedOptions: this.selectedOptions(),\n otherText: this.otherTextControl.value || undefined,\n });\n });\n\n this.otherTextSubject\n .pipe(debounceTime(500), distinctUntilChanged(), takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.feedbackChanged.emit({\n isPositiveFeedback: this.isPositiveFeedback(),\n selectedOptions: this.selectedOptions(),\n otherText: this.otherTextControl.value || undefined,\n });\n });\n }\n\n getDefaultPanelTitleTranslation(panelType: AiFeedbackPanelType | null): string {\n return panelType === AiFeedbackPanelType.POSITIVE ? this.defaultPositiveTitle : this.defaultNegativeTitle;\n }\n\n activeConfig = computed(() => {\n const type = this.panelType();\n\n if (type === AiFeedbackPanelType.POSITIVE) {\n const config = this.positiveConfig();\n if (this.variant() === 'panel' && config?.options?.length) {\n return this.ensureOtherOption(config);\n }\n return config;\n }\n\n if (type === AiFeedbackPanelType.NEGATIVE) {\n const config = this.negativeConfig();\n if (this.variant() === 'panel' && config?.options?.length) {\n return this.ensureOtherOption(config);\n }\n return config;\n }\n\n return null;\n });\n\n arrowPosition = computed(() => (this.panelType() === AiFeedbackPanelType.POSITIVE ? 'left' : 'right'));\n\n isSubmitDisabled = computed(() => {\n switch (this.variant()) {\n case 'input-only':\n return this.otherTextValue().trim().length === 0;\n case 'panel':\n return this.selectedOptions().length === 0;\n case 'default':\n default:\n return false;\n }\n });\n\n private ensureOtherOption(config: AiFeedbackConfig): AiFeedbackConfig {\n if (this.variant() === 'input-only') {\n return config;\n }\n const hasOther = config.options?.some(opt => opt.id === this.OTHER_OPTION_ID);\n return hasOther\n ? config\n : {\n ...config,\n options: [...(config.options || []), { id: this.OTHER_OPTION_ID, label: 'Other' }],\n };\n }\n\n private buildFeedbackData(): AiFeedbackData {\n if (this.variant() === 'input-only') {\n return {\n isPositiveFeedback: this.isPositiveFeedback(),\n otherText: this.otherTextControl.value || undefined,\n };\n }\n return {\n isPositiveFeedback: this.isPositiveFeedback(),\n selectedOptions: this.selectedOptions(),\n otherText: this.otherTextControl.value || undefined,\n };\n }\n\n private resetPanelState(): void {\n this.showPanel.set(false);\n this.panelType.set(null);\n this.selectedOptions.set([]);\n this.otherTextControl.setValue('');\n }\n\n private shouldShowPanelForVariant(): boolean {\n return this.variant() === 'panel' || this.variant() === 'input-only';\n }\n\n onSelectionChange(isPositive: boolean): void {\n if (this.isRatingDisabled()) {\n return;\n }\n\n const newValue = this.isPositiveFeedback() === isPositive ? null : isPositive;\n this.isPositiveFeedback.set(newValue);\n\n this.selectionChange.emit(newValue);\n\n if (newValue !== null) {\n const shouldSkipPanel = isPositive && this.skipPanelForPositive();\n\n if (this.shouldShowPanelForVariant() && !shouldSkipPanel) {\n this.panelType.set(isPositive ? AiFeedbackPanelType.POSITIVE : AiFeedbackPanelType.NEGATIVE);\n this.showPanel.set(true);\n this.selectedOptions.set([]);\n this.otherTextControl.setValue('');\n }\n } else {\n this.closePanel();\n }\n }\n\n toggleOption(optionId: string): void {\n const current = this.selectedOptions();\n const updated = current.includes(optionId) ? current.filter(id => id !== optionId) : [...current, optionId];\n this.selectedOptions.set(updated);\n\n if (this.shouldAutoEmit()) {\n this.selectedOptionsSubject.next(updated);\n }\n }\n\n isOptionSelected(optionId: string): boolean {\n return this.selectedOptions().includes(optionId);\n }\n\n showOtherField(): boolean {\n return this.variant() === 'input-only' || this.selectedOptions().includes(this.OTHER_OPTION_ID);\n }\n\n onSubmit(): void {\n this.feedbackSubmitted.emit(this.buildFeedbackData());\n this.showPanel.set(false);\n }\n\n closePanel(): void {\n this.feedbackCancelled.emit(this.buildFeedbackData());\n this.resetPanelState();\n }\n}\n","<div class=\"ai-feedback-wrapper\">\n <div class=\"ai-feedback\" [attr.aria-label]=\"translationContext + 'TITLE' | uiTranslate\" role=\"group\">\n <ui-ai-caveat [applicationTheme]=\"applicationTheme()\"></ui-ai-caveat>\n\n <div class=\"ai-feedback-buttons-section\">\n @if (isRatingDisabled()) {\n <div class=\"ai-feedback-saved\">\n <span class=\"ai-feedback-saved-text\">{{ translationContext + 'RATING_SAVED' | uiTranslate | async }}</span>\n <ui-icon\n [name]=\"isPositiveFeedback() ? 'Thumb-up-filled' : 'Thumb-down-filled'\"\n [filled]=\"true\"\n [applicationTheme]=\"applicationTheme()\"\n [color]=\"'gray'\"\n />\n </div>\n } @else {\n <span class=\"ai-feedback-label\">{{ translationContext + 'TITLE' | uiTranslate | async }}</span>\n\n <div\n class=\"ai-feedback-buttons\"\n role=\"group\"\n [attr.aria-expanded]=\"showPanel()\"\n [attr.aria-controls]=\"showPanel() ? 'feedback-panel' : null\"\n >\n <ui-button\n class=\"ai-feedback-button-positive\"\n data-testid=\"ai-feedback-button-positive\"\n [justIcon]=\"true\"\n [iconName]=\"'Thumb-up-in-line'\"\n [size]=\"'small'\"\n [tooltip]=\"('COMMON.YES' | uiTranslate | async)!\"\n [ariaLabel]=\"('COMMON.YES' | uiTranslate | async)!\"\n [iconFilled]=\"isPositiveFeedback() === true\"\n (buttonClickEvent)=\"onSelectionChange(true)\"\n variant=\"icon-button\"\n role=\"button\"\n >\n </ui-button>\n\n <ui-button\n data-testid=\"ai-feedback-button-negative\"\n [justIcon]=\"true\"\n [iconName]=\"'Thumb-down-in-line'\"\n [size]=\"'small'\"\n [tooltip]=\"('COMMON.NO' | uiTranslate | async)!\"\n [ariaLabel]=\"('COMMON.NO' | uiTranslate | async)!\"\n [iconFilled]=\"isPositiveFeedback() === false\"\n (buttonClickEvent)=\"onSelectionChange(false)\"\n variant=\"icon-button\"\n role=\"button\"\n >\n </ui-button>\n </div>\n }\n </div>\n </div>\n\n @if (showPanel()) {\n @let panelTitle =\n activeConfig()?.title ??\n (panelType() | memoizeFunc: getDefaultPanelTitleTranslation : this | uiTranslate | async);\n\n <ui-card\n id=\"feedback-panel\"\n class=\"feedback-panel\"\n [class.arrow-left]=\"arrowPosition() === 'left'\"\n [class.arrow-right]=\"arrowPosition() === 'right'\"\n [applicationTheme]=\"applicationTheme()\"\n [size]=\"isMobile() ? 'small' : 'medium'\"\n role=\"region\"\n [attr.aria-label]=\"panelTitle\"\n [@slideDown]\n >\n <div class=\"feedback-panel-arrow\"></div>\n\n <div class=\"feedback-panel-content\">\n <div class=\"feedback-panel-title-container\">\n <h4 class=\"feedback-panel-title\">\n {{ panelTitle }}\n </h4>\n\n <ui-button\n [justIcon]=\"true\"\n [iconName]=\"'Close-filled'\"\n [size]=\"'small'\"\n [ariaLabel]=\"'Close feedback panel'\"\n variant=\"icon-button\"\n (buttonClickEvent)=\"closePanel()\"\n >\n </ui-button>\n </div>\n\n @if (variant() === 'panel' && activeConfig()?.options && activeConfig()!.options!.length > 0) {\n <div class=\"feedback-options\">\n @for (option of activeConfig()?.options; track option.id) {\n <ui-tag\n [label]=\"option.label\"\n [isSelected]=\"isOptionSelected(option.id)\"\n [showIconWhenSelected]=\"true\"\n [applicationTheme]=\"applicationTheme()\"\n (press)=\"toggleOption(option.id)\"\n >\n </ui-tag>\n }\n </div>\n }\n\n @if (showOtherField()) {\n <ui-field\n class=\"feedback-field\"\n type=\"text\"\n [label]=\"\n activeConfig()?.otherPlaceholder ?? (translationContext + 'OTHER_PLACEHOLDER' | uiTranslate | async) ?? ''\n \"\n [formControl]=\"otherTextControl\"\n [applicationTheme]=\"applicationTheme()\"\n [fullWidth]=\"true\"\n [showBottomContent]=\"false\"\n >\n </ui-field>\n }\n\n <div class=\"feedback-submit-container\">\n <ui-button\n [label]=\"(translationContext + 'SUBMIT' | uiTranslate | async) || ''\"\n [disabled]=\"isSubmitDisabled()\"\n [size]=\"'small'\"\n [fullWidth]=\"isMobile()\"\n (buttonClickEvent)=\"onSubmit()\"\n variant=\"primary\"\n >\n </ui-button>\n </div>\n </div>\n </ui-card>\n }\n</div>\n","import { NgModule } from '@angular/core';\nimport { CommonModule, AsyncPipe } from '@angular/common';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { AiFeedbackComponent } from './ai-feedback.component';\nimport { UiTranslatePipe, MemoizeFuncPipe } from '@testgorilla/tgo-ui/components/core';\nimport { ButtonComponentModule } from '@testgorilla/tgo-ui/components/button';\nimport { CardComponentModule } from '@testgorilla/tgo-ui/components/card';\nimport { TagComponentModule } from '@testgorilla/tgo-ui/components/tag';\nimport { FieldComponentModule } from '@testgorilla/tgo-ui/components/field';\nimport { AiCaveatComponentModule } from '@testgorilla/tgo-ui/components/ai-caveat';\nimport { IconComponentModule } from '@testgorilla/tgo-ui/components/icon';\n\n@NgModule({\n declarations: [AiFeedbackComponent],\n imports: [\n CommonModule,\n AsyncPipe,\n ReactiveFormsModule,\n ButtonComponentModule,\n CardComponentModule,\n TagComponentModule,\n FieldComponentModule,\n AiCaveatComponentModule,\n IconComponentModule,\n UiTranslatePipe,\n MemoizeFuncPipe,\n ],\n exports: [AiFeedbackComponent],\n})\nexport class AiFeedbackModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
@@ -1,20 +1,18 @@
|
|
|
1
1
|
import { trigger, transition, animate, style } from '@angular/animations';
|
|
2
2
|
import * as i0 from '@angular/core';
|
|
3
3
|
import { HostBinding, Input, Optional, Inject, ChangeDetectionStrategy, Component, NgModule } from '@angular/core';
|
|
4
|
-
import * as
|
|
4
|
+
import * as i4 from '@testgorilla/tgo-ui/components/core';
|
|
5
5
|
import { alertBarsUtil, UiTranslatePipe } from '@testgorilla/tgo-ui/components/core';
|
|
6
|
-
import * as i1 from '@angular/
|
|
7
|
-
import * as i2 from '@angular/common';
|
|
6
|
+
import * as i1 from '@angular/common';
|
|
8
7
|
import { CommonModule } from '@angular/common';
|
|
9
|
-
import * as
|
|
8
|
+
import * as i2 from '@testgorilla/tgo-ui/components/button';
|
|
10
9
|
import { ButtonComponentModule } from '@testgorilla/tgo-ui/components/button';
|
|
11
|
-
import * as
|
|
10
|
+
import * as i3 from '@testgorilla/tgo-ui/components/icon';
|
|
12
11
|
import { IconComponentModule } from '@testgorilla/tgo-ui/components/icon';
|
|
13
12
|
|
|
14
13
|
class AlertBannerComponent {
|
|
15
|
-
constructor(defaultAppTheme
|
|
14
|
+
constructor(defaultAppTheme) {
|
|
16
15
|
this.defaultAppTheme = defaultAppTheme;
|
|
17
|
-
this.domSanitizer = domSanitizer;
|
|
18
16
|
/**
|
|
19
17
|
* Alert Banner type
|
|
20
18
|
*
|
|
@@ -31,6 +29,12 @@ class AlertBannerComponent {
|
|
|
31
29
|
* @memberof AlertBannerComponent
|
|
32
30
|
*/
|
|
33
31
|
this.alertVariant = 'banner';
|
|
32
|
+
/**
|
|
33
|
+
* Alert banner message
|
|
34
|
+
*
|
|
35
|
+
* @memberof AlertBannerComponent
|
|
36
|
+
*/
|
|
37
|
+
this.message = '';
|
|
34
38
|
/**
|
|
35
39
|
* Include dismmiss button
|
|
36
40
|
*
|
|
@@ -100,25 +104,13 @@ class AlertBannerComponent {
|
|
|
100
104
|
* @memberof AlertBannerComponent
|
|
101
105
|
*/
|
|
102
106
|
this.ariaDescribedby = '';
|
|
107
|
+
this.secondaryAlerts = [];
|
|
103
108
|
this.visible = true;
|
|
104
|
-
this._message = '';
|
|
105
|
-
this._secondaryAlerts = [];
|
|
106
109
|
this.dismissAlertBanner = false;
|
|
107
110
|
if (defaultAppTheme) {
|
|
108
111
|
this.applicationTheme = defaultAppTheme;
|
|
109
112
|
}
|
|
110
113
|
}
|
|
111
|
-
/**
|
|
112
|
-
* Alert banner message
|
|
113
|
-
*
|
|
114
|
-
* @memberof AlertBannerComponent
|
|
115
|
-
*/
|
|
116
|
-
set message(msg) {
|
|
117
|
-
this._message = this.domSanitizer.bypassSecurityTrustHtml(msg);
|
|
118
|
-
}
|
|
119
|
-
set secondaryAlerts(alerts) {
|
|
120
|
-
this._secondaryAlerts = alerts.map(alert => this.domSanitizer.bypassSecurityTrustHtml(alert));
|
|
121
|
-
}
|
|
122
114
|
get isDismissed() {
|
|
123
115
|
return this.dismissAlertBanner;
|
|
124
116
|
}
|
|
@@ -144,8 +136,8 @@ class AlertBannerComponent {
|
|
|
144
136
|
this.dismissAlertBanner = true;
|
|
145
137
|
}, 200);
|
|
146
138
|
}
|
|
147
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: AlertBannerComponent, deps: [{ token: 'CANOPYUI_DEFAULT_APPLICATION_THEME', optional: true }
|
|
148
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.18", type: AlertBannerComponent, isStandalone: false, selector: "ui-alert-banner", inputs: { alertType: "alertType", alertVariant: "alertVariant", message: "message", includeDismissButton: "includeDismissButton", shadow: "shadow", linkText: "linkText", linkUrl: "linkUrl", linkTarget: "linkTarget", applicationTheme: "applicationTheme", isFullWidth: "isFullWidth", closeButtonTooltip: "closeButtonTooltip", hasIcon: "hasIcon", fixed: "fixed", ariaDescribedby: "ariaDescribedby", secondaryAlerts: "secondaryAlerts" }, host: { properties: { "class.display-none": "this.isDismissed" } }, usesOnChanges: true, ngImport: i0, template: "<div\n [ngClass]=\"cssClass\"\n [@openClose]\n *ngIf=\"visible\"\n role=\"alert\"\n class=\"alert-container\"\n [attr.theme]=\"applicationTheme\"\n [class.shadow]=\"alertVariant === 'callout' && shadow\"\n [attr.aria-live]=\"(alertType === 'error' || alertType === 'warning') ? 'assertive' : 'polite'\"\n [attr.aria-describedby]=\"'describedby'\"\n [attr.aria-labelledby]=\"'labelledby'\"\n [tabIndex]=\"0\"\n>\n <span style=\"position: absolute; left: -9999px\" id=\"labelledby\">{{ ('ALERT_BANNER.' + (alertType | uppercase)) | uiTranslate | async }}</span>\n <span [style.display]=\"'none'\" id=\"describedby\">{{ ariaDescribedby }}</span>\n <div class=\"primary-alert-container\">\n <div class=\"alert-text\">\n @if (hasIcon) {\n <ui-icon class=\"left-icon\" [name]=\"iconName\" size=\"24\" [applicationTheme]=\"applicationTheme\"></ui-icon>\n }\n <span [innerHTML]=\"_message\"></span>\n <a *ngIf=\"!!linkText\" [target]=\"linkTarget\" [href]=\"linkUrl\">{{ linkText }}</a>\n </div>\n <ui-button\n *ngIf=\"includeDismissButton && applicationTheme === 'classic'\"\n variant=\"text\"\n [justIcon]=\"true\"\n class=\"close\"\n iconName=\"Close\"\n (buttonClickEvent)=\"dismissClick()\"\n ></ui-button>\n <ui-button\n *ngIf=\"includeDismissButton && applicationTheme !== 'classic' && alertVariant !== 'callout'\"\n class=\"right-icon\"\n [variant]=\"'icon-button'\"\n [applicationTheme]=\"applicationTheme\"\n [iconName]=\"'Close'\"\n [size]=\"'small'\"\n [justIcon]=\"true\"\n [tooltip]=\"(closeButtonTooltip || ('COMMON.CLOSE' | uiTranslate | async))!\"\n (click)=\"dismissClick()\"\n ></ui-button>\n </div>\n <div class=\"secondary-alerts-container\">\n <div class=\"alert-text\" *ngFor=\"let alert of _secondaryAlerts\">\n <ui-icon class=\"left-icon\" [name]=\"'Stop-filled'\" [applicationTheme]=\"applicationTheme\"></ui-icon>\n <span [innerHTML]=\"alert\"></span>\n </div>\n </div>\n</div>\n", styles: [".bg-teal-60b{background:#1c443c}.bg-teal-30b{background:#31766a}.bg-teal-default{background:#46a997}.bg-teal-30w{background:#7ec3b6}.bg-teal-60w{background:#b5ddd5}.bg-teal-secondary{background:#cbd6cb}.bg-teal-90w{background:#ecf6f5}.bg-petrol-60b{background:#102930}.bg-petrol-30b{background:#1b4754}.bg-petrol-default{background:#276678}.bg-petrol-30w{background:#6894a0}.bg-petrol-60w{background:#a9c2c9}.bg-petrol-secondary{background:#c8d7de}.bg-petrol-90w{background:#e9f0f1}.bg-error-60b{background:#513131}.bg-error-30b{background:#8e5655}.bg-error-60w{background:#e3c3c6}.bg-error-secondary{background:#f0dad9}.bg-error-default{background:#cb7b7a}.bg-warning-secondary{background:#f0d6bb}.bg-warning-default{background:#cca45f}.bg-black{background:#000}.bg-dark{background:#888}.bg-medium{background:#e0e0e0}.bg-grey{background:#ededed}.bg-light{background:#f6f6f6}.bg-white{background:#fff}.bg-box-shadow{background:#00000014}.bg-navigation-subtitle{background:#528593}.bgc-teal-60b{background-color:#1c443c}.bgc-teal-30b{background-color:#31766a}.bgc-teal-default{background-color:#46a997}.bgc-teal-30w{background-color:#7ec3b6}.bgc-teal-60w{background-color:#b5ddd5}.bgc-teal-secondary{background-color:#cbd6cb}.bgc-teal-90w{background-color:#ecf6f5}.bgc-petrol-60b{background-color:#102930}.bgc-petrol-30b{background-color:#1b4754}.bgc-petrol-default{background-color:#276678}.bgc-petrol-30w{background-color:#6894a0}.bgc-petrol-60w{background-color:#a9c2c9}.bgc-petrol-secondary{background-color:#c8d7de}.bgc-petrol-90w{background-color:#e9f0f1}.bgc-error-60b{background-color:#513131}.bgc-error-30b{background-color:#8e5655}.bgc-error-60w{background-color:#e3c3c6}.bgc-error-secondary{background-color:#f0dad9}.bgc-error-default{background-color:#cb7b7a}.bgc-warning-secondary{background-color:#f0d6bb}.bgc-warning-default{background-color:#cca45f}.bgc-black{background-color:#000}.bgc-dark{background-color:#888}.bgc-medium{background-color:#e0e0e0}.bgc-grey{background-color:#ededed}.bgc-light{background-color:#f6f6f6}.bgc-white{background-color:#fff}.bgc-box-shadow{background-color:#00000014}.bgc-navigation-subtitle{background-color:#528593}:host{display:flex;width:100%;justify-content:center}:host .snackbar-container{max-width:600px}:host .alert-container,:host .snackbar-container{margin:0 auto;display:flex;padding:0 14px;border-radius:4px;align-items:center;justify-content:space-between;opacity:1;min-height:48px}:host .alert-container.fixed,:host .snackbar-container.fixed{position:fixed}:host .alert-container.static,:host .snackbar-container.static{position:relative}:host .alert-container ui-icon,:host .snackbar-container ui-icon{margin-right:14px}:host .alert-container ui-button,:host .snackbar-container ui-button{margin-left:14px}:host .alert-container ::ng-deep button.mat-mdc-unelevated-button.big,:host .snackbar-container ::ng-deep button.mat-mdc-unelevated-button.big{padding:0;min-width:auto}:host .alert-container .alert-text,:host .alert-container .snackbar-text,:host .snackbar-container .alert-text,:host .snackbar-container .snackbar-text{display:flex;align-items:center;color:#000}:host .alert-container .alert-text a,:host .alert-container .snackbar-text a,:host .snackbar-container .alert-text a,:host .snackbar-container .snackbar-text a{color:#000;text-decoration:underline;font-weight:700}:host .alert-container .alert-text a:hover,:host .alert-container .alert-text a:visited,:host .alert-container .alert-text a:focus,:host .alert-container .snackbar-text a:hover,:host .alert-container .snackbar-text a:visited,:host .alert-container .snackbar-text a:focus,:host .snackbar-container .alert-text a:hover,:host .snackbar-container .alert-text a:visited,:host .snackbar-container .alert-text a:focus,:host .snackbar-container .snackbar-text a:hover,:host .snackbar-container .snackbar-text a:visited,:host .snackbar-container .snackbar-text a:focus{text-decoration:none}:host .alert-container.success,:host .snackbar-container.success{background-color:#cbd6cb}:host .alert-container.info,:host .snackbar-container.info{background-color:#c8d7de}:host .alert-container.warning,:host .snackbar-container.warning{background-color:#f0d6bb}:host .alert-container.error,:host .snackbar-container.error{background-color:#e3c3c6}:host .alert-container[theme=dark].success,:host .alert-container[theme=light].success,:host .snackbar-container[theme=dark].success,:host .snackbar-container[theme=light].success{background-color:#aae47a}:host .alert-container[theme=dark].info,:host .alert-container[theme=light].info,:host .snackbar-container[theme=dark].info,:host .snackbar-container[theme=light].info{background-color:#d9e8ff}:host .alert-container[theme=dark].warning,:host .alert-container[theme=light].warning,:host .snackbar-container[theme=dark].warning,:host .snackbar-container[theme=light].warning{background-color:#ffe1b3}:host .alert-container[theme=dark].error,:host .alert-container[theme=light].error,:host .snackbar-container[theme=dark].error,:host .snackbar-container[theme=light].error{background-color:#ffac9a}::ng-deep .display-none{display:none!important}@media (max-width: 600px){:host .alert-container,:host .snackbar-container{padding:8px 14px}}:host .alert-container{max-width:1312px;flex-direction:column}:host .alert-container.fixed{top:0;z-index:98}:host .alert-container.full-width{width:100%;min-width:100%}:host .alert-container a{margin-left:7px}:host .alert-container[theme=dark] .alert-text,:host .alert-container[theme=light] .alert-text{padding:12px 0}:host .alert-container[theme=dark].banner,:host .alert-container[theme=light].banner{border-radius:0}:host .alert-container[theme=dark].callout,:host .alert-container[theme=light].callout{border-radius:10px}:host .alert-container[theme=dark].shadow,:host .alert-container[theme=light].shadow{box-shadow:0 4px 16px #2424240a}:host .alert-container[theme=dark] .left-icon,:host .alert-container[theme=light] .left-icon{margin-right:8px}:host .alert-container[theme=dark] .right-icon,:host .alert-container[theme=light] .right-icon{cursor:pointer;margin-left:8px;margin-right:2px}:host .alert-container .primary-alert-container{display:flex;justify-content:space-between;align-items:center;width:100%}:host .alert-container .secondary-alerts-container{padding-left:8px;display:flex;width:100%;flex-direction:column}:host .alert-container .secondary-alerts-container .alert-text{padding:4px 0}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.ButtonComponent, selector: "ui-button", inputs: ["size", "variant", "label", "iconPosition", "justIcon", "iconName", "disabled", "loading", "fullWidth", "url", "urlTarget", "value", "tooltip", "isPremium", "type", "companyColor", "buttonBadgeConfig", "applicationTheme", "disabledScaleOnClick", "ariaLabel", "ariaRequired", "ariaLabelledby", "ariaDescribedby", "preventDefault", "hasBackground", "tooltipPosition", "role", "iconFilled"], outputs: ["buttonClickEvent", "buttonHoverEvent"] }, { kind: "component", type: i4.IconComponent, selector: "ui-icon", inputs: ["size", "cssClass", "name", "color", "filled", "toggleIconStyle", "applicationTheme", "useFullIconName"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i2.UpperCasePipe, name: "uppercase" }, { kind: "pipe", type: i5.UiTranslatePipe, name: "uiTranslate" }], animations: [
|
|
139
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: AlertBannerComponent, deps: [{ token: 'CANOPYUI_DEFAULT_APPLICATION_THEME', optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
140
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.18", type: AlertBannerComponent, isStandalone: false, selector: "ui-alert-banner", inputs: { alertType: "alertType", alertVariant: "alertVariant", message: "message", includeDismissButton: "includeDismissButton", shadow: "shadow", linkText: "linkText", linkUrl: "linkUrl", linkTarget: "linkTarget", applicationTheme: "applicationTheme", isFullWidth: "isFullWidth", closeButtonTooltip: "closeButtonTooltip", hasIcon: "hasIcon", fixed: "fixed", ariaDescribedby: "ariaDescribedby", secondaryAlerts: "secondaryAlerts" }, host: { properties: { "class.display-none": "this.isDismissed" } }, usesOnChanges: true, ngImport: i0, template: "<div\n [ngClass]=\"cssClass\"\n [@openClose]\n *ngIf=\"visible\"\n role=\"alert\"\n class=\"alert-container\"\n [attr.theme]=\"applicationTheme\"\n [class.shadow]=\"alertVariant === 'callout' && shadow\"\n [attr.aria-live]=\"alertType === 'error' || alertType === 'warning' ? 'assertive' : 'polite'\"\n [attr.aria-describedby]=\"'describedby'\"\n [attr.aria-labelledby]=\"'labelledby'\"\n [tabIndex]=\"0\"\n>\n <span style=\"position: absolute; left: -9999px\" id=\"labelledby\">{{\n 'ALERT_BANNER.' + (alertType | uppercase) | uiTranslate | async\n }}</span>\n <span [style.display]=\"'none'\" id=\"describedby\">{{ ariaDescribedby }}</span>\n <div class=\"primary-alert-container\">\n <div class=\"alert-text\">\n @if (hasIcon) {\n <ui-icon class=\"left-icon\" [name]=\"iconName\" size=\"24\" [applicationTheme]=\"applicationTheme\"></ui-icon>\n }\n <span [innerHTML]=\"message\"></span>\n <a *ngIf=\"!!linkText\" [target]=\"linkTarget\" [href]=\"linkUrl\">{{ linkText }}</a>\n </div>\n <ui-button\n *ngIf=\"includeDismissButton && applicationTheme === 'classic'\"\n variant=\"text\"\n [justIcon]=\"true\"\n class=\"close\"\n iconName=\"Close\"\n (buttonClickEvent)=\"dismissClick()\"\n ></ui-button>\n <ui-button\n *ngIf=\"includeDismissButton && applicationTheme !== 'classic' && alertVariant !== 'callout'\"\n class=\"right-icon\"\n [variant]=\"'icon-button'\"\n [applicationTheme]=\"applicationTheme\"\n [iconName]=\"'Close'\"\n [size]=\"'small'\"\n [justIcon]=\"true\"\n [tooltip]=\"(closeButtonTooltip || ('COMMON.CLOSE' | uiTranslate | async))!\"\n (click)=\"dismissClick()\"\n ></ui-button>\n </div>\n <div class=\"secondary-alerts-container\">\n <div class=\"alert-text\" *ngFor=\"let alert of secondaryAlerts\">\n <ui-icon class=\"left-icon\" [name]=\"'Stop-filled'\" [applicationTheme]=\"applicationTheme\"></ui-icon>\n <span [innerHTML]=\"alert\"></span>\n </div>\n </div>\n</div>\n", styles: [".bg-teal-60b{background:#1c443c}.bg-teal-30b{background:#31766a}.bg-teal-default{background:#46a997}.bg-teal-30w{background:#7ec3b6}.bg-teal-60w{background:#b5ddd5}.bg-teal-secondary{background:#cbd6cb}.bg-teal-90w{background:#ecf6f5}.bg-petrol-60b{background:#102930}.bg-petrol-30b{background:#1b4754}.bg-petrol-default{background:#276678}.bg-petrol-30w{background:#6894a0}.bg-petrol-60w{background:#a9c2c9}.bg-petrol-secondary{background:#c8d7de}.bg-petrol-90w{background:#e9f0f1}.bg-error-60b{background:#513131}.bg-error-30b{background:#8e5655}.bg-error-60w{background:#e3c3c6}.bg-error-secondary{background:#f0dad9}.bg-error-default{background:#cb7b7a}.bg-warning-secondary{background:#f0d6bb}.bg-warning-default{background:#cca45f}.bg-black{background:#000}.bg-dark{background:#888}.bg-medium{background:#e0e0e0}.bg-grey{background:#ededed}.bg-light{background:#f6f6f6}.bg-white{background:#fff}.bg-box-shadow{background:#00000014}.bg-navigation-subtitle{background:#528593}.bgc-teal-60b{background-color:#1c443c}.bgc-teal-30b{background-color:#31766a}.bgc-teal-default{background-color:#46a997}.bgc-teal-30w{background-color:#7ec3b6}.bgc-teal-60w{background-color:#b5ddd5}.bgc-teal-secondary{background-color:#cbd6cb}.bgc-teal-90w{background-color:#ecf6f5}.bgc-petrol-60b{background-color:#102930}.bgc-petrol-30b{background-color:#1b4754}.bgc-petrol-default{background-color:#276678}.bgc-petrol-30w{background-color:#6894a0}.bgc-petrol-60w{background-color:#a9c2c9}.bgc-petrol-secondary{background-color:#c8d7de}.bgc-petrol-90w{background-color:#e9f0f1}.bgc-error-60b{background-color:#513131}.bgc-error-30b{background-color:#8e5655}.bgc-error-60w{background-color:#e3c3c6}.bgc-error-secondary{background-color:#f0dad9}.bgc-error-default{background-color:#cb7b7a}.bgc-warning-secondary{background-color:#f0d6bb}.bgc-warning-default{background-color:#cca45f}.bgc-black{background-color:#000}.bgc-dark{background-color:#888}.bgc-medium{background-color:#e0e0e0}.bgc-grey{background-color:#ededed}.bgc-light{background-color:#f6f6f6}.bgc-white{background-color:#fff}.bgc-box-shadow{background-color:#00000014}.bgc-navigation-subtitle{background-color:#528593}:host{display:flex;width:100%;justify-content:center}:host .snackbar-container{max-width:600px}:host .alert-container,:host .snackbar-container{margin:0 auto;display:flex;padding:0 14px;border-radius:4px;align-items:center;justify-content:space-between;opacity:1;min-height:48px}:host .alert-container.fixed,:host .snackbar-container.fixed{position:fixed}:host .alert-container.static,:host .snackbar-container.static{position:relative}:host .alert-container ui-icon,:host .snackbar-container ui-icon{margin-right:14px}:host .alert-container ui-button,:host .snackbar-container ui-button{margin-left:14px}:host .alert-container ::ng-deep button.mat-mdc-unelevated-button.big,:host .snackbar-container ::ng-deep button.mat-mdc-unelevated-button.big{padding:0;min-width:auto}:host .alert-container .alert-text,:host .alert-container .snackbar-text,:host .snackbar-container .alert-text,:host .snackbar-container .snackbar-text{display:flex;align-items:center;color:#000}:host .alert-container .alert-text a,:host .alert-container .snackbar-text a,:host .snackbar-container .alert-text a,:host .snackbar-container .snackbar-text a{color:#000;text-decoration:underline;font-weight:700}:host .alert-container .alert-text a:hover,:host .alert-container .alert-text a:visited,:host .alert-container .alert-text a:focus,:host .alert-container .snackbar-text a:hover,:host .alert-container .snackbar-text a:visited,:host .alert-container .snackbar-text a:focus,:host .snackbar-container .alert-text a:hover,:host .snackbar-container .alert-text a:visited,:host .snackbar-container .alert-text a:focus,:host .snackbar-container .snackbar-text a:hover,:host .snackbar-container .snackbar-text a:visited,:host .snackbar-container .snackbar-text a:focus{text-decoration:none}:host .alert-container.success,:host .snackbar-container.success{background-color:#cbd6cb}:host .alert-container.info,:host .snackbar-container.info{background-color:#c8d7de}:host .alert-container.warning,:host .snackbar-container.warning{background-color:#f0d6bb}:host .alert-container.error,:host .snackbar-container.error{background-color:#e3c3c6}:host .alert-container[theme=dark].success,:host .alert-container[theme=light].success,:host .snackbar-container[theme=dark].success,:host .snackbar-container[theme=light].success{background-color:#aae47a}:host .alert-container[theme=dark].info,:host .alert-container[theme=light].info,:host .snackbar-container[theme=dark].info,:host .snackbar-container[theme=light].info{background-color:#d9e8ff}:host .alert-container[theme=dark].warning,:host .alert-container[theme=light].warning,:host .snackbar-container[theme=dark].warning,:host .snackbar-container[theme=light].warning{background-color:#ffe1b3}:host .alert-container[theme=dark].error,:host .alert-container[theme=light].error,:host .snackbar-container[theme=dark].error,:host .snackbar-container[theme=light].error{background-color:#ffac9a}::ng-deep .display-none{display:none!important}@media (max-width: 600px){:host .alert-container,:host .snackbar-container{padding:8px 14px}}:host .alert-container{max-width:1312px;flex-direction:column}:host .alert-container.fixed{top:0;z-index:98}:host .alert-container.full-width{width:100%;min-width:100%}:host .alert-container a{margin-left:7px}:host .alert-container[theme=dark] .alert-text,:host .alert-container[theme=light] .alert-text{padding:12px 0}:host .alert-container[theme=dark].banner,:host .alert-container[theme=light].banner{border-radius:0}:host .alert-container[theme=dark].callout,:host .alert-container[theme=light].callout{border-radius:10px}:host .alert-container[theme=dark].shadow,:host .alert-container[theme=light].shadow{box-shadow:0 4px 16px #2424240a}:host .alert-container[theme=dark] .left-icon,:host .alert-container[theme=light] .left-icon{margin-right:8px}:host .alert-container[theme=dark] .right-icon,:host .alert-container[theme=light] .right-icon{cursor:pointer;margin-left:8px;margin-right:2px}:host .alert-container .primary-alert-container{display:flex;justify-content:space-between;align-items:center;width:100%}:host .alert-container .secondary-alerts-container{padding-left:8px;display:flex;width:100%;flex-direction:column}:host .alert-container .secondary-alerts-container .alert-text{padding:4px 0}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.ButtonComponent, selector: "ui-button", inputs: ["size", "variant", "label", "iconPosition", "justIcon", "iconName", "disabled", "loading", "fullWidth", "url", "urlTarget", "value", "tooltip", "isPremium", "type", "companyColor", "buttonBadgeConfig", "applicationTheme", "disabledScaleOnClick", "ariaLabel", "ariaRequired", "ariaLabelledby", "ariaDescribedby", "preventDefault", "hasBackground", "tooltipPosition", "role", "iconFilled"], outputs: ["buttonClickEvent", "buttonHoverEvent"] }, { kind: "component", type: i3.IconComponent, selector: "ui-icon", inputs: ["size", "cssClass", "name", "color", "filled", "toggleIconStyle", "applicationTheme", "useFullIconName"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.UpperCasePipe, name: "uppercase" }, { kind: "pipe", type: i4.UiTranslatePipe, name: "uiTranslate" }], animations: [
|
|
149
141
|
trigger('openClose', [
|
|
150
142
|
transition(':enter', [animate('0.2s ease-out', style({ opacity: 1 }))]),
|
|
151
143
|
transition(':leave', [animate('0.2s ease-in', style({ opacity: 0 }))]),
|
|
@@ -159,13 +151,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImpo
|
|
|
159
151
|
transition(':enter', [animate('0.2s ease-out', style({ opacity: 1 }))]),
|
|
160
152
|
transition(':leave', [animate('0.2s ease-in', style({ opacity: 0 }))]),
|
|
161
153
|
]),
|
|
162
|
-
], changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, template: "<div\n [ngClass]=\"cssClass\"\n [@openClose]\n *ngIf=\"visible\"\n role=\"alert\"\n class=\"alert-container\"\n [attr.theme]=\"applicationTheme\"\n [class.shadow]=\"alertVariant === 'callout' && shadow\"\n [attr.aria-live]=\"
|
|
154
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, template: "<div\n [ngClass]=\"cssClass\"\n [@openClose]\n *ngIf=\"visible\"\n role=\"alert\"\n class=\"alert-container\"\n [attr.theme]=\"applicationTheme\"\n [class.shadow]=\"alertVariant === 'callout' && shadow\"\n [attr.aria-live]=\"alertType === 'error' || alertType === 'warning' ? 'assertive' : 'polite'\"\n [attr.aria-describedby]=\"'describedby'\"\n [attr.aria-labelledby]=\"'labelledby'\"\n [tabIndex]=\"0\"\n>\n <span style=\"position: absolute; left: -9999px\" id=\"labelledby\">{{\n 'ALERT_BANNER.' + (alertType | uppercase) | uiTranslate | async\n }}</span>\n <span [style.display]=\"'none'\" id=\"describedby\">{{ ariaDescribedby }}</span>\n <div class=\"primary-alert-container\">\n <div class=\"alert-text\">\n @if (hasIcon) {\n <ui-icon class=\"left-icon\" [name]=\"iconName\" size=\"24\" [applicationTheme]=\"applicationTheme\"></ui-icon>\n }\n <span [innerHTML]=\"message\"></span>\n <a *ngIf=\"!!linkText\" [target]=\"linkTarget\" [href]=\"linkUrl\">{{ linkText }}</a>\n </div>\n <ui-button\n *ngIf=\"includeDismissButton && applicationTheme === 'classic'\"\n variant=\"text\"\n [justIcon]=\"true\"\n class=\"close\"\n iconName=\"Close\"\n (buttonClickEvent)=\"dismissClick()\"\n ></ui-button>\n <ui-button\n *ngIf=\"includeDismissButton && applicationTheme !== 'classic' && alertVariant !== 'callout'\"\n class=\"right-icon\"\n [variant]=\"'icon-button'\"\n [applicationTheme]=\"applicationTheme\"\n [iconName]=\"'Close'\"\n [size]=\"'small'\"\n [justIcon]=\"true\"\n [tooltip]=\"(closeButtonTooltip || ('COMMON.CLOSE' | uiTranslate | async))!\"\n (click)=\"dismissClick()\"\n ></ui-button>\n </div>\n <div class=\"secondary-alerts-container\">\n <div class=\"alert-text\" *ngFor=\"let alert of secondaryAlerts\">\n <ui-icon class=\"left-icon\" [name]=\"'Stop-filled'\" [applicationTheme]=\"applicationTheme\"></ui-icon>\n <span [innerHTML]=\"alert\"></span>\n </div>\n </div>\n</div>\n", styles: [".bg-teal-60b{background:#1c443c}.bg-teal-30b{background:#31766a}.bg-teal-default{background:#46a997}.bg-teal-30w{background:#7ec3b6}.bg-teal-60w{background:#b5ddd5}.bg-teal-secondary{background:#cbd6cb}.bg-teal-90w{background:#ecf6f5}.bg-petrol-60b{background:#102930}.bg-petrol-30b{background:#1b4754}.bg-petrol-default{background:#276678}.bg-petrol-30w{background:#6894a0}.bg-petrol-60w{background:#a9c2c9}.bg-petrol-secondary{background:#c8d7de}.bg-petrol-90w{background:#e9f0f1}.bg-error-60b{background:#513131}.bg-error-30b{background:#8e5655}.bg-error-60w{background:#e3c3c6}.bg-error-secondary{background:#f0dad9}.bg-error-default{background:#cb7b7a}.bg-warning-secondary{background:#f0d6bb}.bg-warning-default{background:#cca45f}.bg-black{background:#000}.bg-dark{background:#888}.bg-medium{background:#e0e0e0}.bg-grey{background:#ededed}.bg-light{background:#f6f6f6}.bg-white{background:#fff}.bg-box-shadow{background:#00000014}.bg-navigation-subtitle{background:#528593}.bgc-teal-60b{background-color:#1c443c}.bgc-teal-30b{background-color:#31766a}.bgc-teal-default{background-color:#46a997}.bgc-teal-30w{background-color:#7ec3b6}.bgc-teal-60w{background-color:#b5ddd5}.bgc-teal-secondary{background-color:#cbd6cb}.bgc-teal-90w{background-color:#ecf6f5}.bgc-petrol-60b{background-color:#102930}.bgc-petrol-30b{background-color:#1b4754}.bgc-petrol-default{background-color:#276678}.bgc-petrol-30w{background-color:#6894a0}.bgc-petrol-60w{background-color:#a9c2c9}.bgc-petrol-secondary{background-color:#c8d7de}.bgc-petrol-90w{background-color:#e9f0f1}.bgc-error-60b{background-color:#513131}.bgc-error-30b{background-color:#8e5655}.bgc-error-60w{background-color:#e3c3c6}.bgc-error-secondary{background-color:#f0dad9}.bgc-error-default{background-color:#cb7b7a}.bgc-warning-secondary{background-color:#f0d6bb}.bgc-warning-default{background-color:#cca45f}.bgc-black{background-color:#000}.bgc-dark{background-color:#888}.bgc-medium{background-color:#e0e0e0}.bgc-grey{background-color:#ededed}.bgc-light{background-color:#f6f6f6}.bgc-white{background-color:#fff}.bgc-box-shadow{background-color:#00000014}.bgc-navigation-subtitle{background-color:#528593}:host{display:flex;width:100%;justify-content:center}:host .snackbar-container{max-width:600px}:host .alert-container,:host .snackbar-container{margin:0 auto;display:flex;padding:0 14px;border-radius:4px;align-items:center;justify-content:space-between;opacity:1;min-height:48px}:host .alert-container.fixed,:host .snackbar-container.fixed{position:fixed}:host .alert-container.static,:host .snackbar-container.static{position:relative}:host .alert-container ui-icon,:host .snackbar-container ui-icon{margin-right:14px}:host .alert-container ui-button,:host .snackbar-container ui-button{margin-left:14px}:host .alert-container ::ng-deep button.mat-mdc-unelevated-button.big,:host .snackbar-container ::ng-deep button.mat-mdc-unelevated-button.big{padding:0;min-width:auto}:host .alert-container .alert-text,:host .alert-container .snackbar-text,:host .snackbar-container .alert-text,:host .snackbar-container .snackbar-text{display:flex;align-items:center;color:#000}:host .alert-container .alert-text a,:host .alert-container .snackbar-text a,:host .snackbar-container .alert-text a,:host .snackbar-container .snackbar-text a{color:#000;text-decoration:underline;font-weight:700}:host .alert-container .alert-text a:hover,:host .alert-container .alert-text a:visited,:host .alert-container .alert-text a:focus,:host .alert-container .snackbar-text a:hover,:host .alert-container .snackbar-text a:visited,:host .alert-container .snackbar-text a:focus,:host .snackbar-container .alert-text a:hover,:host .snackbar-container .alert-text a:visited,:host .snackbar-container .alert-text a:focus,:host .snackbar-container .snackbar-text a:hover,:host .snackbar-container .snackbar-text a:visited,:host .snackbar-container .snackbar-text a:focus{text-decoration:none}:host .alert-container.success,:host .snackbar-container.success{background-color:#cbd6cb}:host .alert-container.info,:host .snackbar-container.info{background-color:#c8d7de}:host .alert-container.warning,:host .snackbar-container.warning{background-color:#f0d6bb}:host .alert-container.error,:host .snackbar-container.error{background-color:#e3c3c6}:host .alert-container[theme=dark].success,:host .alert-container[theme=light].success,:host .snackbar-container[theme=dark].success,:host .snackbar-container[theme=light].success{background-color:#aae47a}:host .alert-container[theme=dark].info,:host .alert-container[theme=light].info,:host .snackbar-container[theme=dark].info,:host .snackbar-container[theme=light].info{background-color:#d9e8ff}:host .alert-container[theme=dark].warning,:host .alert-container[theme=light].warning,:host .snackbar-container[theme=dark].warning,:host .snackbar-container[theme=light].warning{background-color:#ffe1b3}:host .alert-container[theme=dark].error,:host .alert-container[theme=light].error,:host .snackbar-container[theme=dark].error,:host .snackbar-container[theme=light].error{background-color:#ffac9a}::ng-deep .display-none{display:none!important}@media (max-width: 600px){:host .alert-container,:host .snackbar-container{padding:8px 14px}}:host .alert-container{max-width:1312px;flex-direction:column}:host .alert-container.fixed{top:0;z-index:98}:host .alert-container.full-width{width:100%;min-width:100%}:host .alert-container a{margin-left:7px}:host .alert-container[theme=dark] .alert-text,:host .alert-container[theme=light] .alert-text{padding:12px 0}:host .alert-container[theme=dark].banner,:host .alert-container[theme=light].banner{border-radius:0}:host .alert-container[theme=dark].callout,:host .alert-container[theme=light].callout{border-radius:10px}:host .alert-container[theme=dark].shadow,:host .alert-container[theme=light].shadow{box-shadow:0 4px 16px #2424240a}:host .alert-container[theme=dark] .left-icon,:host .alert-container[theme=light] .left-icon{margin-right:8px}:host .alert-container[theme=dark] .right-icon,:host .alert-container[theme=light] .right-icon{cursor:pointer;margin-left:8px;margin-right:2px}:host .alert-container .primary-alert-container{display:flex;justify-content:space-between;align-items:center;width:100%}:host .alert-container .secondary-alerts-container{padding-left:8px;display:flex;width:100%;flex-direction:column}:host .alert-container .secondary-alerts-container .alert-text{padding:4px 0}\n"] }]
|
|
163
155
|
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
164
156
|
type: Optional
|
|
165
157
|
}, {
|
|
166
158
|
type: Inject,
|
|
167
159
|
args: ['CANOPYUI_DEFAULT_APPLICATION_THEME']
|
|
168
|
-
}] }
|
|
160
|
+
}] }], propDecorators: { alertType: [{
|
|
169
161
|
type: Input
|
|
170
162
|
}], alertVariant: [{
|
|
171
163
|
type: Input
|