@testgorilla/tgo-ui 6.0.1 → 6.0.3-beta
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/tabs/tabs.component.d.ts +4 -3
- package/fesm2022/testgorilla-tgo-ui-components-ai-audio-circle.mjs +8 -8
- package/fesm2022/testgorilla-tgo-ui-components-ai-audio-circle.mjs.map +1 -1
- package/fesm2022/testgorilla-tgo-ui-components-tabs.mjs +44 -26
- package/fesm2022/testgorilla-tgo-ui-components-tabs.mjs.map +1 -1
- package/package.json +20 -20
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { EventEmitter } from '@angular/core';
|
|
2
|
-
import {
|
|
2
|
+
import { MatTabGroup } from '@angular/material/tabs';
|
|
3
3
|
import { ApplicationTheme } from '@testgorilla/tgo-ui/components/core';
|
|
4
4
|
import { Observable } from 'rxjs';
|
|
5
|
-
import {
|
|
5
|
+
import { Tab, TabsType } from './tabs.model';
|
|
6
6
|
import * as i0 from "@angular/core";
|
|
7
7
|
export declare class TabsComponent {
|
|
8
8
|
private readonly defaultAppTheme;
|
|
@@ -59,12 +59,13 @@ export declare class TabsComponent {
|
|
|
59
59
|
readonly tabIndex: import("@angular/core").WritableSignal<number>;
|
|
60
60
|
protected tabIndexMap: Record<string, number>;
|
|
61
61
|
private insertionCounter;
|
|
62
|
+
private tabTransitionInProgress;
|
|
62
63
|
constructor(defaultAppTheme: ApplicationTheme, isMobile$: Observable<boolean>);
|
|
63
64
|
ngAfterViewInit(): void;
|
|
64
65
|
addTab(tab: Tab): void;
|
|
65
66
|
private sortTabs;
|
|
66
67
|
private updateTabIndexMap;
|
|
67
|
-
onTabChange(
|
|
68
|
+
onTabChange(index: number): void;
|
|
68
69
|
selectTab(tabName: string): void;
|
|
69
70
|
indexOf(tabName: string): number;
|
|
70
71
|
trackByTabName(index: number, tab: Tab): string;
|
|
@@ -175,8 +175,8 @@ class AiAudioCircleComponent {
|
|
|
175
175
|
// Update amplitude for animations
|
|
176
176
|
const currentStateValue = this.state();
|
|
177
177
|
if (currentStateValue === InterviewState.AiSpeaking && aiSpeaking) {
|
|
178
|
-
const target = Math.pow(aiVolume, 0.
|
|
179
|
-
this.currentAmp += (target - this.currentAmp) * 0.
|
|
178
|
+
const target = Math.pow(aiVolume, 0.75) * 1.8;
|
|
179
|
+
this.currentAmp += (target - this.currentAmp) * 0.5;
|
|
180
180
|
}
|
|
181
181
|
else if (currentStateValue === InterviewState.CandidateSpeaking) {
|
|
182
182
|
const target = 0.55;
|
|
@@ -211,9 +211,9 @@ class AiAudioCircleComponent {
|
|
|
211
211
|
else {
|
|
212
212
|
// Simulated speaking
|
|
213
213
|
const rhythm = Math.sin(this.simTime * 0.8) * 0.5 + 0.5;
|
|
214
|
-
const spikes = Math.random() * 0.
|
|
214
|
+
const spikes = Math.random() * 0.9;
|
|
215
215
|
const target = rhythm * spikes;
|
|
216
|
-
this.currentAmp += (target - this.currentAmp) * 0.
|
|
216
|
+
this.currentAmp += (target - this.currentAmp) * 0.25;
|
|
217
217
|
}
|
|
218
218
|
}
|
|
219
219
|
else if (currentStateValue === InterviewState.CandidateSpeaking) {
|
|
@@ -252,9 +252,9 @@ class AiAudioCircleComponent {
|
|
|
252
252
|
// AI speaking/listening: Scale reacts to audio amplitude, with optional breathing
|
|
253
253
|
// When AI is speaking: effectiveAmp is high, scale grows with voice
|
|
254
254
|
// When AI is listening: effectiveAmp is low (~0.2), scale stays near 1.0 with breathing effect
|
|
255
|
-
this.pulseTargetScale = 1 + effectiveAmp * 0.
|
|
255
|
+
this.pulseTargetScale = 1 + effectiveAmp * 0.45;
|
|
256
256
|
const breathing = isListening ? Math.sin(this.pulseTime * 1.5) * 0.035 : 0;
|
|
257
|
-
this.pulseScale += (this.pulseTargetScale + breathing - this.pulseScale) * 0.
|
|
257
|
+
this.pulseScale += (this.pulseTargetScale + breathing - this.pulseScale) * 0.06;
|
|
258
258
|
}
|
|
259
259
|
const currentRadius = baseRadius * this.pulseScale;
|
|
260
260
|
// Draw shadows
|
|
@@ -293,7 +293,7 @@ class AiAudioCircleComponent {
|
|
|
293
293
|
speedMultiplier = 1.2;
|
|
294
294
|
}
|
|
295
295
|
else {
|
|
296
|
-
speedMultiplier = 0
|
|
296
|
+
speedMultiplier = 1.0 + effectiveAmp * 2.0;
|
|
297
297
|
}
|
|
298
298
|
this.blobs.forEach((blob, index) => {
|
|
299
299
|
// Chaos forces
|
|
@@ -307,7 +307,7 @@ class AiAudioCircleComponent {
|
|
|
307
307
|
blob.vx *= 0.98;
|
|
308
308
|
blob.vy *= 0.98;
|
|
309
309
|
// Max velocity
|
|
310
|
-
const maxVel = (isListening ? 1.5 : 2.
|
|
310
|
+
const maxVel = (isListening ? 1.5 : 2.5) * speedMultiplier;
|
|
311
311
|
const vel = Math.sqrt(blob.vx * blob.vx + blob.vy * blob.vy);
|
|
312
312
|
if (vel > maxVel) {
|
|
313
313
|
blob.vx = (blob.vx / vel) * maxVel;
|
|
@@ -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 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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"}
|
|
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.75) * 1.8;\n this.currentAmp += (target - this.currentAmp) * 0.5;\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.9;\n const target = rhythm * spikes;\n this.currentAmp += (target - this.currentAmp) * 0.25;\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.45;\n const breathing = isListening ? Math.sin(this.pulseTime * 1.5) * 0.035 : 0;\n this.pulseScale += (this.pulseTargetScale + breathing - this.pulseScale) * 0.06;\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 = 1.0 + effectiveAmp * 2.0;\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.5) * 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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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
2
|
import { input, EventEmitter, signal, booleanAttribute, ViewChild, Output, Input, HostBinding, Optional, Inject, Component, inject, TemplateRef, effect, DestroyRef, Directive, NgModule } from '@angular/core';
|
|
3
|
+
import { hasModifierKey, SPACE, ENTER } from '@angular/cdk/keycodes';
|
|
3
4
|
import * as i5 from '@testgorilla/tgo-ui/components/core';
|
|
4
5
|
import { IS_MOBILE_TOKEN, UiTranslatePipe } from '@testgorilla/tgo-ui/components/core';
|
|
5
|
-
import { hasModifierKey, SPACE, ENTER } from '@angular/cdk/keycodes';
|
|
6
6
|
import * as i1 from '@angular/common';
|
|
7
7
|
import { CommonModule } from '@angular/common';
|
|
8
8
|
import * as i2 from '@angular/material/tabs';
|
|
@@ -69,6 +69,7 @@ class TabsComponent {
|
|
|
69
69
|
this.tabIndexMap = {};
|
|
70
70
|
// Counter for default ordering when order is not specified
|
|
71
71
|
this.insertionCounter = 0;
|
|
72
|
+
this.tabTransitionInProgress = false;
|
|
72
73
|
if (defaultAppTheme) {
|
|
73
74
|
this.applicationTheme = defaultAppTheme;
|
|
74
75
|
}
|
|
@@ -77,23 +78,30 @@ class TabsComponent {
|
|
|
77
78
|
setTimeout(() => {
|
|
78
79
|
const tabHeader = this.tabGroup._tabHeader;
|
|
79
80
|
tabHeader._handleKeydown = async (event) => {
|
|
80
|
-
if (hasModifierKey(event)) {
|
|
81
|
+
if (hasModifierKey(event) || this.tabTransitionInProgress) {
|
|
81
82
|
return;
|
|
82
83
|
}
|
|
83
84
|
switch (event.keyCode) {
|
|
84
85
|
case ENTER:
|
|
85
86
|
case SPACE:
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
87
|
+
this.tabTransitionInProgress = true;
|
|
88
|
+
try {
|
|
89
|
+
const tabLabel = event.target.innerText;
|
|
90
|
+
const currentTab = this.tabs[this.tabIndex()];
|
|
91
|
+
const nextTab = this.tabs.find(tab => tab.tabLabel === tabLabel);
|
|
92
|
+
if (!nextTab) {
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
const canLeave = (await currentTab.canLeave?.({ currentTab, nextTab })) ?? true;
|
|
96
|
+
if (currentTab.tabName !== nextTab.tabName && canLeave) {
|
|
97
|
+
const nextTabIndex = this.tabIndexMap[nextTab.tabName];
|
|
98
|
+
this.tabIndex.set(nextTabIndex);
|
|
99
|
+
this.selectedTabIndex.emit(nextTabIndex);
|
|
100
|
+
this.selectedTab.emit(nextTab);
|
|
101
|
+
}
|
|
91
102
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
const nextTabIndex = this.tabIndexMap[nextTab.tabName];
|
|
95
|
-
tabHeader.focusIndex = nextTabIndex;
|
|
96
|
-
this.tabGroup.selectedIndex = nextTabIndex;
|
|
103
|
+
finally {
|
|
104
|
+
this.tabTransitionInProgress = false;
|
|
97
105
|
}
|
|
98
106
|
break;
|
|
99
107
|
default:
|
|
@@ -101,16 +109,22 @@ class TabsComponent {
|
|
|
101
109
|
}
|
|
102
110
|
};
|
|
103
111
|
this.tabGroup._handleClick = async (tab, tabHeader, index) => {
|
|
104
|
-
|
|
105
|
-
if (tab.disabled || currentIndex === undefined || index === currentIndex) {
|
|
112
|
+
if (tab.disabled || index === this.tabIndex() || this.tabTransitionInProgress) {
|
|
106
113
|
return;
|
|
107
114
|
}
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
this.
|
|
115
|
+
this.tabTransitionInProgress = true;
|
|
116
|
+
try {
|
|
117
|
+
const currentTab = this.tabs[this.tabIndex()];
|
|
118
|
+
const nextTab = this.tabs[index];
|
|
119
|
+
const canLeave = (await currentTab.canLeave?.({ currentTab, nextTab })) ?? true;
|
|
120
|
+
if (this.tabIndex() !== index && canLeave) {
|
|
121
|
+
this.tabIndex.set(index);
|
|
122
|
+
this.selectedTabIndex.emit(index);
|
|
123
|
+
this.selectedTab.emit(nextTab);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
finally {
|
|
127
|
+
this.tabTransitionInProgress = false;
|
|
114
128
|
}
|
|
115
129
|
};
|
|
116
130
|
});
|
|
@@ -140,10 +154,14 @@ class TabsComponent {
|
|
|
140
154
|
this.tabIndexMap[tab.tabName] = index;
|
|
141
155
|
});
|
|
142
156
|
}
|
|
143
|
-
onTabChange(
|
|
144
|
-
const selectedTab = this.tabs[
|
|
145
|
-
this.
|
|
146
|
-
this.
|
|
157
|
+
onTabChange(index) {
|
|
158
|
+
const selectedTab = this.tabs[index];
|
|
159
|
+
const newIndex = this.tabIndexMap[selectedTab.tabName];
|
|
160
|
+
if (this.tabIndex() === newIndex) {
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
this.tabIndex.set(newIndex);
|
|
164
|
+
this.selectedTabIndex.emit(index);
|
|
147
165
|
this.selectedTab.emit(selectedTab);
|
|
148
166
|
}
|
|
149
167
|
selectTab(tabName) {
|
|
@@ -180,11 +198,11 @@ class TabsComponent {
|
|
|
180
198
|
}
|
|
181
199
|
}
|
|
182
200
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: TabsComponent, deps: [{ token: 'CANOPYUI_DEFAULT_APPLICATION_THEME', optional: true }, { token: IS_MOBILE_TOKEN }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
183
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.18", type: TabsComponent, isStandalone: false, selector: "ui-tabs", inputs: { companyColor: { classPropertyName: "companyColor", publicName: "companyColor", isSignal: false, isRequired: false, transformFunction: null }, type: { classPropertyName: "type", publicName: "type", isSignal: false, isRequired: false, transformFunction: null }, animationDuration: { classPropertyName: "animationDuration", publicName: "animationDuration", isSignal: false, isRequired: false, transformFunction: null }, headerContentPadding: { classPropertyName: "headerContentPadding", publicName: "headerContentPadding", isSignal: false, isRequired: false, transformFunction: (value) => value + 'px' }, dynamicHeight: { classPropertyName: "dynamicHeight", publicName: "dynamicHeight", isSignal: false, isRequired: false, transformFunction: booleanAttribute }, applicationTheme: { classPropertyName: "applicationTheme", publicName: "applicationTheme", isSignal: false, isRequired: false, transformFunction: null }, isLoading: { classPropertyName: "isLoading", publicName: "isLoading", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selectedTabIndex: "selectedTabIndex", selectedTab: "selectedTab" }, host: { properties: { "style.--color": "this.companyColor", "style.--header-content-padding": "this.headerContentPadding" } }, viewQueries: [{ propertyName: "tabGroup", first: true, predicate: ["tabGroup"], descendants: true, static: true }], ngImport: i0, template: "<mat-tab-group\n #tabGroup\n headerPosition=\"above\"\n class=\"tabs-container\"\n [ngClass]=\"'tabs-type-' + ((isMobile$ | async) ? 'underlined' : type)\"\n [class.tabs-container-loading]=\"isLoading()\"\n [attr.theme]=\"applicationTheme\"\n [dynamicHeight]=\"dynamicHeight\"\n [selectedIndex]=\"tabIndex()\"\n [animationDuration]=\"animationDuration\"\n (selectedTabChange)=\"onTabChange($event)\"\n role=\"tablist\"\n>\n <mat-tab\n *ngFor=\"let tab of tabs; trackBy: trackByTabName; let i = index\"\n [disabled]=\"tab.disabled ?? false\"\n [attr.aria-label]=\"tab?.ariaLabel\"\n >\n <ng-template mat-tab-label>\n <a\n data-test-role=\"tab-link\"\n [attr.data-testid]=\"tab.tabName\"\n class=\"tab-name\"\n [href]=\"tab?.linkUrl ? tab.linkUrl : '#'\"\n (click)=\"$event.preventDefault()\"\n [attr.aria-selected]=\"i === tabIndex()\"\n [attr.aria-label]=\"tab.tabLabel + (i === tabIndex() ? ', ' + ('TABS.SELECTED' | uiTranslate | async) : '')\"\n role=\"tab\"\n >\n @if (isLoading()) {\n <ui-skeleton [count]=\"1\"\n [theme]=\"tab.skeletonTheme ?? {}\"\n [isAiTheme]=\"!!tab.isSkeletonAiTheme\"\n ></ui-skeleton>\n } @else {\n <ui-icon\n color=\"rebrand-black\"\n [size]=\"'24'\"\n [tabindex]=\"1\"\n class=\"left-icon\"\n [name]=\"tab.iconLeft!\"\n *ngIf=\"tab?.iconLeft\"\n ></ui-icon>\n <span class=\"label\">{{ tab.tabLabel }}</span>\n <ui-icon\n color=\"rebrand-black\"\n [size]=\"'24'\"\n class=\"right-icon\"\n [name]=\"tab.iconRight!\"\n *ngIf=\"tab?.iconRight\"\n ></ui-icon>\n }\n </a>\n </ng-template>\n <div role=\"tabpanel\" [attr.id]=\"'tabpanel-' + i\" [attr.aria-labelledby]=\"'tab-' + i\">\n <ng-container *ngTemplateOutlet=\"tab.contentTemplateRef\"></ng-container>\n </div>\n </mat-tab>\n</mat-tab-group>\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 ::ng-deep .mat-mdc-tab-group,:host .mat-mdc-tab-nav-bar{--mdc-tab-indicator-active-indicator-color: var(--color);--mat-tab-header-active-label-text-color: var(--color);--mat-tab-header-active-ripple-color: transparent;--mat-tab-header-inactive-ripple-color: var(--color);--mat-tab-header-active-focus-label-text-color: var(--color);--mat-tab-header-active-focus-indicator-color: var(--color)}:host ::ng-deep .tabs-type-filled mat-tab-header{border-bottom:unset!important;border-right:1px solid #D3D3D3}:host ::ng-deep mat-tab-group{width:100%;height:100%}:host ::ng-deep mat-tab-group .mat-mdc-tab-label-container{padding:4px}:host ::ng-deep mat-tab-group .mdc-tab.cdk-keyboard-focused{position:relative}:host ::ng-deep mat-tab-group .mdc-tab.cdk-keyboard-focused:after{content:\"\";position:absolute;inset:-2px;z-index:10;border-radius:4px;outline:2px solid #242424;animation:focus-ring-animation-main .4s forwards}::ng-deep .tabs-container .mdc-tab-indicator__content{border-color:#276678!important}::ng-deep .tabs-container .tab-name{text-decoration:none!important;display:flex;justify-content:center;align-content:center;color:#242424;outline:unset;font-size:16px;line-height:24px;width:100%}::ng-deep .tabs-container .tab-name .left-icon{margin-right:8px}::ng-deep .tabs-container .tab-name .right-icon{margin-left:8px}::ng-deep .tabs-container .tab-name .left-icon:focus,::ng-deep .tabs-container .tab-name .right-icon:focus{height:24px;outline:1px dashed #888888}::ng-deep .tabs-container ::ng-deep .mdc-tab{min-width:0;padding:0}::ng-deep .tabs-container ::ng-deep .mdc-tab:hover{background:#f6f6f6}::ng-deep .tabs-container.tabs-type-underlined .tab-name{padding:16px 24px}::ng-deep .tabs-container.tabs-type-underlined .mdc-tab--active .tab-name .label{text-shadow:-.5px 0 #242424,.5px 0 #242424}::ng-deep .tabs-container.tabs-type-underlined ::ng-deep .mat-mdc-tab-header{padding:0 var(--header-content-padding)}::ng-deep .tabs-container.tabs-type-underlined ::ng-deep .mat-mdc-tab-header-pagination-chevron{border-color:#242424}::ng-deep .tabs-container.tabs-type-underlined ::ng-deep .mdc-tab{height:64px!important;flex-grow:0!important;margin-left:1px}::ng-deep .tabs-container.tabs-type-filled{--mat-tab-header-active-ripple-color: var(--color);display:flex;flex-direction:row}::ng-deep .tabs-container.tabs-type-filled .mdc-tab--active{background-color:#e9f0f1!important}::ng-deep .tabs-container.tabs-type-filled .mdc-tab--active .tab-name .label{text-shadow:-.5px 0 black,.5px 0 black}::ng-deep .tabs-container.tabs-type-filled ::ng-deep .mat-mdc-tab-header{padding:var(--header-content-padding) 0}::ng-deep .tabs-container.tabs-type-filled ::ng-deep .mat-mdc-tab-label-container{overflow:auto!important}::ng-deep .tabs-container.tabs-type-filled ::ng-deep .mat-mdc-tab-labels{flex-direction:column;padding-top:2px}::ng-deep .tabs-container.tabs-type-filled ::ng-deep .mdc-tab{flex-grow:0!important}::ng-deep .tabs-container.tabs-type-filled ::ng-deep .mdc-tab__content,::ng-deep .tabs-container.tabs-type-filled ::ng-deep .mdc-tab__text-label{width:100%}::ng-deep .tabs-container.tabs-type-filled ::ng-deep .mdc-tab__text-label{margin:-1px 1px 1px}::ng-deep .tabs-container.tabs-type-filled ::ng-deep .mdc-tab--active ::ng-deep .mdc-tab-indicator:after{content:\"\";position:absolute;left:0;top:8px;width:4px;height:32px;border-radius:0 8px 8px 0;background:#276678}::ng-deep .tabs-container.tabs-type-filled ::ng-deep .mdc-tab-indicator__content{display:none}::ng-deep .tabs-container.tabs-type-filled .tab-name{padding:12px var(--header-content-padding)}::ng-deep .tabs-container.tabs-type-filled ::ng-deep .mdc-tab{position:relative;height:48px!important;min-height:48px!important}::ng-deep .tabs-container ::ng-deep .mat-mdc-tab-body-wrapper{width:100%}::ng-deep .tabs-container ::ng-deep .mat-mdc-tab-body{padding:var(--header-content-padding)}@media (max-width: 600px){::ng-deep .tabs-container ::ng-deep .mat-mdc-tab-body{padding:24px}::ng-deep .tabs-container ::ng-deep .mat-mdc-tab-header{position:relative;padding:0!important}::ng-deep .tabs-container ::ng-deep .mat-mdc-tab-header .mat-mdc-tab-header-pagination-disabled{visibility:hidden!important}::ng-deep .tabs-container ::ng-deep .mat-mdc-tab-header:after{content:\"\";position:absolute;bottom:0;left:0;width:100%;height:1px;background:#d3d3d3}::ng-deep .tabs-container.tabs-type-filled ::ng-deep .mat-mdc-tab-header{padding:24px 0}}::ng-deep .mat-mdc-tab-group:not(.tabs-type-filled)[theme=light],::ng-deep .mat-mdc-tab-group:not(.tabs-type-filled)[theme=dark]{--mat-tab-header-inactive-ripple-color: none !important}::ng-deep .mat-mdc-tab-group:not(.tabs-type-filled)[theme=light] .mdc-tab-indicator .mdc-tab-indicator__content.mdc-tab-indicator__content--underline,::ng-deep .mat-mdc-tab-group:not(.tabs-type-filled)[theme=dark] .mdc-tab-indicator .mdc-tab-indicator__content.mdc-tab-indicator__content--underline{border-color:#d410aa!important}::ng-deep .mat-mdc-tab-group:not(.tabs-type-filled)[theme=light] .mdc-tab:hover,::ng-deep .mat-mdc-tab-group:not(.tabs-type-filled)[theme=dark] .mdc-tab:hover{background:none!important;border-bottom:2px solid #242424}::ng-deep .mat-mdc-tab-group:not(.tabs-type-filled)[theme=light] .mdc-tab:hover .mdc-tab-indicator,::ng-deep .mat-mdc-tab-group:not(.tabs-type-filled)[theme=dark] .mdc-tab:hover .mdc-tab-indicator{display:none}::ng-deep .tabs-container-loading .mat-mdc-tab.mat-mdc-tab-disabled{opacity:1}::ng-deep .tabs-container-loading .mat-mdc-tab.mat-mdc-tab-disabled.mdc-tab-indicator--active .mdc-tab-indicator__content{opacity:.4}::ng-deep .mat-mdc-tab-group.tabs-type-filled{--mat-tab-header-active-ripple-color: unset !important}::ng-deep .mat-mdc-tab-group.tabs-type-filled .tab-name{color:#242424}::ng-deep .mat-mdc-tab-group.tabs-type-filled[theme=light],::ng-deep .mat-mdc-tab-group.tabs-type-filled[theme=dark]{--mat-tab-header-inactive-ripple-color: none !important}::ng-deep .mat-mdc-tab-group.tabs-type-filled[theme=light] .mdc-tab-indicator .mdc-tab-indicator__content.mdc-tab-indicator__content--underline,::ng-deep .mat-mdc-tab-group.tabs-type-filled[theme=dark] .mdc-tab-indicator .mdc-tab-indicator__content.mdc-tab-indicator__content--underline{border-color:#d410aa!important}::ng-deep .mat-mdc-tab-group.tabs-type-filled[theme=light] .mdc-tab--active,::ng-deep .mat-mdc-tab-group.tabs-type-filled[theme=dark] .mdc-tab--active{background-color:#f4f4f4!important}::ng-deep .mat-mdc-tab-group.tabs-type-filled[theme=light] .mdc-tab--active .mdc-tab-indicator:after,::ng-deep .mat-mdc-tab-group.tabs-type-filled[theme=dark] .mdc-tab--active .mdc-tab-indicator:after{background-color:#d410aa!important}::ng-deep .mat-mdc-tab-group.tabs-type-filled[theme=light] .mdc-tab:hover,::ng-deep .mat-mdc-tab-group.tabs-type-filled[theme=dark] .mdc-tab:hover{background:#fff2fc!important}\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: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.MatTabLabel, selector: "[mat-tab-label], [matTabLabel]" }, { kind: "component", type: i2.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass", "id"], exportAs: ["matTab"] }, { kind: "component", type: i2.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "fitInkBarToContent", "mat-stretch-tabs", "mat-align-tabs", "dynamicHeight", "selectedIndex", "headerPosition", "animationDuration", "contentTabIndex", "disablePagination", "disableRipple", "preserveContent", "backgroundColor", "aria-label", "aria-labelledby"], outputs: ["selectedIndexChange", "focusChange", "animationDone", "selectedTabChange"], exportAs: ["matTabGroup"] }, { kind: "component", type: i3.IconComponent, selector: "ui-icon", inputs: ["size", "cssClass", "name", "color", "filled", "toggleIconStyle", "applicationTheme", "useFullIconName"] }, { kind: "component", type: i4.SkeletonComponent, selector: "ui-skeleton", inputs: ["count", "theme", "appearance", "isAiTheme", "applicationTheme"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.UiTranslatePipe, name: "uiTranslate" }] }); }
|
|
201
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.18", type: TabsComponent, isStandalone: false, selector: "ui-tabs", inputs: { companyColor: { classPropertyName: "companyColor", publicName: "companyColor", isSignal: false, isRequired: false, transformFunction: null }, type: { classPropertyName: "type", publicName: "type", isSignal: false, isRequired: false, transformFunction: null }, animationDuration: { classPropertyName: "animationDuration", publicName: "animationDuration", isSignal: false, isRequired: false, transformFunction: null }, headerContentPadding: { classPropertyName: "headerContentPadding", publicName: "headerContentPadding", isSignal: false, isRequired: false, transformFunction: (value) => value + 'px' }, dynamicHeight: { classPropertyName: "dynamicHeight", publicName: "dynamicHeight", isSignal: false, isRequired: false, transformFunction: booleanAttribute }, applicationTheme: { classPropertyName: "applicationTheme", publicName: "applicationTheme", isSignal: false, isRequired: false, transformFunction: null }, isLoading: { classPropertyName: "isLoading", publicName: "isLoading", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selectedTabIndex: "selectedTabIndex", selectedTab: "selectedTab" }, host: { properties: { "style.--color": "this.companyColor", "style.--header-content-padding": "this.headerContentPadding" } }, viewQueries: [{ propertyName: "tabGroup", first: true, predicate: ["tabGroup"], descendants: true, static: true }], ngImport: i0, template: "<mat-tab-group\n #tabGroup\n headerPosition=\"above\"\n class=\"tabs-container\"\n [ngClass]=\"'tabs-type-' + ((isMobile$ | async) ? 'underlined' : type)\"\n [class.tabs-container-loading]=\"isLoading()\"\n [attr.theme]=\"applicationTheme\"\n [dynamicHeight]=\"dynamicHeight\"\n [selectedIndex]=\"tabIndex()\"\n [animationDuration]=\"animationDuration\"\n (selectedIndexChange)=\"onTabChange($event)\"\n role=\"tablist\"\n>\n <mat-tab\n *ngFor=\"let tab of tabs; trackBy: trackByTabName; let i = index\"\n [disabled]=\"tab.disabled ?? false\"\n [attr.aria-label]=\"tab?.ariaLabel\"\n >\n <ng-template mat-tab-label>\n <a\n data-test-role=\"tab-link\"\n [attr.data-testid]=\"tab.tabName\"\n class=\"tab-name\"\n [href]=\"tab?.linkUrl ? tab.linkUrl : '#'\"\n (click)=\"$event.preventDefault()\"\n [attr.aria-selected]=\"i === tabIndex()\"\n [attr.aria-label]=\"tab.tabLabel + (i === tabIndex() ? ', ' + ('TABS.SELECTED' | uiTranslate | async) : '')\"\n role=\"tab\"\n >\n @if (isLoading()) {\n <ui-skeleton [count]=\"1\"\n [theme]=\"tab.skeletonTheme ?? {}\"\n [isAiTheme]=\"!!tab.isSkeletonAiTheme\"\n ></ui-skeleton>\n } @else {\n <ui-icon\n color=\"rebrand-black\"\n [size]=\"'24'\"\n [tabindex]=\"1\"\n class=\"left-icon\"\n [name]=\"tab.iconLeft!\"\n *ngIf=\"tab?.iconLeft\"\n ></ui-icon>\n <span class=\"label\">{{ tab.tabLabel }}</span>\n <ui-icon\n color=\"rebrand-black\"\n [size]=\"'24'\"\n class=\"right-icon\"\n [name]=\"tab.iconRight!\"\n *ngIf=\"tab?.iconRight\"\n ></ui-icon>\n }\n </a>\n </ng-template>\n <div role=\"tabpanel\" [attr.id]=\"'tabpanel-' + i\" [attr.aria-labelledby]=\"'tab-' + i\">\n <ng-container *ngTemplateOutlet=\"tab.contentTemplateRef\"></ng-container>\n </div>\n </mat-tab>\n</mat-tab-group>\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 ::ng-deep .mat-mdc-tab-group,:host .mat-mdc-tab-nav-bar{--mdc-tab-indicator-active-indicator-color: var(--color);--mat-tab-header-active-label-text-color: var(--color);--mat-tab-header-active-ripple-color: transparent;--mat-tab-header-inactive-ripple-color: var(--color);--mat-tab-header-active-focus-label-text-color: var(--color);--mat-tab-header-active-focus-indicator-color: var(--color)}:host ::ng-deep .tabs-type-filled mat-tab-header{border-bottom:unset!important;border-right:1px solid #D3D3D3}:host ::ng-deep mat-tab-group{width:100%;height:100%}:host ::ng-deep mat-tab-group .mat-mdc-tab-label-container{padding:4px}:host ::ng-deep mat-tab-group .mdc-tab.cdk-keyboard-focused{position:relative}:host ::ng-deep mat-tab-group .mdc-tab.cdk-keyboard-focused:after{content:\"\";position:absolute;inset:-2px;z-index:10;border-radius:4px;outline:2px solid #242424;animation:focus-ring-animation-main .4s forwards}::ng-deep .tabs-container .mdc-tab-indicator__content{border-color:#276678!important}::ng-deep .tabs-container .tab-name{text-decoration:none!important;display:flex;justify-content:center;align-content:center;color:#242424;outline:unset;font-size:16px;line-height:24px;width:100%}::ng-deep .tabs-container .tab-name .left-icon{margin-right:8px}::ng-deep .tabs-container .tab-name .right-icon{margin-left:8px}::ng-deep .tabs-container .tab-name .left-icon:focus,::ng-deep .tabs-container .tab-name .right-icon:focus{height:24px;outline:1px dashed #888888}::ng-deep .tabs-container ::ng-deep .mdc-tab{min-width:0;padding:0}::ng-deep .tabs-container ::ng-deep .mdc-tab:hover{background:#f6f6f6}::ng-deep .tabs-container.tabs-type-underlined .tab-name{padding:16px 24px}::ng-deep .tabs-container.tabs-type-underlined .mdc-tab--active .tab-name .label{text-shadow:-.5px 0 #242424,.5px 0 #242424}::ng-deep .tabs-container.tabs-type-underlined ::ng-deep .mat-mdc-tab-header{padding:0 var(--header-content-padding)}::ng-deep .tabs-container.tabs-type-underlined ::ng-deep .mat-mdc-tab-header-pagination-chevron{border-color:#242424}::ng-deep .tabs-container.tabs-type-underlined ::ng-deep .mdc-tab{height:64px!important;flex-grow:0!important;margin-left:1px}::ng-deep .tabs-container.tabs-type-filled{--mat-tab-header-active-ripple-color: var(--color);display:flex;flex-direction:row}::ng-deep .tabs-container.tabs-type-filled .mdc-tab--active{background-color:#e9f0f1!important}::ng-deep .tabs-container.tabs-type-filled .mdc-tab--active .tab-name .label{text-shadow:-.5px 0 black,.5px 0 black}::ng-deep .tabs-container.tabs-type-filled ::ng-deep .mat-mdc-tab-header{padding:var(--header-content-padding) 0}::ng-deep .tabs-container.tabs-type-filled ::ng-deep .mat-mdc-tab-label-container{overflow:auto!important}::ng-deep .tabs-container.tabs-type-filled ::ng-deep .mat-mdc-tab-labels{flex-direction:column;padding-top:2px}::ng-deep .tabs-container.tabs-type-filled ::ng-deep .mdc-tab{flex-grow:0!important}::ng-deep .tabs-container.tabs-type-filled ::ng-deep .mdc-tab__content,::ng-deep .tabs-container.tabs-type-filled ::ng-deep .mdc-tab__text-label{width:100%}::ng-deep .tabs-container.tabs-type-filled ::ng-deep .mdc-tab__text-label{margin:-1px 1px 1px}::ng-deep .tabs-container.tabs-type-filled ::ng-deep .mdc-tab--active ::ng-deep .mdc-tab-indicator:after{content:\"\";position:absolute;left:0;top:8px;width:4px;height:32px;border-radius:0 8px 8px 0;background:#276678}::ng-deep .tabs-container.tabs-type-filled ::ng-deep .mdc-tab-indicator__content{display:none}::ng-deep .tabs-container.tabs-type-filled .tab-name{padding:12px var(--header-content-padding)}::ng-deep .tabs-container.tabs-type-filled ::ng-deep .mdc-tab{position:relative;height:48px!important;min-height:48px!important}::ng-deep .tabs-container ::ng-deep .mat-mdc-tab-body-wrapper{width:100%}::ng-deep .tabs-container ::ng-deep .mat-mdc-tab-body{padding:var(--header-content-padding)}@media (max-width: 600px){::ng-deep .tabs-container ::ng-deep .mat-mdc-tab-body{padding:24px}::ng-deep .tabs-container ::ng-deep .mat-mdc-tab-header{position:relative;padding:0!important}::ng-deep .tabs-container ::ng-deep .mat-mdc-tab-header .mat-mdc-tab-header-pagination-disabled{visibility:hidden!important}::ng-deep .tabs-container ::ng-deep .mat-mdc-tab-header:after{content:\"\";position:absolute;bottom:0;left:0;width:100%;height:1px;background:#d3d3d3}::ng-deep .tabs-container.tabs-type-filled ::ng-deep .mat-mdc-tab-header{padding:24px 0}}::ng-deep .mat-mdc-tab-group:not(.tabs-type-filled)[theme=light],::ng-deep .mat-mdc-tab-group:not(.tabs-type-filled)[theme=dark]{--mat-tab-header-inactive-ripple-color: none !important}::ng-deep .mat-mdc-tab-group:not(.tabs-type-filled)[theme=light] .mdc-tab-indicator .mdc-tab-indicator__content.mdc-tab-indicator__content--underline,::ng-deep .mat-mdc-tab-group:not(.tabs-type-filled)[theme=dark] .mdc-tab-indicator .mdc-tab-indicator__content.mdc-tab-indicator__content--underline{border-color:#d410aa!important}::ng-deep .mat-mdc-tab-group:not(.tabs-type-filled)[theme=light] .mdc-tab:hover,::ng-deep .mat-mdc-tab-group:not(.tabs-type-filled)[theme=dark] .mdc-tab:hover{background:none!important;border-bottom:2px solid #242424}::ng-deep .mat-mdc-tab-group:not(.tabs-type-filled)[theme=light] .mdc-tab:hover .mdc-tab-indicator,::ng-deep .mat-mdc-tab-group:not(.tabs-type-filled)[theme=dark] .mdc-tab:hover .mdc-tab-indicator{display:none}::ng-deep .tabs-container-loading .mat-mdc-tab.mat-mdc-tab-disabled{opacity:1}::ng-deep .tabs-container-loading .mat-mdc-tab.mat-mdc-tab-disabled.mdc-tab-indicator--active .mdc-tab-indicator__content{opacity:.4}::ng-deep .mat-mdc-tab-group.tabs-type-filled{--mat-tab-header-active-ripple-color: unset !important}::ng-deep .mat-mdc-tab-group.tabs-type-filled .tab-name{color:#242424}::ng-deep .mat-mdc-tab-group.tabs-type-filled[theme=light],::ng-deep .mat-mdc-tab-group.tabs-type-filled[theme=dark]{--mat-tab-header-inactive-ripple-color: none !important}::ng-deep .mat-mdc-tab-group.tabs-type-filled[theme=light] .mdc-tab-indicator .mdc-tab-indicator__content.mdc-tab-indicator__content--underline,::ng-deep .mat-mdc-tab-group.tabs-type-filled[theme=dark] .mdc-tab-indicator .mdc-tab-indicator__content.mdc-tab-indicator__content--underline{border-color:#d410aa!important}::ng-deep .mat-mdc-tab-group.tabs-type-filled[theme=light] .mdc-tab--active,::ng-deep .mat-mdc-tab-group.tabs-type-filled[theme=dark] .mdc-tab--active{background-color:#f4f4f4!important}::ng-deep .mat-mdc-tab-group.tabs-type-filled[theme=light] .mdc-tab--active .mdc-tab-indicator:after,::ng-deep .mat-mdc-tab-group.tabs-type-filled[theme=dark] .mdc-tab--active .mdc-tab-indicator:after{background-color:#d410aa!important}::ng-deep .mat-mdc-tab-group.tabs-type-filled[theme=light] .mdc-tab:hover,::ng-deep .mat-mdc-tab-group.tabs-type-filled[theme=dark] .mdc-tab:hover{background:#fff2fc!important}\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: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.MatTabLabel, selector: "[mat-tab-label], [matTabLabel]" }, { kind: "component", type: i2.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass", "id"], exportAs: ["matTab"] }, { kind: "component", type: i2.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "fitInkBarToContent", "mat-stretch-tabs", "mat-align-tabs", "dynamicHeight", "selectedIndex", "headerPosition", "animationDuration", "contentTabIndex", "disablePagination", "disableRipple", "preserveContent", "backgroundColor", "aria-label", "aria-labelledby"], outputs: ["selectedIndexChange", "focusChange", "animationDone", "selectedTabChange"], exportAs: ["matTabGroup"] }, { kind: "component", type: i3.IconComponent, selector: "ui-icon", inputs: ["size", "cssClass", "name", "color", "filled", "toggleIconStyle", "applicationTheme", "useFullIconName"] }, { kind: "component", type: i4.SkeletonComponent, selector: "ui-skeleton", inputs: ["count", "theme", "appearance", "isAiTheme", "applicationTheme"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.UiTranslatePipe, name: "uiTranslate" }] }); }
|
|
184
202
|
}
|
|
185
203
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: TabsComponent, decorators: [{
|
|
186
204
|
type: Component,
|
|
187
|
-
args: [{ selector: 'ui-tabs', standalone: false, template: "<mat-tab-group\n #tabGroup\n headerPosition=\"above\"\n class=\"tabs-container\"\n [ngClass]=\"'tabs-type-' + ((isMobile$ | async) ? 'underlined' : type)\"\n [class.tabs-container-loading]=\"isLoading()\"\n [attr.theme]=\"applicationTheme\"\n [dynamicHeight]=\"dynamicHeight\"\n [selectedIndex]=\"tabIndex()\"\n [animationDuration]=\"animationDuration\"\n (selectedTabChange)=\"onTabChange($event)\"\n role=\"tablist\"\n>\n <mat-tab\n *ngFor=\"let tab of tabs; trackBy: trackByTabName; let i = index\"\n [disabled]=\"tab.disabled ?? false\"\n [attr.aria-label]=\"tab?.ariaLabel\"\n >\n <ng-template mat-tab-label>\n <a\n data-test-role=\"tab-link\"\n [attr.data-testid]=\"tab.tabName\"\n class=\"tab-name\"\n [href]=\"tab?.linkUrl ? tab.linkUrl : '#'\"\n (click)=\"$event.preventDefault()\"\n [attr.aria-selected]=\"i === tabIndex()\"\n [attr.aria-label]=\"tab.tabLabel + (i === tabIndex() ? ', ' + ('TABS.SELECTED' | uiTranslate | async) : '')\"\n role=\"tab\"\n >\n @if (isLoading()) {\n <ui-skeleton [count]=\"1\"\n [theme]=\"tab.skeletonTheme ?? {}\"\n [isAiTheme]=\"!!tab.isSkeletonAiTheme\"\n ></ui-skeleton>\n } @else {\n <ui-icon\n color=\"rebrand-black\"\n [size]=\"'24'\"\n [tabindex]=\"1\"\n class=\"left-icon\"\n [name]=\"tab.iconLeft!\"\n *ngIf=\"tab?.iconLeft\"\n ></ui-icon>\n <span class=\"label\">{{ tab.tabLabel }}</span>\n <ui-icon\n color=\"rebrand-black\"\n [size]=\"'24'\"\n class=\"right-icon\"\n [name]=\"tab.iconRight!\"\n *ngIf=\"tab?.iconRight\"\n ></ui-icon>\n }\n </a>\n </ng-template>\n <div role=\"tabpanel\" [attr.id]=\"'tabpanel-' + i\" [attr.aria-labelledby]=\"'tab-' + i\">\n <ng-container *ngTemplateOutlet=\"tab.contentTemplateRef\"></ng-container>\n </div>\n </mat-tab>\n</mat-tab-group>\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 ::ng-deep .mat-mdc-tab-group,:host .mat-mdc-tab-nav-bar{--mdc-tab-indicator-active-indicator-color: var(--color);--mat-tab-header-active-label-text-color: var(--color);--mat-tab-header-active-ripple-color: transparent;--mat-tab-header-inactive-ripple-color: var(--color);--mat-tab-header-active-focus-label-text-color: var(--color);--mat-tab-header-active-focus-indicator-color: var(--color)}:host ::ng-deep .tabs-type-filled mat-tab-header{border-bottom:unset!important;border-right:1px solid #D3D3D3}:host ::ng-deep mat-tab-group{width:100%;height:100%}:host ::ng-deep mat-tab-group .mat-mdc-tab-label-container{padding:4px}:host ::ng-deep mat-tab-group .mdc-tab.cdk-keyboard-focused{position:relative}:host ::ng-deep mat-tab-group .mdc-tab.cdk-keyboard-focused:after{content:\"\";position:absolute;inset:-2px;z-index:10;border-radius:4px;outline:2px solid #242424;animation:focus-ring-animation-main .4s forwards}::ng-deep .tabs-container .mdc-tab-indicator__content{border-color:#276678!important}::ng-deep .tabs-container .tab-name{text-decoration:none!important;display:flex;justify-content:center;align-content:center;color:#242424;outline:unset;font-size:16px;line-height:24px;width:100%}::ng-deep .tabs-container .tab-name .left-icon{margin-right:8px}::ng-deep .tabs-container .tab-name .right-icon{margin-left:8px}::ng-deep .tabs-container .tab-name .left-icon:focus,::ng-deep .tabs-container .tab-name .right-icon:focus{height:24px;outline:1px dashed #888888}::ng-deep .tabs-container ::ng-deep .mdc-tab{min-width:0;padding:0}::ng-deep .tabs-container ::ng-deep .mdc-tab:hover{background:#f6f6f6}::ng-deep .tabs-container.tabs-type-underlined .tab-name{padding:16px 24px}::ng-deep .tabs-container.tabs-type-underlined .mdc-tab--active .tab-name .label{text-shadow:-.5px 0 #242424,.5px 0 #242424}::ng-deep .tabs-container.tabs-type-underlined ::ng-deep .mat-mdc-tab-header{padding:0 var(--header-content-padding)}::ng-deep .tabs-container.tabs-type-underlined ::ng-deep .mat-mdc-tab-header-pagination-chevron{border-color:#242424}::ng-deep .tabs-container.tabs-type-underlined ::ng-deep .mdc-tab{height:64px!important;flex-grow:0!important;margin-left:1px}::ng-deep .tabs-container.tabs-type-filled{--mat-tab-header-active-ripple-color: var(--color);display:flex;flex-direction:row}::ng-deep .tabs-container.tabs-type-filled .mdc-tab--active{background-color:#e9f0f1!important}::ng-deep .tabs-container.tabs-type-filled .mdc-tab--active .tab-name .label{text-shadow:-.5px 0 black,.5px 0 black}::ng-deep .tabs-container.tabs-type-filled ::ng-deep .mat-mdc-tab-header{padding:var(--header-content-padding) 0}::ng-deep .tabs-container.tabs-type-filled ::ng-deep .mat-mdc-tab-label-container{overflow:auto!important}::ng-deep .tabs-container.tabs-type-filled ::ng-deep .mat-mdc-tab-labels{flex-direction:column;padding-top:2px}::ng-deep .tabs-container.tabs-type-filled ::ng-deep .mdc-tab{flex-grow:0!important}::ng-deep .tabs-container.tabs-type-filled ::ng-deep .mdc-tab__content,::ng-deep .tabs-container.tabs-type-filled ::ng-deep .mdc-tab__text-label{width:100%}::ng-deep .tabs-container.tabs-type-filled ::ng-deep .mdc-tab__text-label{margin:-1px 1px 1px}::ng-deep .tabs-container.tabs-type-filled ::ng-deep .mdc-tab--active ::ng-deep .mdc-tab-indicator:after{content:\"\";position:absolute;left:0;top:8px;width:4px;height:32px;border-radius:0 8px 8px 0;background:#276678}::ng-deep .tabs-container.tabs-type-filled ::ng-deep .mdc-tab-indicator__content{display:none}::ng-deep .tabs-container.tabs-type-filled .tab-name{padding:12px var(--header-content-padding)}::ng-deep .tabs-container.tabs-type-filled ::ng-deep .mdc-tab{position:relative;height:48px!important;min-height:48px!important}::ng-deep .tabs-container ::ng-deep .mat-mdc-tab-body-wrapper{width:100%}::ng-deep .tabs-container ::ng-deep .mat-mdc-tab-body{padding:var(--header-content-padding)}@media (max-width: 600px){::ng-deep .tabs-container ::ng-deep .mat-mdc-tab-body{padding:24px}::ng-deep .tabs-container ::ng-deep .mat-mdc-tab-header{position:relative;padding:0!important}::ng-deep .tabs-container ::ng-deep .mat-mdc-tab-header .mat-mdc-tab-header-pagination-disabled{visibility:hidden!important}::ng-deep .tabs-container ::ng-deep .mat-mdc-tab-header:after{content:\"\";position:absolute;bottom:0;left:0;width:100%;height:1px;background:#d3d3d3}::ng-deep .tabs-container.tabs-type-filled ::ng-deep .mat-mdc-tab-header{padding:24px 0}}::ng-deep .mat-mdc-tab-group:not(.tabs-type-filled)[theme=light],::ng-deep .mat-mdc-tab-group:not(.tabs-type-filled)[theme=dark]{--mat-tab-header-inactive-ripple-color: none !important}::ng-deep .mat-mdc-tab-group:not(.tabs-type-filled)[theme=light] .mdc-tab-indicator .mdc-tab-indicator__content.mdc-tab-indicator__content--underline,::ng-deep .mat-mdc-tab-group:not(.tabs-type-filled)[theme=dark] .mdc-tab-indicator .mdc-tab-indicator__content.mdc-tab-indicator__content--underline{border-color:#d410aa!important}::ng-deep .mat-mdc-tab-group:not(.tabs-type-filled)[theme=light] .mdc-tab:hover,::ng-deep .mat-mdc-tab-group:not(.tabs-type-filled)[theme=dark] .mdc-tab:hover{background:none!important;border-bottom:2px solid #242424}::ng-deep .mat-mdc-tab-group:not(.tabs-type-filled)[theme=light] .mdc-tab:hover .mdc-tab-indicator,::ng-deep .mat-mdc-tab-group:not(.tabs-type-filled)[theme=dark] .mdc-tab:hover .mdc-tab-indicator{display:none}::ng-deep .tabs-container-loading .mat-mdc-tab.mat-mdc-tab-disabled{opacity:1}::ng-deep .tabs-container-loading .mat-mdc-tab.mat-mdc-tab-disabled.mdc-tab-indicator--active .mdc-tab-indicator__content{opacity:.4}::ng-deep .mat-mdc-tab-group.tabs-type-filled{--mat-tab-header-active-ripple-color: unset !important}::ng-deep .mat-mdc-tab-group.tabs-type-filled .tab-name{color:#242424}::ng-deep .mat-mdc-tab-group.tabs-type-filled[theme=light],::ng-deep .mat-mdc-tab-group.tabs-type-filled[theme=dark]{--mat-tab-header-inactive-ripple-color: none !important}::ng-deep .mat-mdc-tab-group.tabs-type-filled[theme=light] .mdc-tab-indicator .mdc-tab-indicator__content.mdc-tab-indicator__content--underline,::ng-deep .mat-mdc-tab-group.tabs-type-filled[theme=dark] .mdc-tab-indicator .mdc-tab-indicator__content.mdc-tab-indicator__content--underline{border-color:#d410aa!important}::ng-deep .mat-mdc-tab-group.tabs-type-filled[theme=light] .mdc-tab--active,::ng-deep .mat-mdc-tab-group.tabs-type-filled[theme=dark] .mdc-tab--active{background-color:#f4f4f4!important}::ng-deep .mat-mdc-tab-group.tabs-type-filled[theme=light] .mdc-tab--active .mdc-tab-indicator:after,::ng-deep .mat-mdc-tab-group.tabs-type-filled[theme=dark] .mdc-tab--active .mdc-tab-indicator:after{background-color:#d410aa!important}::ng-deep .mat-mdc-tab-group.tabs-type-filled[theme=light] .mdc-tab:hover,::ng-deep .mat-mdc-tab-group.tabs-type-filled[theme=dark] .mdc-tab:hover{background:#fff2fc!important}\n"] }]
|
|
205
|
+
args: [{ selector: 'ui-tabs', standalone: false, template: "<mat-tab-group\n #tabGroup\n headerPosition=\"above\"\n class=\"tabs-container\"\n [ngClass]=\"'tabs-type-' + ((isMobile$ | async) ? 'underlined' : type)\"\n [class.tabs-container-loading]=\"isLoading()\"\n [attr.theme]=\"applicationTheme\"\n [dynamicHeight]=\"dynamicHeight\"\n [selectedIndex]=\"tabIndex()\"\n [animationDuration]=\"animationDuration\"\n (selectedIndexChange)=\"onTabChange($event)\"\n role=\"tablist\"\n>\n <mat-tab\n *ngFor=\"let tab of tabs; trackBy: trackByTabName; let i = index\"\n [disabled]=\"tab.disabled ?? false\"\n [attr.aria-label]=\"tab?.ariaLabel\"\n >\n <ng-template mat-tab-label>\n <a\n data-test-role=\"tab-link\"\n [attr.data-testid]=\"tab.tabName\"\n class=\"tab-name\"\n [href]=\"tab?.linkUrl ? tab.linkUrl : '#'\"\n (click)=\"$event.preventDefault()\"\n [attr.aria-selected]=\"i === tabIndex()\"\n [attr.aria-label]=\"tab.tabLabel + (i === tabIndex() ? ', ' + ('TABS.SELECTED' | uiTranslate | async) : '')\"\n role=\"tab\"\n >\n @if (isLoading()) {\n <ui-skeleton [count]=\"1\"\n [theme]=\"tab.skeletonTheme ?? {}\"\n [isAiTheme]=\"!!tab.isSkeletonAiTheme\"\n ></ui-skeleton>\n } @else {\n <ui-icon\n color=\"rebrand-black\"\n [size]=\"'24'\"\n [tabindex]=\"1\"\n class=\"left-icon\"\n [name]=\"tab.iconLeft!\"\n *ngIf=\"tab?.iconLeft\"\n ></ui-icon>\n <span class=\"label\">{{ tab.tabLabel }}</span>\n <ui-icon\n color=\"rebrand-black\"\n [size]=\"'24'\"\n class=\"right-icon\"\n [name]=\"tab.iconRight!\"\n *ngIf=\"tab?.iconRight\"\n ></ui-icon>\n }\n </a>\n </ng-template>\n <div role=\"tabpanel\" [attr.id]=\"'tabpanel-' + i\" [attr.aria-labelledby]=\"'tab-' + i\">\n <ng-container *ngTemplateOutlet=\"tab.contentTemplateRef\"></ng-container>\n </div>\n </mat-tab>\n</mat-tab-group>\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 ::ng-deep .mat-mdc-tab-group,:host .mat-mdc-tab-nav-bar{--mdc-tab-indicator-active-indicator-color: var(--color);--mat-tab-header-active-label-text-color: var(--color);--mat-tab-header-active-ripple-color: transparent;--mat-tab-header-inactive-ripple-color: var(--color);--mat-tab-header-active-focus-label-text-color: var(--color);--mat-tab-header-active-focus-indicator-color: var(--color)}:host ::ng-deep .tabs-type-filled mat-tab-header{border-bottom:unset!important;border-right:1px solid #D3D3D3}:host ::ng-deep mat-tab-group{width:100%;height:100%}:host ::ng-deep mat-tab-group .mat-mdc-tab-label-container{padding:4px}:host ::ng-deep mat-tab-group .mdc-tab.cdk-keyboard-focused{position:relative}:host ::ng-deep mat-tab-group .mdc-tab.cdk-keyboard-focused:after{content:\"\";position:absolute;inset:-2px;z-index:10;border-radius:4px;outline:2px solid #242424;animation:focus-ring-animation-main .4s forwards}::ng-deep .tabs-container .mdc-tab-indicator__content{border-color:#276678!important}::ng-deep .tabs-container .tab-name{text-decoration:none!important;display:flex;justify-content:center;align-content:center;color:#242424;outline:unset;font-size:16px;line-height:24px;width:100%}::ng-deep .tabs-container .tab-name .left-icon{margin-right:8px}::ng-deep .tabs-container .tab-name .right-icon{margin-left:8px}::ng-deep .tabs-container .tab-name .left-icon:focus,::ng-deep .tabs-container .tab-name .right-icon:focus{height:24px;outline:1px dashed #888888}::ng-deep .tabs-container ::ng-deep .mdc-tab{min-width:0;padding:0}::ng-deep .tabs-container ::ng-deep .mdc-tab:hover{background:#f6f6f6}::ng-deep .tabs-container.tabs-type-underlined .tab-name{padding:16px 24px}::ng-deep .tabs-container.tabs-type-underlined .mdc-tab--active .tab-name .label{text-shadow:-.5px 0 #242424,.5px 0 #242424}::ng-deep .tabs-container.tabs-type-underlined ::ng-deep .mat-mdc-tab-header{padding:0 var(--header-content-padding)}::ng-deep .tabs-container.tabs-type-underlined ::ng-deep .mat-mdc-tab-header-pagination-chevron{border-color:#242424}::ng-deep .tabs-container.tabs-type-underlined ::ng-deep .mdc-tab{height:64px!important;flex-grow:0!important;margin-left:1px}::ng-deep .tabs-container.tabs-type-filled{--mat-tab-header-active-ripple-color: var(--color);display:flex;flex-direction:row}::ng-deep .tabs-container.tabs-type-filled .mdc-tab--active{background-color:#e9f0f1!important}::ng-deep .tabs-container.tabs-type-filled .mdc-tab--active .tab-name .label{text-shadow:-.5px 0 black,.5px 0 black}::ng-deep .tabs-container.tabs-type-filled ::ng-deep .mat-mdc-tab-header{padding:var(--header-content-padding) 0}::ng-deep .tabs-container.tabs-type-filled ::ng-deep .mat-mdc-tab-label-container{overflow:auto!important}::ng-deep .tabs-container.tabs-type-filled ::ng-deep .mat-mdc-tab-labels{flex-direction:column;padding-top:2px}::ng-deep .tabs-container.tabs-type-filled ::ng-deep .mdc-tab{flex-grow:0!important}::ng-deep .tabs-container.tabs-type-filled ::ng-deep .mdc-tab__content,::ng-deep .tabs-container.tabs-type-filled ::ng-deep .mdc-tab__text-label{width:100%}::ng-deep .tabs-container.tabs-type-filled ::ng-deep .mdc-tab__text-label{margin:-1px 1px 1px}::ng-deep .tabs-container.tabs-type-filled ::ng-deep .mdc-tab--active ::ng-deep .mdc-tab-indicator:after{content:\"\";position:absolute;left:0;top:8px;width:4px;height:32px;border-radius:0 8px 8px 0;background:#276678}::ng-deep .tabs-container.tabs-type-filled ::ng-deep .mdc-tab-indicator__content{display:none}::ng-deep .tabs-container.tabs-type-filled .tab-name{padding:12px var(--header-content-padding)}::ng-deep .tabs-container.tabs-type-filled ::ng-deep .mdc-tab{position:relative;height:48px!important;min-height:48px!important}::ng-deep .tabs-container ::ng-deep .mat-mdc-tab-body-wrapper{width:100%}::ng-deep .tabs-container ::ng-deep .mat-mdc-tab-body{padding:var(--header-content-padding)}@media (max-width: 600px){::ng-deep .tabs-container ::ng-deep .mat-mdc-tab-body{padding:24px}::ng-deep .tabs-container ::ng-deep .mat-mdc-tab-header{position:relative;padding:0!important}::ng-deep .tabs-container ::ng-deep .mat-mdc-tab-header .mat-mdc-tab-header-pagination-disabled{visibility:hidden!important}::ng-deep .tabs-container ::ng-deep .mat-mdc-tab-header:after{content:\"\";position:absolute;bottom:0;left:0;width:100%;height:1px;background:#d3d3d3}::ng-deep .tabs-container.tabs-type-filled ::ng-deep .mat-mdc-tab-header{padding:24px 0}}::ng-deep .mat-mdc-tab-group:not(.tabs-type-filled)[theme=light],::ng-deep .mat-mdc-tab-group:not(.tabs-type-filled)[theme=dark]{--mat-tab-header-inactive-ripple-color: none !important}::ng-deep .mat-mdc-tab-group:not(.tabs-type-filled)[theme=light] .mdc-tab-indicator .mdc-tab-indicator__content.mdc-tab-indicator__content--underline,::ng-deep .mat-mdc-tab-group:not(.tabs-type-filled)[theme=dark] .mdc-tab-indicator .mdc-tab-indicator__content.mdc-tab-indicator__content--underline{border-color:#d410aa!important}::ng-deep .mat-mdc-tab-group:not(.tabs-type-filled)[theme=light] .mdc-tab:hover,::ng-deep .mat-mdc-tab-group:not(.tabs-type-filled)[theme=dark] .mdc-tab:hover{background:none!important;border-bottom:2px solid #242424}::ng-deep .mat-mdc-tab-group:not(.tabs-type-filled)[theme=light] .mdc-tab:hover .mdc-tab-indicator,::ng-deep .mat-mdc-tab-group:not(.tabs-type-filled)[theme=dark] .mdc-tab:hover .mdc-tab-indicator{display:none}::ng-deep .tabs-container-loading .mat-mdc-tab.mat-mdc-tab-disabled{opacity:1}::ng-deep .tabs-container-loading .mat-mdc-tab.mat-mdc-tab-disabled.mdc-tab-indicator--active .mdc-tab-indicator__content{opacity:.4}::ng-deep .mat-mdc-tab-group.tabs-type-filled{--mat-tab-header-active-ripple-color: unset !important}::ng-deep .mat-mdc-tab-group.tabs-type-filled .tab-name{color:#242424}::ng-deep .mat-mdc-tab-group.tabs-type-filled[theme=light],::ng-deep .mat-mdc-tab-group.tabs-type-filled[theme=dark]{--mat-tab-header-inactive-ripple-color: none !important}::ng-deep .mat-mdc-tab-group.tabs-type-filled[theme=light] .mdc-tab-indicator .mdc-tab-indicator__content.mdc-tab-indicator__content--underline,::ng-deep .mat-mdc-tab-group.tabs-type-filled[theme=dark] .mdc-tab-indicator .mdc-tab-indicator__content.mdc-tab-indicator__content--underline{border-color:#d410aa!important}::ng-deep .mat-mdc-tab-group.tabs-type-filled[theme=light] .mdc-tab--active,::ng-deep .mat-mdc-tab-group.tabs-type-filled[theme=dark] .mdc-tab--active{background-color:#f4f4f4!important}::ng-deep .mat-mdc-tab-group.tabs-type-filled[theme=light] .mdc-tab--active .mdc-tab-indicator:after,::ng-deep .mat-mdc-tab-group.tabs-type-filled[theme=dark] .mdc-tab--active .mdc-tab-indicator:after{background-color:#d410aa!important}::ng-deep .mat-mdc-tab-group.tabs-type-filled[theme=light] .mdc-tab:hover,::ng-deep .mat-mdc-tab-group.tabs-type-filled[theme=dark] .mdc-tab:hover{background:#fff2fc!important}\n"] }]
|
|
188
206
|
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
189
207
|
type: Optional
|
|
190
208
|
}, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testgorilla-tgo-ui-components-tabs.mjs","sources":["../../../components/tabs/tabs.component.ts","../../../components/tabs/tabs.component.html","../../../components/tabs/tab.directive.ts","../../../components/tabs/tabs.component.module.ts","../../../components/tabs/testgorilla-tgo-ui-components-tabs.ts"],"sourcesContent":["import {\n booleanAttribute,\n Component,\n EventEmitter,\n HostBinding,\n Inject, input,\n Input,\n Optional,\n Output,\n signal,\n ViewChild\n} from '@angular/core';\nimport { Tab, TabsType } from './tabs.model';\nimport { ApplicationTheme, IS_MOBILE_TOKEN } from '@testgorilla/tgo-ui/components/core';\nimport { Observable } from 'rxjs';\nimport { MatTab, MatTabChangeEvent, MatTabGroup } from '@angular/material/tabs';\nimport { ENTER, hasModifierKey, SPACE } from '@angular/cdk/keycodes';\n\n@Component({\n selector: 'ui-tabs',\n templateUrl: './tabs.component.html',\n styleUrls: ['./tabs.component.scss'],\n standalone: false\n})\nexport class TabsComponent {\n /**\n * Color of the Tabs.\n * Defaults to Test Gorilla primary color.\n *\n * @type {string}\n * @memberof TabsComponent\n */\n @HostBinding('style.--color')\n @Input()\n companyColor: string | null = '#46A997';\n /**\n * Type the Tabs.\n * Defaults underlined.\n *\n * @type {TabsType}\n * @memberof TabsComponent\n */\n @Input() type: TabsType = 'underlined';\n\n /**\n * Animation duration when switching tabs\n *\n * @type {number}\n * @memberof TabsComponent\n */\n @Input() animationDuration = 300;\n\n /**\n * Sets the padding for content and header\n *\n * @type {number}\n * @memberof TabsComponent\n */\n @HostBinding('style.--header-content-padding')\n @Input({ transform: (value: number): string => value + 'px' })\n headerContentPadding = '32px';\n\n /**\n * Sets the dynamic height of the tab\n * @type {boolean}\n * @memberof TabsComponent\n */\n @Input({ transform: booleanAttribute }) dynamicHeight = true;\n\n /**\n *\n * Defines the application theme\n *\n * @type {ApplicationTheme}\n * @memberof TabsComponent\n */\n @Input() applicationTheme: ApplicationTheme = 'light';\n\n isLoading = input(false);\n\n @Output() selectedTabIndex = new EventEmitter<number>();\n @Output() selectedTab = new EventEmitter<Tab>();\n\n @ViewChild('tabGroup', { static: true }) tabGroup: MatTabGroup;\n\n protected tabs: Tab[] = [];\n readonly tabIndex = signal(0);\n protected tabIndexMap: Record<string, number> = {};\n\n // Counter for default ordering when order is not specified\n private insertionCounter: number = 0;\n\n constructor(\n @Optional() @Inject('CANOPYUI_DEFAULT_APPLICATION_THEME') private readonly defaultAppTheme: ApplicationTheme,\n @Inject(IS_MOBILE_TOKEN) protected readonly isMobile$: Observable<boolean>\n ) {\n if (defaultAppTheme) {\n this.applicationTheme = defaultAppTheme;\n }\n }\n\n ngAfterViewInit(): void {\n setTimeout(() => {\n const tabHeader = (this.tabGroup as any)._tabHeader;\n tabHeader._handleKeydown = async (event: KeyboardEvent) => {\n if (hasModifierKey(event)) {\n return;\n }\n switch (event.keyCode) {\n case ENTER:\n case SPACE:\n const tabLabel = (event.target as HTMLElement).innerText;\n const currentTab = this.tabs[this.tabIndex()];\n const nextTab = this.tabs.find(tab => tab.tabLabel === tabLabel);\n\n if (!nextTab) {\n return;\n }\n\n const canLeave = (await currentTab.canLeave?.({ currentTab, nextTab })) ?? true;\n if (currentTab.tabName !== nextTab.tabName && canLeave) {\n const nextTabIndex = this.tabIndexMap[nextTab.tabName];\n tabHeader.focusIndex = nextTabIndex;\n this.tabGroup.selectedIndex = nextTabIndex;\n }\n break;\n default:\n tabHeader._keyManager.onKeydown(event);\n }\n };\n\n (this.tabGroup as any)._handleClick = async (tab: MatTab, tabHeader: any, index: number) => {\n const currentIndex = this.tabGroup.selectedIndex;\n if (tab.disabled || currentIndex === undefined || index === currentIndex) {\n return;\n }\n const currentTab = this.tabs[this.tabIndex()];\n const nextTab = this.tabs[index];\n const canLeave = (await currentTab.canLeave?.({ currentTab, nextTab })) ?? true;\n if (this.tabGroup.selectedIndex != index && canLeave) {\n tabHeader.focusIndex = index;\n this.tabGroup.selectedIndex = index;\n }\n };\n });\n }\n\n addTab(tab: Tab): void {\n // If no explicit order is provided, use the insertion counter\n if (tab.order === undefined) {\n tab.order = this.insertionCounter++;\n }\n\n // Add the tab and sort the tabs array\n this.tabs.push(tab);\n this.sortTabs();\n\n // Update the index map\n this.updateTabIndexMap();\n }\n\n private sortTabs(): void {\n // Sort by the order property (lowest first)\n this.tabs.sort((a, b) => {\n const orderA = a.order ?? Infinity;\n const orderB = b.order ?? Infinity;\n return orderA - orderB;\n });\n }\n\n private updateTabIndexMap(): void {\n // Update the index map after sorting\n this.tabs.forEach((tab, index) => {\n this.tabIndexMap[tab.tabName] = index;\n });\n }\n\n onTabChange(ev: MatTabChangeEvent): void {\n const selectedTab = this.tabs[ev.index];\n this.tabIndex.set(this.tabIndexMap[selectedTab.tabName]);\n this.selectedTabIndex.emit(ev.index);\n this.selectedTab.emit(selectedTab);\n }\n\n selectTab(tabName: string): void {\n const index = this.tabIndexMap[tabName];\n if (index !== undefined) {\n this.tabIndex.set(index);\n this.selectedTabIndex.emit(index);\n this.selectedTab.emit(this.tabs[index]);\n }\n }\n\n indexOf(tabName: string): number {\n return this.tabIndexMap[tabName] ?? -1;\n }\n\n trackByTabName(index: number, tab: Tab): string {\n return tab.tabName;\n }\n\n removeTab(tabName: string): void {\n const index = this.tabIndexMap[tabName];\n if (index !== undefined) {\n this.tabs.splice(index, 1);\n delete this.tabIndexMap[tabName];\n this.updateTabIndexMap();\n }\n }\n\n updateTab(tabName: string, tab: Partial<Omit<Tab, 'tabName'>>): void {\n const index = this.tabIndexMap[tabName];\n if (index !== undefined) {\n this.tabs[index] = { ...this.tabs[index], ...tab };\n\n // Re-sort if the order changed\n if (tab.order !== undefined) {\n this.sortTabs();\n this.updateTabIndexMap();\n }\n }\n }\n}\n","<mat-tab-group\n #tabGroup\n headerPosition=\"above\"\n class=\"tabs-container\"\n [ngClass]=\"'tabs-type-' + ((isMobile$ | async) ? 'underlined' : type)\"\n [class.tabs-container-loading]=\"isLoading()\"\n [attr.theme]=\"applicationTheme\"\n [dynamicHeight]=\"dynamicHeight\"\n [selectedIndex]=\"tabIndex()\"\n [animationDuration]=\"animationDuration\"\n (selectedTabChange)=\"onTabChange($event)\"\n role=\"tablist\"\n>\n <mat-tab\n *ngFor=\"let tab of tabs; trackBy: trackByTabName; let i = index\"\n [disabled]=\"tab.disabled ?? false\"\n [attr.aria-label]=\"tab?.ariaLabel\"\n >\n <ng-template mat-tab-label>\n <a\n data-test-role=\"tab-link\"\n [attr.data-testid]=\"tab.tabName\"\n class=\"tab-name\"\n [href]=\"tab?.linkUrl ? tab.linkUrl : '#'\"\n (click)=\"$event.preventDefault()\"\n [attr.aria-selected]=\"i === tabIndex()\"\n [attr.aria-label]=\"tab.tabLabel + (i === tabIndex() ? ', ' + ('TABS.SELECTED' | uiTranslate | async) : '')\"\n role=\"tab\"\n >\n @if (isLoading()) {\n <ui-skeleton [count]=\"1\"\n [theme]=\"tab.skeletonTheme ?? {}\"\n [isAiTheme]=\"!!tab.isSkeletonAiTheme\"\n ></ui-skeleton>\n } @else {\n <ui-icon\n color=\"rebrand-black\"\n [size]=\"'24'\"\n [tabindex]=\"1\"\n class=\"left-icon\"\n [name]=\"tab.iconLeft!\"\n *ngIf=\"tab?.iconLeft\"\n ></ui-icon>\n <span class=\"label\">{{ tab.tabLabel }}</span>\n <ui-icon\n color=\"rebrand-black\"\n [size]=\"'24'\"\n class=\"right-icon\"\n [name]=\"tab.iconRight!\"\n *ngIf=\"tab?.iconRight\"\n ></ui-icon>\n }\n </a>\n </ng-template>\n <div role=\"tabpanel\" [attr.id]=\"'tabpanel-' + i\" [attr.aria-labelledby]=\"'tab-' + i\">\n <ng-container *ngTemplateOutlet=\"tab.contentTemplateRef\"></ng-container>\n </div>\n </mat-tab>\n</mat-tab-group>\n","import { booleanAttribute, DestroyRef, Directive, effect, inject, input, OnInit, TemplateRef } from '@angular/core';\nimport { IconName } from '@testgorilla/tgo-ui/components/icon';\nimport { TabsComponent } from './tabs.component';\nimport { Tab } from './tabs.model';\nimport { NgxSkeletonLoaderConfigTheme } from 'ngx-skeleton-loader';\n\n@Directive({\n standalone: true,\n selector: 'ng-template[uiTab]',\n})\nexport class TabDirective implements OnInit {\n tabLabel = input.required<string>();\n tabName = input.required<string>();\n iconLeft = input<IconName>();\n iconRight = input<IconName>();\n disabled = input<boolean, string>(false, { transform: booleanAttribute });\n canLeave = input<(ctx?: { currentTab: Tab; nextTab: Tab }) => boolean | Promise<boolean>>();\n linkUrl = input<string>();\n order = input<number>();\n skeletonTheme = input<NgxSkeletonLoaderConfigTheme>();\n isSkeletonAiTheme = input<boolean>();\n\n private tabsComponent = inject(TabsComponent);\n private template = inject(TemplateRef);\n\n private syncProps = effect(() => {\n this.tabsComponent.updateTab(this.tabName(), {\n tabLabel: this.tabLabel(),\n iconLeft: this.iconLeft(),\n iconRight: this.iconRight(),\n disabled: this.disabled(),\n canLeave: this.canLeave(),\n linkUrl: this.linkUrl(),\n order: this.order(),\n skeletonTheme: this.skeletonTheme(),\n isSkeletonAiTheme: this.isSkeletonAiTheme(),\n });\n });\n\n private cleanup = inject(DestroyRef).onDestroy(() => {\n this.tabsComponent.removeTab(this.tabName());\n });\n\n ngOnInit(): void {\n this.addTab();\n }\n\n private addTab(): void {\n this.tabsComponent.addTab({\n tabLabel: this.tabLabel(),\n tabName: this.tabName(),\n iconLeft: this.iconLeft(),\n iconRight: this.iconRight(),\n disabled: this.disabled(),\n contentTemplateRef: this.template,\n canLeave: this.canLeave(),\n linkUrl: this.linkUrl(),\n order: this.order(),\n skeletonTheme: this.skeletonTheme(),\n isSkeletonAiTheme: this.isSkeletonAiTheme(),\n });\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TabsComponent } from './tabs.component';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { IconComponentModule } from '@testgorilla/tgo-ui/components/icon';\nimport { TabDirective } from './tab.directive';\nimport { UiTranslatePipe } from '@testgorilla/tgo-ui/components/core';\nimport { SkeletonComponent } from '@testgorilla/tgo-ui/components/skeleton';\n\n@NgModule({\n declarations: [TabsComponent],\n imports: [TabDirective, CommonModule, MatTabsModule, IconComponentModule, UiTranslatePipe, SkeletonComponent],\n exports: [TabsComponent, TabDirective],\n})\nexport class TabsComponentModule {}\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-tabs.mjs","sources":["../../../components/tabs/tabs.component.ts","../../../components/tabs/tabs.component.html","../../../components/tabs/tab.directive.ts","../../../components/tabs/tabs.component.module.ts","../../../components/tabs/testgorilla-tgo-ui-components-tabs.ts"],"sourcesContent":["import { ENTER, hasModifierKey, SPACE } from '@angular/cdk/keycodes';\nimport {\n booleanAttribute,\n Component,\n EventEmitter,\n HostBinding,\n Inject,\n input,\n Input,\n Optional,\n Output,\n signal,\n ViewChild,\n} from '@angular/core';\nimport { MatTab, MatTabGroup } from '@angular/material/tabs';\nimport { ApplicationTheme, IS_MOBILE_TOKEN } from '@testgorilla/tgo-ui/components/core';\nimport { Observable } from 'rxjs';\nimport { Tab, TabsType } from './tabs.model';\n\n@Component({\n selector: 'ui-tabs',\n templateUrl: './tabs.component.html',\n styleUrls: ['./tabs.component.scss'],\n standalone: false,\n})\nexport class TabsComponent {\n /**\n * Color of the Tabs.\n * Defaults to Test Gorilla primary color.\n *\n * @type {string}\n * @memberof TabsComponent\n */\n @HostBinding('style.--color')\n @Input()\n companyColor: string | null = '#46A997';\n /**\n * Type the Tabs.\n * Defaults underlined.\n *\n * @type {TabsType}\n * @memberof TabsComponent\n */\n @Input() type: TabsType = 'underlined';\n\n /**\n * Animation duration when switching tabs\n *\n * @type {number}\n * @memberof TabsComponent\n */\n @Input() animationDuration = 300;\n\n /**\n * Sets the padding for content and header\n *\n * @type {number}\n * @memberof TabsComponent\n */\n @HostBinding('style.--header-content-padding')\n @Input({ transform: (value: number): string => value + 'px' })\n headerContentPadding = '32px';\n\n /**\n * Sets the dynamic height of the tab\n * @type {boolean}\n * @memberof TabsComponent\n */\n @Input({ transform: booleanAttribute }) dynamicHeight = true;\n\n /**\n *\n * Defines the application theme\n *\n * @type {ApplicationTheme}\n * @memberof TabsComponent\n */\n @Input() applicationTheme: ApplicationTheme = 'light';\n\n isLoading = input(false);\n\n @Output() selectedTabIndex = new EventEmitter<number>();\n @Output() selectedTab = new EventEmitter<Tab>();\n\n @ViewChild('tabGroup', { static: true }) tabGroup: MatTabGroup;\n\n protected tabs: Tab[] = [];\n readonly tabIndex = signal(0);\n protected tabIndexMap: Record<string, number> = {};\n\n // Counter for default ordering when order is not specified\n private insertionCounter: number = 0;\n private tabTransitionInProgress = false;\n\n constructor(\n @Optional() @Inject('CANOPYUI_DEFAULT_APPLICATION_THEME') private readonly defaultAppTheme: ApplicationTheme,\n @Inject(IS_MOBILE_TOKEN) protected readonly isMobile$: Observable<boolean>\n ) {\n if (defaultAppTheme) {\n this.applicationTheme = defaultAppTheme;\n }\n }\n\n ngAfterViewInit(): void {\n setTimeout(() => {\n const tabHeader = (this.tabGroup as any)._tabHeader;\n tabHeader._handleKeydown = async (event: KeyboardEvent) => {\n if (hasModifierKey(event) || this.tabTransitionInProgress) {\n return;\n }\n switch (event.keyCode) {\n case ENTER:\n case SPACE:\n this.tabTransitionInProgress = true;\n try {\n const tabLabel = (event.target as HTMLElement).innerText;\n const currentTab = this.tabs[this.tabIndex()];\n const nextTab = this.tabs.find(tab => tab.tabLabel === tabLabel);\n\n if (!nextTab) {\n return;\n }\n\n const canLeave = (await currentTab.canLeave?.({ currentTab, nextTab })) ?? true;\n if (currentTab.tabName !== nextTab.tabName && canLeave) {\n const nextTabIndex = this.tabIndexMap[nextTab.tabName];\n this.tabIndex.set(nextTabIndex);\n this.selectedTabIndex.emit(nextTabIndex);\n this.selectedTab.emit(nextTab);\n }\n } finally {\n this.tabTransitionInProgress = false;\n }\n break;\n default:\n tabHeader._keyManager.onKeydown(event);\n }\n };\n\n (this.tabGroup as any)._handleClick = async (tab: MatTab, tabHeader: any, index: number) => {\n if (tab.disabled || index === this.tabIndex() || this.tabTransitionInProgress) {\n return;\n }\n this.tabTransitionInProgress = true;\n try {\n const currentTab = this.tabs[this.tabIndex()];\n const nextTab = this.tabs[index];\n const canLeave = (await currentTab.canLeave?.({ currentTab, nextTab })) ?? true;\n if (this.tabIndex() !== index && canLeave) {\n this.tabIndex.set(index);\n this.selectedTabIndex.emit(index);\n this.selectedTab.emit(nextTab);\n }\n } finally {\n this.tabTransitionInProgress = false;\n }\n };\n });\n }\n\n addTab(tab: Tab): void {\n // If no explicit order is provided, use the insertion counter\n if (tab.order === undefined) {\n tab.order = this.insertionCounter++;\n }\n\n // Add the tab and sort the tabs array\n this.tabs.push(tab);\n this.sortTabs();\n\n // Update the index map\n this.updateTabIndexMap();\n }\n\n private sortTabs(): void {\n // Sort by the order property (lowest first)\n this.tabs.sort((a, b) => {\n const orderA = a.order ?? Infinity;\n const orderB = b.order ?? Infinity;\n return orderA - orderB;\n });\n }\n\n private updateTabIndexMap(): void {\n // Update the index map after sorting\n this.tabs.forEach((tab, index) => {\n this.tabIndexMap[tab.tabName] = index;\n });\n }\n\n onTabChange(index: number): void {\n const selectedTab = this.tabs[index];\n const newIndex = this.tabIndexMap[selectedTab.tabName];\n if (this.tabIndex() === newIndex) {\n return;\n }\n this.tabIndex.set(newIndex);\n this.selectedTabIndex.emit(index);\n this.selectedTab.emit(selectedTab);\n }\n\n selectTab(tabName: string): void {\n const index = this.tabIndexMap[tabName];\n if (index !== undefined) {\n this.tabIndex.set(index);\n this.selectedTabIndex.emit(index);\n this.selectedTab.emit(this.tabs[index]);\n }\n }\n\n indexOf(tabName: string): number {\n return this.tabIndexMap[tabName] ?? -1;\n }\n\n trackByTabName(index: number, tab: Tab): string {\n return tab.tabName;\n }\n\n removeTab(tabName: string): void {\n const index = this.tabIndexMap[tabName];\n if (index !== undefined) {\n this.tabs.splice(index, 1);\n delete this.tabIndexMap[tabName];\n this.updateTabIndexMap();\n }\n }\n\n updateTab(tabName: string, tab: Partial<Omit<Tab, 'tabName'>>): void {\n const index = this.tabIndexMap[tabName];\n if (index !== undefined) {\n this.tabs[index] = { ...this.tabs[index], ...tab };\n\n // Re-sort if the order changed\n if (tab.order !== undefined) {\n this.sortTabs();\n this.updateTabIndexMap();\n }\n }\n }\n}\n","<mat-tab-group\n #tabGroup\n headerPosition=\"above\"\n class=\"tabs-container\"\n [ngClass]=\"'tabs-type-' + ((isMobile$ | async) ? 'underlined' : type)\"\n [class.tabs-container-loading]=\"isLoading()\"\n [attr.theme]=\"applicationTheme\"\n [dynamicHeight]=\"dynamicHeight\"\n [selectedIndex]=\"tabIndex()\"\n [animationDuration]=\"animationDuration\"\n (selectedIndexChange)=\"onTabChange($event)\"\n role=\"tablist\"\n>\n <mat-tab\n *ngFor=\"let tab of tabs; trackBy: trackByTabName; let i = index\"\n [disabled]=\"tab.disabled ?? false\"\n [attr.aria-label]=\"tab?.ariaLabel\"\n >\n <ng-template mat-tab-label>\n <a\n data-test-role=\"tab-link\"\n [attr.data-testid]=\"tab.tabName\"\n class=\"tab-name\"\n [href]=\"tab?.linkUrl ? tab.linkUrl : '#'\"\n (click)=\"$event.preventDefault()\"\n [attr.aria-selected]=\"i === tabIndex()\"\n [attr.aria-label]=\"tab.tabLabel + (i === tabIndex() ? ', ' + ('TABS.SELECTED' | uiTranslate | async) : '')\"\n role=\"tab\"\n >\n @if (isLoading()) {\n <ui-skeleton [count]=\"1\"\n [theme]=\"tab.skeletonTheme ?? {}\"\n [isAiTheme]=\"!!tab.isSkeletonAiTheme\"\n ></ui-skeleton>\n } @else {\n <ui-icon\n color=\"rebrand-black\"\n [size]=\"'24'\"\n [tabindex]=\"1\"\n class=\"left-icon\"\n [name]=\"tab.iconLeft!\"\n *ngIf=\"tab?.iconLeft\"\n ></ui-icon>\n <span class=\"label\">{{ tab.tabLabel }}</span>\n <ui-icon\n color=\"rebrand-black\"\n [size]=\"'24'\"\n class=\"right-icon\"\n [name]=\"tab.iconRight!\"\n *ngIf=\"tab?.iconRight\"\n ></ui-icon>\n }\n </a>\n </ng-template>\n <div role=\"tabpanel\" [attr.id]=\"'tabpanel-' + i\" [attr.aria-labelledby]=\"'tab-' + i\">\n <ng-container *ngTemplateOutlet=\"tab.contentTemplateRef\"></ng-container>\n </div>\n </mat-tab>\n</mat-tab-group>\n","import { booleanAttribute, DestroyRef, Directive, effect, inject, input, OnInit, TemplateRef } from '@angular/core';\nimport { IconName } from '@testgorilla/tgo-ui/components/icon';\nimport { TabsComponent } from './tabs.component';\nimport { Tab } from './tabs.model';\nimport { NgxSkeletonLoaderConfigTheme } from 'ngx-skeleton-loader';\n\n@Directive({\n standalone: true,\n selector: 'ng-template[uiTab]',\n})\nexport class TabDirective implements OnInit {\n tabLabel = input.required<string>();\n tabName = input.required<string>();\n iconLeft = input<IconName>();\n iconRight = input<IconName>();\n disabled = input<boolean, string>(false, { transform: booleanAttribute });\n canLeave = input<(ctx?: { currentTab: Tab; nextTab: Tab }) => boolean | Promise<boolean>>();\n linkUrl = input<string>();\n order = input<number>();\n skeletonTheme = input<NgxSkeletonLoaderConfigTheme>();\n isSkeletonAiTheme = input<boolean>();\n\n private tabsComponent = inject(TabsComponent);\n private template = inject(TemplateRef);\n\n private syncProps = effect(() => {\n this.tabsComponent.updateTab(this.tabName(), {\n tabLabel: this.tabLabel(),\n iconLeft: this.iconLeft(),\n iconRight: this.iconRight(),\n disabled: this.disabled(),\n canLeave: this.canLeave(),\n linkUrl: this.linkUrl(),\n order: this.order(),\n skeletonTheme: this.skeletonTheme(),\n isSkeletonAiTheme: this.isSkeletonAiTheme(),\n });\n });\n\n private cleanup = inject(DestroyRef).onDestroy(() => {\n this.tabsComponent.removeTab(this.tabName());\n });\n\n ngOnInit(): void {\n this.addTab();\n }\n\n private addTab(): void {\n this.tabsComponent.addTab({\n tabLabel: this.tabLabel(),\n tabName: this.tabName(),\n iconLeft: this.iconLeft(),\n iconRight: this.iconRight(),\n disabled: this.disabled(),\n contentTemplateRef: this.template,\n canLeave: this.canLeave(),\n linkUrl: this.linkUrl(),\n order: this.order(),\n skeletonTheme: this.skeletonTheme(),\n isSkeletonAiTheme: this.isSkeletonAiTheme(),\n });\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TabsComponent } from './tabs.component';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { IconComponentModule } from '@testgorilla/tgo-ui/components/icon';\nimport { TabDirective } from './tab.directive';\nimport { UiTranslatePipe } from '@testgorilla/tgo-ui/components/core';\nimport { SkeletonComponent } from '@testgorilla/tgo-ui/components/skeleton';\n\n@NgModule({\n declarations: [TabsComponent],\n imports: [TabDirective, CommonModule, MatTabsModule, IconComponentModule, UiTranslatePipe, SkeletonComponent],\n exports: [TabsComponent, TabDirective],\n})\nexport class TabsComponentModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@testgorilla/tgo-ui",
|
|
3
|
-
"version": "6.0.
|
|
3
|
+
"version": "6.0.3-beta",
|
|
4
4
|
"license": "proprietary-license",
|
|
5
5
|
"lint-staged": {
|
|
6
6
|
"{projects,components}/**/*.ts": [
|
|
@@ -74,6 +74,10 @@
|
|
|
74
74
|
"types": "./components/ai-audio-circle/index.d.ts",
|
|
75
75
|
"default": "./fesm2022/testgorilla-tgo-ui-components-ai-audio-circle.mjs"
|
|
76
76
|
},
|
|
77
|
+
"./components/ai-caveat": {
|
|
78
|
+
"types": "./components/ai-caveat/index.d.ts",
|
|
79
|
+
"default": "./fesm2022/testgorilla-tgo-ui-components-ai-caveat.mjs"
|
|
80
|
+
},
|
|
77
81
|
"./components/accordion": {
|
|
78
82
|
"types": "./components/accordion/index.d.ts",
|
|
79
83
|
"default": "./fesm2022/testgorilla-tgo-ui-components-accordion.mjs"
|
|
@@ -82,10 +86,6 @@
|
|
|
82
86
|
"types": "./components/ai-feedback/index.d.ts",
|
|
83
87
|
"default": "./fesm2022/testgorilla-tgo-ui-components-ai-feedback.mjs"
|
|
84
88
|
},
|
|
85
|
-
"./components/ai-caveat": {
|
|
86
|
-
"types": "./components/ai-caveat/index.d.ts",
|
|
87
|
-
"default": "./fesm2022/testgorilla-tgo-ui-components-ai-caveat.mjs"
|
|
88
|
-
},
|
|
89
89
|
"./components/alert-banner": {
|
|
90
90
|
"types": "./components/alert-banner/index.d.ts",
|
|
91
91
|
"default": "./fesm2022/testgorilla-tgo-ui-components-alert-banner.mjs"
|
|
@@ -94,14 +94,14 @@
|
|
|
94
94
|
"types": "./components/autocomplete/index.d.ts",
|
|
95
95
|
"default": "./fesm2022/testgorilla-tgo-ui-components-autocomplete.mjs"
|
|
96
96
|
},
|
|
97
|
-
"./components/avatar": {
|
|
98
|
-
"types": "./components/avatar/index.d.ts",
|
|
99
|
-
"default": "./fesm2022/testgorilla-tgo-ui-components-avatar.mjs"
|
|
100
|
-
},
|
|
101
97
|
"./components/badge": {
|
|
102
98
|
"types": "./components/badge/index.d.ts",
|
|
103
99
|
"default": "./fesm2022/testgorilla-tgo-ui-components-badge.mjs"
|
|
104
100
|
},
|
|
101
|
+
"./components/avatar": {
|
|
102
|
+
"types": "./components/avatar/index.d.ts",
|
|
103
|
+
"default": "./fesm2022/testgorilla-tgo-ui-components-avatar.mjs"
|
|
104
|
+
},
|
|
105
105
|
"./components/breadcrumb": {
|
|
106
106
|
"types": "./components/breadcrumb/index.d.ts",
|
|
107
107
|
"default": "./fesm2022/testgorilla-tgo-ui-components-breadcrumb.mjs"
|
|
@@ -122,14 +122,14 @@
|
|
|
122
122
|
"types": "./components/checklist/index.d.ts",
|
|
123
123
|
"default": "./fesm2022/testgorilla-tgo-ui-components-checklist.mjs"
|
|
124
124
|
},
|
|
125
|
-
"./components/core": {
|
|
126
|
-
"types": "./components/core/index.d.ts",
|
|
127
|
-
"default": "./fesm2022/testgorilla-tgo-ui-components-core.mjs"
|
|
128
|
-
},
|
|
129
125
|
"./components/datepicker": {
|
|
130
126
|
"types": "./components/datepicker/index.d.ts",
|
|
131
127
|
"default": "./fesm2022/testgorilla-tgo-ui-components-datepicker.mjs"
|
|
132
128
|
},
|
|
129
|
+
"./components/core": {
|
|
130
|
+
"types": "./components/core/index.d.ts",
|
|
131
|
+
"default": "./fesm2022/testgorilla-tgo-ui-components-core.mjs"
|
|
132
|
+
},
|
|
133
133
|
"./components/dialog": {
|
|
134
134
|
"types": "./components/dialog/index.d.ts",
|
|
135
135
|
"default": "./fesm2022/testgorilla-tgo-ui-components-dialog.mjs"
|
|
@@ -142,22 +142,22 @@
|
|
|
142
142
|
"types": "./components/donut-chart/index.d.ts",
|
|
143
143
|
"default": "./fesm2022/testgorilla-tgo-ui-components-donut-chart.mjs"
|
|
144
144
|
},
|
|
145
|
-
"./components/dropdown": {
|
|
146
|
-
"types": "./components/dropdown/index.d.ts",
|
|
147
|
-
"default": "./fesm2022/testgorilla-tgo-ui-components-dropdown.mjs"
|
|
148
|
-
},
|
|
149
145
|
"./components/elevation-shadow": {
|
|
150
146
|
"types": "./components/elevation-shadow/index.d.ts",
|
|
151
147
|
"default": "./fesm2022/testgorilla-tgo-ui-components-elevation-shadow.mjs"
|
|
152
148
|
},
|
|
153
|
-
"./components/
|
|
154
|
-
"types": "./components/
|
|
155
|
-
"default": "./fesm2022/testgorilla-tgo-ui-components-
|
|
149
|
+
"./components/dropdown": {
|
|
150
|
+
"types": "./components/dropdown/index.d.ts",
|
|
151
|
+
"default": "./fesm2022/testgorilla-tgo-ui-components-dropdown.mjs"
|
|
156
152
|
},
|
|
157
153
|
"./components/empty-state": {
|
|
158
154
|
"types": "./components/empty-state/index.d.ts",
|
|
159
155
|
"default": "./fesm2022/testgorilla-tgo-ui-components-empty-state.mjs"
|
|
160
156
|
},
|
|
157
|
+
"./components/field": {
|
|
158
|
+
"types": "./components/field/index.d.ts",
|
|
159
|
+
"default": "./fesm2022/testgorilla-tgo-ui-components-field.mjs"
|
|
160
|
+
},
|
|
161
161
|
"./components/file-upload": {
|
|
162
162
|
"types": "./components/file-upload/index.d.ts",
|
|
163
163
|
"default": "./fesm2022/testgorilla-tgo-ui-components-file-upload.mjs"
|