feat: add hunt page, combat placeholder, and Jagd navigation

Wires up Slice 0.2 end-to-end: HuntPageComponent renders the
hunting-unavailable/ready/loading/encounters-found states off
HuntingStore and WorldStore, Angreifen hands the HuntEncounter id to a
new inert CombatPlaceholderPageComponent via /combat/new, the Jagd nav
entry is enabled with router-driven active state (matching Karte's),
and the context panel now lists possible encounters for hunting-enabled
locations.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Bastian Wagner
2026-08-19 14:06:57 +02:00
parent 784bd3ce3a
commit 4e684dc45e
11 changed files with 664 additions and 24 deletions

View File

@@ -0,0 +1,72 @@
import { Component, inject } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
@Component({
selector: 'app-combat-placeholder-page',
template: `
<section class="combat-placeholder" aria-label="Kampfvorbereitung">
<span class="combat-placeholder__eyebrow">KAMPF</span>
<h2>Vorbereitung auf den Kampf</h2>
<p>
Die Klinge ist gezogen, der Gegner steht bereit doch das eigentliche Gefecht liegt noch
vor dir. Diese Ansicht ist ein Zwischenhalt auf dem Weg in den Kampf, der in einem
späteren Schritt folgt.
</p>
@if (encounterId) {
<p class="combat-placeholder__id" data-encounter-id>
Vorbereitung auf den Kampf gegen Begegnung {{ encounterId }}…
</p>
}
</section>
`,
styles: [
`
:host {
display: block;
}
.combat-placeholder {
display: grid;
gap: var(--ar-space-3);
max-inline-size: 40rem;
margin: var(--ar-space-6) auto;
padding: var(--ar-space-5);
border: 1px solid var(--ar-border);
background: var(--ar-panel);
box-shadow: var(--ar-shadow-raised);
text-align: center;
}
.combat-placeholder__eyebrow {
color: var(--ar-gold);
font-size: var(--ar-font-sm);
letter-spacing: 0.14em;
text-transform: uppercase;
}
.combat-placeholder h2 {
margin: 0;
font-family: Georgia, 'Times New Roman', serif;
font-size: 1.6rem;
font-weight: 400;
}
.combat-placeholder p {
margin: 0;
color: var(--ar-text-muted);
line-height: 1.55;
}
.combat-placeholder__id {
color: var(--ar-text-muted);
font-size: var(--ar-font-sm);
font-style: italic;
}
`,
],
})
export class CombatPlaceholderPageComponent {
private readonly route = inject(ActivatedRoute);
protected readonly encounterId = this.route.snapshot.queryParamMap.get('encounterId');
}