diff --git a/apps/web/src/app/shared/danger-badge/danger-badge.component.html b/apps/web/src/app/shared/danger-badge/danger-badge.component.html new file mode 100644 index 0000000..92822f7 --- /dev/null +++ b/apps/web/src/app/shared/danger-badge/danger-badge.component.html @@ -0,0 +1,9 @@ +{{ label }} diff --git a/apps/web/src/app/shared/danger-badge/danger-badge.component.scss b/apps/web/src/app/shared/danger-badge/danger-badge.component.scss new file mode 100644 index 0000000..c056a63 --- /dev/null +++ b/apps/web/src/app/shared/danger-badge/danger-badge.component.scss @@ -0,0 +1,44 @@ +:host { + display: inline-block; +} + +.danger-badge { + display: inline-flex; + align-items: center; + padding: var(--ar-space-1) var(--ar-space-2); + border: 1px solid var(--ar-border); + border-radius: var(--ar-radius-sm); + background: var(--ar-panel-muted); + color: var(--ar-text); + font-family: Georgia, 'Times New Roman', serif; + font-size: var(--ar-font-sm); + letter-spacing: 0.02em; +} + +.danger-badge--weak { + color: var(--ar-success); + border-color: var(--ar-success); +} + +.danger-badge--match { + color: var(--ar-success); + border-color: var(--ar-success); + font-weight: 700; +} + +.danger-badge--strong { + color: var(--ar-warning); + border-color: var(--ar-warning); +} + +.danger-badge--very-dangerous { + color: var(--ar-danger); + border-color: var(--ar-danger); +} + +.danger-badge--deadly { + color: var(--ar-danger); + border-color: var(--ar-danger); + font-weight: 700; + background: color-mix(in srgb, var(--ar-danger) 18%, var(--ar-panel-muted)); +} diff --git a/apps/web/src/app/shared/danger-badge/danger-badge.component.spec.ts b/apps/web/src/app/shared/danger-badge/danger-badge.component.spec.ts new file mode 100644 index 0000000..40a1e86 --- /dev/null +++ b/apps/web/src/app/shared/danger-badge/danger-badge.component.spec.ts @@ -0,0 +1,30 @@ +import { TestBed } from '@angular/core/testing'; +import type { DangerRating } from '../../core/api/game-api.models'; +import { DangerBadgeComponent } from './danger-badge.component'; + +const expectations: Array<{ rating: DangerRating; label: string; modifierClass: string }> = [ + { rating: 'WEAK', label: 'Schwach', modifierClass: 'danger-badge--weak' }, + { rating: 'MATCH', label: 'Passend', modifierClass: 'danger-badge--match' }, + { rating: 'STRONG', label: 'Stark', modifierClass: 'danger-badge--strong' }, + { + rating: 'VERY_DANGEROUS', + label: 'Sehr gefährlich', + modifierClass: 'danger-badge--very-dangerous', + }, + { rating: 'DEADLY', label: 'Tödlich', modifierClass: 'danger-badge--deadly' }, +]; + +describe('DangerBadgeComponent', () => { + for (const { rating, label, modifierClass } of expectations) { + it(`renders the German label "${label}" and modifier class for ${rating}`, () => { + const fixture = TestBed.createComponent(DangerBadgeComponent); + fixture.componentRef.setInput('rating', rating); + fixture.detectChanges(); + + const badge = fixture.nativeElement.querySelector('.danger-badge') as HTMLElement; + + expect(badge.textContent?.trim()).toBe(label); + expect(badge.classList.contains(modifierClass)).toBe(true); + }); + } +}); diff --git a/apps/web/src/app/shared/danger-badge/danger-badge.component.ts b/apps/web/src/app/shared/danger-badge/danger-badge.component.ts new file mode 100644 index 0000000..5dd3bcb --- /dev/null +++ b/apps/web/src/app/shared/danger-badge/danger-badge.component.ts @@ -0,0 +1,23 @@ +import { Component, Input } from '@angular/core'; +import { DangerRating } from '../../core/api/game-api.models'; + +const DANGER_LABELS: Record = { + WEAK: 'Schwach', + MATCH: 'Passend', + STRONG: 'Stark', + VERY_DANGEROUS: 'Sehr gefährlich', + DEADLY: 'Tödlich', +}; + +@Component({ + selector: 'app-danger-badge', + templateUrl: './danger-badge.component.html', + styleUrl: './danger-badge.component.scss', +}) +export class DangerBadgeComponent { + @Input({ required: true }) rating!: DangerRating; + + protected get label(): string { + return DANGER_LABELS[this.rating]; + } +}