feat: Intuitivere Bedienung — klickbare Stats + Abstimmungs-Filter + Fraktions-Normalisierung (#14)

Dashboard:
- Neuer Endpoint GET /api/stats/dashboard mit allen Kennzahlen
- Klickbare Kacheln: Vorlagen nach Typ, Ketten nach Status → navigieren zu Filterlisten
- Umsetzungsquote als horizontaler Balken mit klickbaren Segmenten

Abstimmungen:
- Stimmverhalten-Tabelle klickbar: Fraktion oder Ja/Nein/Enthaltung → filtert
- Neuer Endpoint GET /api/abstimmungen/details (?fraktion=&stimme=) mit Pagination
- Neuer Endpoint GET /api/abstimmungen/vergleich (?f1=&f2=) für Koalitionsmatrix-Drill-Down
- Koalitionsmatrix-Zellen klickbar → zeigt Abstimmungsvergleich beider Fraktionen

Fraktions-Normalisierung:
- fraktionen_mapping.py: 40+ DB-Varianten → kanonische Namen
- 'Bündnis 90 / Die Grünen' / 'Bündnis 90/Die Grünen' / 'Grüne' → 'Grüne'
- 'Die Linke' / 'Die Linke.' / 'Linke' → 'Linke'
- BfHo-Varianten, Hagen Aktiv, Einzelvertreter etc. normalisiert
- Mapping in allen Abstimmungs-Endpoints aktiv
- ist_ratsfraktion Flag in Fraktionen-Response

Closes #14
This commit is contained in:
Dotty Dotter 2026-04-01 14:32:06 +02:00
parent 31b1e1bd7e
commit ea3e5cd329
96 changed files with 939 additions and 235 deletions

View File

@ -3,6 +3,7 @@ from __future__ import annotations
from fastapi import APIRouter, Depends, Query
from tracker.core.fraktionen_mapping import normalize_fraktion, get_all_variants, is_ratsfraktion
from tracker.db.session import get_connection
router = APIRouter(prefix="/abstimmungen", tags=["Abstimmungen"])
@ -49,17 +50,28 @@ def get_fraktionen_uebersicht(conn=Depends(_db)):
ORDER BY gesamt DESC
""").fetchall()
return [
{
"fraktion": r[0],
"ja": r[1],
"nein": r[2],
"enthaltung": r[3],
"gesamt": r[4],
"ja_quote": round(r[1] / r[4] * 100, 1) if r[4] > 0 else 0
}
for r in rows
]
# Normalize and aggregate
from collections import defaultdict
agg: dict[str, dict] = defaultdict(lambda: {"ja": 0, "nein": 0, "enthaltung": 0, "gesamt": 0})
for r in rows:
name = normalize_fraktion(r[0])
agg[name]["ja"] += r[1]
agg[name]["nein"] += r[2]
agg[name]["enthaltung"] += r[3]
agg[name]["gesamt"] += r[4]
result = []
for name, d in sorted(agg.items(), key=lambda x: -x[1]["gesamt"]):
result.append({
"fraktion": name,
"ja": d["ja"],
"nein": d["nein"],
"enthaltung": d["enthaltung"],
"gesamt": d["gesamt"],
"ja_quote": round(d["ja"] / d["gesamt"] * 100, 1) if d["gesamt"] > 0 else 0,
"ist_ratsfraktion": is_ratsfraktion(name),
})
return result
@router.get("/koalitionsmatrix")
@ -72,14 +84,16 @@ def get_koalitionsmatrix(conn=Depends(_db)):
WHERE stimme IN ('ja', 'nein')
""").fetchall()
# Gruppieren nach Abstimmung
# Gruppieren nach Abstimmung (normalisiert)
from collections import defaultdict
by_abstimmung = defaultdict(dict)
for aid, fraktion, stimme in abstimmungen:
by_abstimmung[aid][fraktion] = stimme
name = normalize_fraktion(fraktion)
# Bei Mehrfach-Vorkommen pro Abstimmung: letzten Wert nehmen
by_abstimmung[aid][name] = stimme
# Paarweise Übereinstimmung zählen
fraktionen = list(set(r[1] for r in abstimmungen))
fraktionen = sorted(set(name for stimmen in by_abstimmung.values() for name in stimmen))
matrix = {f1: {f2: {"gleich": 0, "gesamt": 0} for f2 in fraktionen} for f1 in fraktionen}
for aid, stimmen in by_abstimmung.items():
@ -107,6 +121,135 @@ def get_koalitionsmatrix(conn=Depends(_db)):
return result
@router.get("/details")
def get_abstimmungen_details(
fraktion: str | None = None,
stimme: str | None = None,
page: int = Query(1, ge=1),
page_size: int = Query(20, ge=1, le=100),
conn=Depends(_db),
):
"""Paginierte Liste von Abstimmungen gefiltert nach Fraktion und/oder Stimme."""
where_clauses = []
params: list = []
if fraktion:
variants = get_all_variants(fraktion)
placeholders = ",".join("?" * len(variants))
where_clauses.append(f"af.fraktion IN ({placeholders})")
params.extend(variants)
if stimme:
where_clauses.append("af.stimme = ?")
params.append(stimme)
where_sql = ("WHERE " + " AND ".join(where_clauses)) if where_clauses else ""
total = conn.execute(
f"""SELECT COUNT(*) FROM abstimmungen_fraktionen af
JOIN abstimmungen a ON af.abstimmung_id = a.id
JOIN vorlagen v ON a.vorlage_id = v.id
{where_sql}""",
params,
).fetchone()[0]
offset = (page - 1) * page_size
rows = conn.execute(
f"""SELECT a.id, a.sitzung_datum, a.ergebnis,
v.id as vorlage_id, v.aktenzeichen, v.betreff,
af.fraktion, af.stimme, af.anzahl
FROM abstimmungen_fraktionen af
JOIN abstimmungen a ON af.abstimmung_id = a.id
JOIN vorlagen v ON a.vorlage_id = v.id
{where_sql}
ORDER BY a.sitzung_datum DESC
LIMIT ? OFFSET ?""",
params + [page_size, offset],
).fetchall()
return {
"items": [
{
"id": r[0],
"sitzung_datum": r[1],
"ergebnis": r[2],
"vorlage_id": r[3],
"aktenzeichen": r[4],
"betreff": r[5],
"fraktion": r[6],
"stimme": r[7],
"anzahl": r[8],
}
for r in rows
],
"total": total,
"page": page,
"page_size": page_size,
}
@router.get("/vergleich")
def get_abstimmungen_vergleich(
f1: str = Query(..., description="Erste Fraktion"),
f2: str = Query(..., description="Zweite Fraktion"),
page: int = Query(1, ge=1),
page_size: int = Query(20, ge=1, le=100),
conn=Depends(_db),
):
"""Abstimmungen wo beide Fraktionen abgestimmt haben, mit ihrem jeweiligen Verhalten."""
# Find abstimmungen where both factions voted
v1 = get_all_variants(f1)
v2 = get_all_variants(f2)
ph1 = ",".join("?" * len(v1))
ph2 = ",".join("?" * len(v2))
total = conn.execute(
f"""SELECT COUNT(DISTINCT af1.abstimmung_id)
FROM abstimmungen_fraktionen af1
JOIN abstimmungen_fraktionen af2 ON af1.abstimmung_id = af2.abstimmung_id
WHERE af1.fraktion IN ({ph1}) AND af2.fraktion IN ({ph2})""",
v1 + v2,
).fetchone()[0]
offset = (page - 1) * page_size
rows = conn.execute(
f"""SELECT a.id, a.sitzung_datum, a.ergebnis,
v.id as vorlage_id, v.aktenzeichen, v.betreff,
af1.stimme as stimme1, af1.anzahl as anzahl1,
af2.stimme as stimme2, af2.anzahl as anzahl2
FROM abstimmungen_fraktionen af1
JOIN abstimmungen_fraktionen af2 ON af1.abstimmung_id = af2.abstimmung_id
JOIN abstimmungen a ON af1.abstimmung_id = a.id
JOIN vorlagen v ON a.vorlage_id = v.id
WHERE af1.fraktion IN ({ph1}) AND af2.fraktion IN ({ph2})
ORDER BY a.sitzung_datum DESC
LIMIT ? OFFSET ?""",
v1 + v2 + [page_size, offset],
).fetchall()
return {
"f1": f1,
"f2": f2,
"items": [
{
"id": r[0],
"sitzung_datum": r[1],
"ergebnis": r[2],
"vorlage_id": r[3],
"aktenzeichen": r[4],
"betreff": r[5],
"stimme_f1": r[6],
"anzahl_f1": r[7],
"stimme_f2": r[8],
"anzahl_f2": r[9],
}
for r in rows
],
"total": total,
"page": page,
"page_size": page_size,
}
@router.get("/ablehnungen")
def get_ablehnungsverhalten(conn=Depends(_db)):
"""Wer lehnt wessen Anträge ab?"""

View File

@ -111,6 +111,50 @@ def get_stats(conn=Depends(_db)):
}
@router.get("/dashboard")
def get_dashboard_stats(conn=Depends(_db)):
"""Dashboard-level aggregated stats for the new hub."""
vorlagen_total = conn.execute("SELECT COUNT(*) as c FROM vorlagen").fetchone()["c"]
ketten_total = conn.execute("SELECT COUNT(*) as c FROM ketten").fetchone()["c"]
abstimmungen_total = conn.execute("SELECT COUNT(*) as c FROM abstimmungen").fetchone()["c"]
vorlagen_nach_typ = conn.execute("""
SELECT typ, COUNT(*) as c FROM vorlagen
WHERE typ IS NOT NULL
GROUP BY typ ORDER BY c DESC
""").fetchall()
ketten_nach_status = conn.execute("""
SELECT status, COUNT(*) as c FROM ketten
WHERE status IS NOT NULL
GROUP BY status ORDER BY c DESC
""").fetchall()
# Umsetzungsquote: umgesetzt, teilweise_umgesetzt, versandet aus ketten
umgesetzt = conn.execute("SELECT COUNT(*) as c FROM ketten WHERE status = 'umgesetzt'").fetchone()["c"]
teilweise = conn.execute("SELECT COUNT(*) as c FROM ketten WHERE status = 'teilweise_umgesetzt'").fetchone()["c"]
versandet = conn.execute("SELECT COUNT(*) as c FROM ketten WHERE status = 'versandet'").fetchone()["c"]
beschlossen = conn.execute("SELECT COUNT(*) as c FROM ketten WHERE status = 'beschlossen'").fetchone()["c"]
abgelehnt = conn.execute("SELECT COUNT(*) as c FROM ketten WHERE status = 'abgelehnt'").fetchone()["c"]
total_bewertet = umgesetzt + teilweise + versandet + beschlossen + abgelehnt
return {
"vorlagen_total": vorlagen_total,
"ketten_total": ketten_total,
"vorlagen_nach_typ": [{"typ": r["typ"], "anzahl": r["c"]} for r in vorlagen_nach_typ],
"ketten_nach_status": [{"status": r["status"], "anzahl": r["c"]} for r in ketten_nach_status],
"abstimmungen_total": abstimmungen_total,
"umsetzungsquote": {
"umgesetzt": umgesetzt,
"teilweise": teilweise,
"versandet": versandet,
"beschlossen": beschlossen,
"abgelehnt": abgelehnt,
"total_bewertet": total_bewertet,
},
}
@router.get("/ketten-stats")
def get_ketten_stats(conn=Depends(_db)):
"""Aggregated Ketten status distribution with breakdowns."""

View File

@ -0,0 +1,78 @@
"""Normalisierung von Fraktionsnamen in Abstimmungen.
Verschiedene Schreibweisen kanonischer Name.
"""
# Mapping: DB-Wert → normalisierter Name
FRAKTION_MAPPING: dict[str, str] = {
# Grüne
"Bündnis 90 / Die Grünen": "Grüne",
"Bündnis 90/ Die Grünen": "Grüne",
"Bündnis 90/Die Grünen": "Grüne",
"Grüne": "Grüne",
# Linke
"Die Linke": "Linke",
"Die Linke.": "Linke",
"Linke": "Linke",
"Linke/HAK": "Linke/HAK",
# Hagen Aktiv
"HAGEN AKTIV": "Hagen Aktiv",
"Hagen Aktiv": "Hagen Aktiv",
"HAK": "Hagen Aktiv",
"HAK/Die Linke": "HAK/Linke",
# BfHo / Die PARTEI
"BfHo": "BfHo",
"BFHo/DIE PARTEI": "BfHo/Die PARTEI",
"BFHo/Die PARTEI": "BfHo/Die PARTEI",
"BfH/Die PARTEI": "BfHo/Die PARTEI",
"BfHo/Die PARTEI": "BfHo/Die PARTEI",
"Bürger für Hohenlimburg": "BfHo",
"Bürger für Hohenlimburg / Die PARTEI": "BfHo/Die PARTEI",
# Einzelvertreter
"Einzelmitglied": "Einzelvertreter",
"Einzelvertreter": "Einzelvertreter",
"Parteilos": "Einzelvertreter",
# Verbände (Naturschutz-Beirat etc.)
"BUND NRW e. V.": "BUND",
"LFV NRW e. V.": "LFV",
"LJV NRW e. V.": "LJV",
"LNU NRW e. V.": "LNU",
"LSB NRW e. V.": "LSB",
"LV WLI e. V.": "WLI",
"LVG NRW e. V.": "LVG",
"NABU NRW e. V.": "NABU",
"SDW NRW e. V.": "SDW",
"WBV NRW e. V.": "WBV",
"WLV e. V.": "WLV",
# Rest
"OB": "OB",
"Vertreter*innen der Jugendhilfe": "Jugendhilfe",
"Freie Wähler": "Freie Wähler",
}
# Ratsfraktionen (für Stimmverhalten/Koalitionsmatrix relevant)
RATSFRAKTIONEN = {
"SPD", "CDU", "Grüne", "FDP", "AfD", "Linke", "Hagen Aktiv",
"BfHo", "BfHo/Die PARTEI", "BSW", "Freie Wähler",
}
def normalize_fraktion(name: str) -> str:
"""Normalize a faction name to canonical form."""
return FRAKTION_MAPPING.get(name, name)
def is_ratsfraktion(normalized_name: str) -> bool:
"""Check if a normalized name is a council faction (vs. Beirat etc.)."""
return normalized_name in RATSFRAKTIONEN
def get_all_variants(canonical: str) -> list[str]:
"""Get all DB variants for a canonical faction name."""
return [k for k, v in FRAKTION_MAPPING.items() if v == canonical] or [canonical]

View File

@ -1,5 +1,6 @@
<script lang="ts">
import '../app.css';
import { goto } from '$app/navigation';
interface Vorlage {
id: number;
@ -10,62 +11,109 @@
ist_verwaltungsvorlage: boolean;
}
interface Stats {
vorlagen: number;
beratungen: number;
ketten: number;
gremien: number;
interface DashboardStats {
vorlagen_total: number;
ketten_total: number;
vorlagen_nach_typ: { typ: string; anzahl: number }[];
ketten_nach_status: { status: string; anzahl: number }[];
abstimmungen_total: number;
umsetzungsquote: {
umgesetzt: number;
teilweise: number;
versandet: number;
beschlossen: number;
abgelehnt: number;
total_bewertet: number;
};
}
let stats = $state<Stats>({ vorlagen: 0, beratungen: 0, ketten: 0, gremien: 0 });
let stats = $state<DashboardStats | null>(null);
let antraege = $state<Vorlage[]>([]);
let loading = $state(true);
let error = $state('');
// API-Base: In Produktion relativ, in Dev mit Port
const API_BASE = typeof window !== 'undefined'
? (window.location.port === '5173'
? `http://${window.location.hostname}:8099/api`
: '/api')
: '/api';
async function loadData() {
console.log('API_BASE:', API_BASE);
try {
// Stats laden
console.log('Fetching health...');
const statsRes = await fetch(`${API_BASE}/health`);
console.log('Health response:', statsRes.status);
if (statsRes.ok) {
// Vorlagen zählen
console.log('Fetching vorlagen...');
const vorlagenRes = await fetch(`${API_BASE}/vorlagen?page_size=1`);
console.log('Vorlagen response:', vorlagenRes.status);
const vorlagenData = await vorlagenRes.json();
stats.vorlagen = vorlagenData.total;
const statusColors: Record<string, string> = {
umgesetzt: 'bg-green-100 text-green-800 border-green-200',
teilweise_umgesetzt: 'bg-amber-100 text-amber-800 border-amber-200',
versandet: 'bg-gray-100 text-gray-700 border-gray-200',
beschlossen: 'bg-blue-100 text-blue-800 border-blue-200',
abgelehnt: 'bg-red-100 text-red-800 border-red-200',
in_beratung: 'bg-purple-100 text-purple-800 border-purple-200',
angefragt: 'bg-cyan-100 text-cyan-800 border-cyan-200',
beantwortet: 'bg-teal-100 text-teal-800 border-teal-200',
verwiesen: 'bg-indigo-100 text-indigo-800 border-indigo-200',
offen: 'bg-yellow-100 text-yellow-800 border-yellow-200',
};
// Ketten zählen
const kettenRes = await fetch(`${API_BASE}/ketten?page_size=1`);
const kettenData = await kettenRes.json();
stats.ketten = kettenData.total;
const statusLabels: Record<string, string> = {
umgesetzt: 'Umgesetzt',
teilweise_umgesetzt: 'Teilw. umgesetzt',
versandet: 'Versandet',
beschlossen: 'Beschlossen',
abgelehnt: 'Abgelehnt',
in_beratung: 'In Beratung',
angefragt: 'Angefragt',
beantwortet: 'Beantwortet',
verwiesen: 'Verwiesen',
offen: 'Offen',
};
const typLabels: Record<string, string> = {
antrag: 'Anträge',
anfrage: 'Anfragen',
bericht: 'Berichte',
beschlussvorlage: 'Beschlussvorlagen',
mitteilungsvorlage: 'Mitteilungen',
stellungnahme: 'Stellungnahmen',
sonstig: 'Sonstige',
};
const typIcons: Record<string, string> = {
antrag: '📋',
anfrage: '❓',
bericht: '📄',
beschlussvorlage: '📑',
mitteilungsvorlage: '📨',
stellungnahme: '💬',
sonstig: '📁',
};
// Umsetzungsquote bar colors
const umsetzungBarColors: Record<string, string> = {
umgesetzt: 'bg-green-500',
teilweise: 'bg-amber-400',
beschlossen: 'bg-blue-400',
versandet: 'bg-gray-400',
abgelehnt: 'bg-red-400',
};
async function loadData() {
try {
const [dashRes, antraegeRes] = await Promise.all([
fetch(`${API_BASE}/stats/dashboard`),
fetch(`${API_BASE}/vorlagen?typ=antrag&page_size=10`),
]);
if (dashRes.ok) {
stats = await dashRes.json();
} else {
error = `Health check failed: ${statsRes.status}`;
error = `Dashboard-Stats fehler: ${dashRes.status}`;
}
// Letzte 10 Anträge laden
const antraegeRes = await fetch(`${API_BASE}/vorlagen?typ=antrag&page_size=10`);
console.log('Antraege response:', antraegeRes.status);
if (antraegeRes.ok) {
const data = await antraegeRes.json();
console.log('Antraege data:', data.items.length);
antraege = data.items;
}
} catch (e) {
console.error('API Fehler:', e);
error = `Fehler: ${e}`;
} finally {
loading = false;
console.log('Loading done, antraege:', antraege.length);
}
}
@ -76,70 +124,178 @@
<title>Antragstracker Hagen</title>
</svelte:head>
<main class="min-h-screen bg-gray-50">
<!-- Header -->
<header class="bg-green-700 text-white py-6 shadow-lg">
<div class="max-w-6xl mx-auto px-4">
<h1 class="text-2xl sm:text-3xl font-bold">🏛️ Antragstracker Hagen</h1>
<p class="text-green-100 mt-1">Kommunale Anträge & Anfragen nachverfolgen</p>
</div>
</header>
<div class="mb-6">
<h1 class="text-2xl font-bold text-gray-900">🏛️ Dashboard</h1>
<p class="text-gray-500 text-sm mt-1">Kommunale Anträge & Anfragen auf einen Blick</p>
</div>
<div class="max-w-6xl mx-auto px-4 py-8">
<!-- Stats Cards -->
{#if error}
<div class="bg-red-50 text-red-700 p-4 rounded-lg mb-6">{error}</div>
{/if}
{#if loading}
<div class="flex justify-center py-20">
<div class="animate-spin rounded-full h-12 w-12 border-b-2 border-green-600"></div>
</div>
{:else if stats}
<!-- Hauptzahlen -->
<div class="grid grid-cols-2 md:grid-cols-4 gap-4 mb-8">
<div class="bg-white rounded-lg shadow p-4 text-center">
<div class="text-3xl font-bold text-green-600">{stats.vorlagen.toLocaleString()}</div>
<div class="text-gray-500 text-sm">Vorlagen</div>
</div>
<div class="bg-white rounded-lg shadow p-4 text-center">
<div class="text-3xl font-bold text-blue-600">{stats.ketten.toLocaleString()}</div>
<div class="text-gray-500 text-sm">Ketten</div>
</div>
<div class="bg-white rounded-lg shadow p-4 text-center">
<div class="text-3xl font-bold text-purple-600">41</div>
<div class="text-gray-500 text-sm">Gremien</div>
</div>
<div class="bg-white rounded-lg shadow p-4 text-center">
<button onclick={() => goto('/vorlagen')}
class="bg-white rounded-xl shadow-sm border border-gray-200 p-5 text-center cursor-pointer hover:shadow-md transition-shadow">
<div class="text-3xl font-bold text-green-600">{stats.vorlagen_total.toLocaleString()}</div>
<div class="text-gray-500 text-sm mt-1">Vorlagen</div>
</button>
<button onclick={() => goto('/ketten')}
class="bg-white rounded-xl shadow-sm border border-gray-200 p-5 text-center cursor-pointer hover:shadow-md transition-shadow">
<div class="text-3xl font-bold text-blue-600">{stats.ketten_total.toLocaleString()}</div>
<div class="text-gray-500 text-sm mt-1">Ketten</div>
</button>
<button onclick={() => goto('/abstimmungen')}
class="bg-white rounded-xl shadow-sm border border-gray-200 p-5 text-center cursor-pointer hover:shadow-md transition-shadow">
<div class="text-3xl font-bold text-purple-600">{stats.abstimmungen_total.toLocaleString()}</div>
<div class="text-gray-500 text-sm mt-1">Abstimmungen</div>
</button>
<div class="bg-white rounded-xl shadow-sm border border-gray-200 p-5 text-center">
<div class="text-3xl font-bold text-orange-600">20042026</div>
<div class="text-gray-500 text-sm">Zeitraum</div>
<div class="text-gray-500 text-sm mt-1">Zeitraum</div>
</div>
</div>
<!-- Vorlagen nach Typ -->
<section class="bg-white rounded-xl shadow-sm border border-gray-200 p-5 mb-8">
<h2 class="text-lg font-semibold text-gray-900 mb-4">📊 Vorlagen nach Typ</h2>
<div class="grid grid-cols-2 md:grid-cols-4 gap-3">
{#each stats.vorlagen_nach_typ as vt}
<button onclick={() => goto(`/vorlagen?typ=${vt.typ}`)}
class="border border-gray-200 rounded-lg p-4 text-left cursor-pointer hover:shadow-md hover:border-green-300 transition-all group">
<div class="text-2xl mb-1">{typIcons[vt.typ] || '📁'}</div>
<div class="text-xl font-bold text-gray-900 group-hover:text-green-700">{vt.anzahl.toLocaleString()}</div>
<div class="text-sm text-gray-500">{typLabels[vt.typ] || vt.typ}</div>
</button>
{/each}
</div>
</section>
<!-- Ketten nach Status -->
<section class="bg-white rounded-xl shadow-sm border border-gray-200 p-5 mb-8">
<h2 class="text-lg font-semibold text-gray-900 mb-4">🔗 Ketten nach Status</h2>
<div class="grid grid-cols-2 md:grid-cols-4 gap-3">
{#each stats.ketten_nach_status as ks}
<button onclick={() => goto(`/ketten?status=${ks.status}`)}
class="border rounded-lg p-4 text-left cursor-pointer hover:shadow-md transition-all {statusColors[ks.status] || 'bg-gray-50 text-gray-700 border-gray-200'}">
<div class="text-xl font-bold">{ks.anzahl.toLocaleString()}</div>
<div class="text-sm opacity-80">{statusLabels[ks.status] || ks.status}</div>
</button>
{/each}
</div>
</section>
<!-- Umsetzungsquote -->
{#if stats.umsetzungsquote.total_bewertet > 0}
{@const uq = stats.umsetzungsquote}
<section class="bg-white rounded-xl shadow-sm border border-gray-200 p-5 mb-8">
<h2 class="text-lg font-semibold text-gray-900 mb-1">📈 Umsetzungsquote</h2>
<p class="text-sm text-gray-500 mb-4">{uq.total_bewertet} Ketten mit Endergebnis</p>
<!-- Bar -->
<div class="flex rounded-full overflow-hidden h-8 mb-4">
{#if uq.umgesetzt > 0}
<button onclick={() => goto('/ketten?status=umgesetzt')}
class="{umsetzungBarColors.umgesetzt} hover:brightness-110 transition-all cursor-pointer flex items-center justify-center text-white text-xs font-medium"
style="width: {uq.umgesetzt / uq.total_bewertet * 100}%"
title="Umgesetzt: {uq.umgesetzt}">
{#if uq.umgesetzt / uq.total_bewertet > 0.05}{uq.umgesetzt}{/if}
</button>
{/if}
{#if uq.teilweise > 0}
<button onclick={() => goto('/ketten?status=teilweise_umgesetzt')}
class="{umsetzungBarColors.teilweise} hover:brightness-110 transition-all cursor-pointer flex items-center justify-center text-white text-xs font-medium"
style="width: {uq.teilweise / uq.total_bewertet * 100}%"
title="Teilweise umgesetzt: {uq.teilweise}">
{#if uq.teilweise / uq.total_bewertet > 0.05}{uq.teilweise}{/if}
</button>
{/if}
{#if uq.beschlossen > 0}
<button onclick={() => goto('/ketten?status=beschlossen')}
class="{umsetzungBarColors.beschlossen} hover:brightness-110 transition-all cursor-pointer flex items-center justify-center text-white text-xs font-medium"
style="width: {uq.beschlossen / uq.total_bewertet * 100}%"
title="Beschlossen: {uq.beschlossen}">
{#if uq.beschlossen / uq.total_bewertet > 0.05}{uq.beschlossen}{/if}
</button>
{/if}
{#if uq.versandet > 0}
<button onclick={() => goto('/ketten?status=versandet')}
class="{umsetzungBarColors.versandet} hover:brightness-110 transition-all cursor-pointer flex items-center justify-center text-white text-xs font-medium"
style="width: {uq.versandet / uq.total_bewertet * 100}%"
title="Versandet: {uq.versandet}">
{#if uq.versandet / uq.total_bewertet > 0.05}{uq.versandet}{/if}
</button>
{/if}
{#if uq.abgelehnt > 0}
<button onclick={() => goto('/ketten?status=abgelehnt')}
class="{umsetzungBarColors.abgelehnt} hover:brightness-110 transition-all cursor-pointer flex items-center justify-center text-white text-xs font-medium"
style="width: {uq.abgelehnt / uq.total_bewertet * 100}%"
title="Abgelehnt: {uq.abgelehnt}">
{#if uq.abgelehnt / uq.total_bewertet > 0.05}{uq.abgelehnt}{/if}
</button>
{/if}
</div>
<!-- Legend -->
<div class="flex flex-wrap gap-4 text-sm">
<span class="flex items-center gap-1.5">
<span class="w-3 h-3 rounded-full bg-green-500"></span>
Umgesetzt ({uq.umgesetzt})
</span>
<span class="flex items-center gap-1.5">
<span class="w-3 h-3 rounded-full bg-amber-400"></span>
Teilweise ({uq.teilweise})
</span>
<span class="flex items-center gap-1.5">
<span class="w-3 h-3 rounded-full bg-blue-400"></span>
Beschlossen ({uq.beschlossen})
</span>
<span class="flex items-center gap-1.5">
<span class="w-3 h-3 rounded-full bg-gray-400"></span>
Versandet ({uq.versandet})
</span>
<span class="flex items-center gap-1.5">
<span class="w-3 h-3 rounded-full bg-red-400"></span>
Abgelehnt ({uq.abgelehnt})
</span>
</div>
</section>
{/if}
<!-- Aktuelle Anträge -->
<section class="bg-white rounded-lg shadow">
<div class="px-6 py-4 border-b border-gray-200">
<h2 class="text-xl font-semibold text-gray-800">📋 Aktuelle Anträge</h2>
<section class="bg-white rounded-xl shadow-sm border border-gray-200">
<div class="px-5 py-4 border-b border-gray-200 flex items-center justify-between">
<h2 class="text-lg font-semibold text-gray-900">📋 Aktuelle Anträge</h2>
<a href="/vorlagen?typ=antrag" class="text-sm text-green-600 hover:text-green-800 font-medium">Alle →</a>
</div>
{#if error}
<div class="p-6 text-center text-red-500">{error}</div>
{:else if loading}
<div class="p-6 text-center text-gray-500">Lade Daten... (API: {API_BASE})</div>
{:else if antraege.length === 0}
{#if antraege.length === 0}
<div class="p-6 text-center text-gray-500">Keine Anträge gefunden</div>
{:else}
<ul class="divide-y divide-gray-100">
{#each antraege as antrag}
<li class="px-6 py-4 hover:bg-gray-50 cursor-pointer">
<li>
<a href="/vorlagen/{antrag.id}" class="block px-5 py-4 hover:bg-gray-50 transition-colors">
<div class="flex justify-between items-start">
<div class="flex-1">
<div class="flex items-center gap-2">
<div class="flex-1 min-w-0">
<div class="flex items-center gap-2 flex-wrap">
<span class="font-mono text-sm text-green-700 bg-green-50 px-2 py-0.5 rounded">
{antrag.aktenzeichen}
</span>
<span class="text-xs text-gray-400">{antrag.datum_eingang}</span>
</div>
<p class="mt-1 text-gray-700 line-clamp-2">{antrag.betreff}</p>
<p class="mt-1 text-gray-700 text-sm line-clamp-2">{antrag.betreff}</p>
</div>
<span class="text-xs px-2 py-1 rounded-full bg-yellow-100 text-yellow-800">
⏳ offen
</span>
</div>
</a>
</li>
{/each}
</ul>
{/if}
</section>
</div>
</main>
{/if}

View File

@ -1,5 +1,6 @@
<script lang="ts">
import { onMount } from 'svelte';
import { goto } from '$app/navigation';
interface FraktionStats {
fraktion: string;
@ -21,11 +22,52 @@
uebereinstimmung: Record<string, Uebereinstimmung>;
}
interface AbstimmungDetail {
id: number;
sitzung_datum: string | null;
ergebnis: string | null;
vorlage_id: number;
aktenzeichen: string | null;
betreff: string | null;
fraktion: string;
stimme: string;
anzahl: number | null;
}
interface VergleichItem {
id: number;
sitzung_datum: string | null;
ergebnis: string | null;
vorlage_id: number;
aktenzeichen: string | null;
betreff: string | null;
stimme_f1: string;
anzahl_f1: number | null;
stimme_f2: string;
anzahl_f2: number | null;
}
let fraktionen = $state<FraktionStats[]>([]);
let koalitionsmatrix = $state<KoalitionsRow[]>([]);
let loading = $state(true);
let error = $state('');
// Filter state for detail view
let selectedFraktion = $state('');
let selectedStimme = $state('');
let detailItems = $state<AbstimmungDetail[]>([]);
let detailTotal = $state(0);
let detailPage = $state(1);
let detailLoading = $state(false);
// Vergleich state
let vergleichF1 = $state('');
let vergleichF2 = $state('');
let vergleichItems = $state<VergleichItem[]>([]);
let vergleichTotal = $state(0);
let vergleichPage = $state(1);
let vergleichLoading = $state(false);
const API_BASE = typeof window !== 'undefined'
? (window.location.port === '5173'
? `http://${window.location.hostname}:8099/api`
@ -48,6 +90,76 @@
}
});
async function loadDetails(fraktion: string, stimme: string, page: number = 1) {
selectedFraktion = fraktion;
selectedStimme = stimme;
detailPage = page;
detailLoading = true;
try {
const params = new URLSearchParams();
if (fraktion) params.set('fraktion', fraktion);
if (stimme) params.set('stimme', stimme);
params.set('page', String(page));
params.set('page_size', '20');
const res = await fetch(`${API_BASE}/abstimmungen/details?${params}`);
if (res.ok) {
const data = await res.json();
detailItems = data.items;
detailTotal = data.total;
}
} catch (e) {
console.error('Detail-Fehler:', e);
} finally {
detailLoading = false;
}
// Scroll to detail section
setTimeout(() => {
document.getElementById('detail-section')?.scrollIntoView({ behavior: 'smooth' });
}, 100);
}
async function loadVergleich(f1: string, f2: string, page: number = 1) {
vergleichF1 = f1;
vergleichF2 = f2;
vergleichPage = page;
vergleichLoading = true;
try {
const params = new URLSearchParams({ f1, f2, page: String(page), page_size: '20' });
const res = await fetch(`${API_BASE}/abstimmungen/vergleich?${params}`);
if (res.ok) {
const data = await res.json();
vergleichItems = data.items;
vergleichTotal = data.total;
}
} catch (e) {
console.error('Vergleich-Fehler:', e);
} finally {
vergleichLoading = false;
}
setTimeout(() => {
document.getElementById('vergleich-section')?.scrollIntoView({ behavior: 'smooth' });
}, 100);
}
function clearDetail() {
selectedFraktion = '';
selectedStimme = '';
detailItems = [];
detailTotal = 0;
}
function clearVergleich() {
vergleichF1 = '';
vergleichF2 = '';
vergleichItems = [];
vergleichTotal = 0;
}
function getColor(quote: number): string {
if (quote >= 90) return 'bg-green-500';
if (quote >= 70) return 'bg-green-400';
@ -59,6 +171,12 @@
function getTextColor(quote: number): string {
return quote >= 50 ? 'text-white' : 'text-gray-900';
}
function stimmeColor(stimme: string): string {
if (stimme === 'ja') return 'text-green-700 bg-green-50';
if (stimme === 'nein') return 'text-red-700 bg-red-50';
return 'text-yellow-700 bg-yellow-50';
}
</script>
<svelte:head>
@ -82,6 +200,7 @@
<!-- Fraktionen Übersicht -->
<section class="bg-white rounded-xl shadow-sm border border-gray-200 p-4 sm:p-6 mb-8">
<h2 class="text-lg font-semibold text-gray-900 mb-4">📊 Stimmverhalten nach Fraktion</h2>
<p class="text-sm text-gray-500 mb-4">Klicke auf eine Fraktion oder Zelle, um die Abstimmungen zu sehen.</p>
<!-- Desktop Table -->
<div class="hidden md:block overflow-x-auto">
@ -99,10 +218,30 @@
<tbody class="divide-y divide-gray-100">
{#each fraktionen as f}
<tr class="hover:bg-gray-50">
<td class="px-4 py-3 font-medium text-gray-900">{f.fraktion}</td>
<td class="px-4 py-3 text-center text-green-600 font-medium">{f.ja}</td>
<td class="px-4 py-3 text-center text-red-600 font-medium">{f.nein}</td>
<td class="px-4 py-3 text-center text-yellow-600 font-medium">{f.enthaltung}</td>
<td class="px-4 py-3">
<button onclick={() => loadDetails(f.fraktion, '')}
class="font-medium text-gray-900 hover:text-green-700 hover:underline cursor-pointer">
{f.fraktion}
</button>
</td>
<td class="px-4 py-3 text-center">
<button onclick={() => loadDetails(f.fraktion, 'ja')}
class="text-green-600 font-medium hover:bg-green-100 px-2 py-1 rounded cursor-pointer transition-colors">
{f.ja}
</button>
</td>
<td class="px-4 py-3 text-center">
<button onclick={() => loadDetails(f.fraktion, 'nein')}
class="text-red-600 font-medium hover:bg-red-100 px-2 py-1 rounded cursor-pointer transition-colors">
{f.nein}
</button>
</td>
<td class="px-4 py-3 text-center">
<button onclick={() => loadDetails(f.fraktion, 'enthaltung')}
class="text-yellow-600 font-medium hover:bg-yellow-100 px-2 py-1 rounded cursor-pointer transition-colors">
{f.enthaltung}
</button>
</td>
<td class="px-4 py-3 text-center text-gray-600">{f.gesamt}</td>
<td class="px-4 py-3">
<div class="flex items-center gap-2">
@ -123,25 +262,28 @@
{#each fraktionen as f}
<div class="border border-gray-200 rounded-lg p-4">
<div class="flex items-center justify-between mb-3">
<span class="font-medium text-gray-900">{f.fraktion}</span>
<button onclick={() => loadDetails(f.fraktion, '')}
class="font-medium text-gray-900 hover:text-green-700 hover:underline cursor-pointer">
{f.fraktion}
</button>
<span class="text-sm font-medium text-gray-600">{f.ja_quote}%</span>
</div>
<div class="bg-gray-200 rounded-full h-2.5 mb-3">
<div class="bg-green-500 h-2.5 rounded-full" style="width: {f.ja_quote}%"></div>
</div>
<div class="grid grid-cols-4 gap-2 text-center text-xs">
<div>
<button onclick={() => loadDetails(f.fraktion, 'ja')} class="cursor-pointer hover:bg-green-50 rounded p-1 transition-colors">
<div class="font-medium text-green-600">{f.ja}</div>
<div class="text-gray-500">Ja</div>
</div>
<div>
</button>
<button onclick={() => loadDetails(f.fraktion, 'nein')} class="cursor-pointer hover:bg-red-50 rounded p-1 transition-colors">
<div class="font-medium text-red-600">{f.nein}</div>
<div class="text-gray-500">Nein</div>
</div>
<div>
</button>
<button onclick={() => loadDetails(f.fraktion, 'enthaltung')} class="cursor-pointer hover:bg-yellow-50 rounded p-1 transition-colors">
<div class="font-medium text-yellow-600">{f.enthaltung}</div>
<div class="text-gray-500">Enth.</div>
</div>
</button>
<div>
<div class="font-medium text-gray-600">{f.gesamt}</div>
<div class="text-gray-500">Gesamt</div>
@ -152,10 +294,99 @@
</div>
</section>
<!-- Gefilterte Abstimmungen (Detail) -->
{#if selectedFraktion}
<section id="detail-section" class="bg-white rounded-xl shadow-sm border border-gray-200 p-4 sm:p-6 mb-8">
<div class="flex items-center justify-between mb-4">
<div>
<h2 class="text-lg font-semibold text-gray-900">
🔍 {selectedFraktion}{selectedStimme ? ` — ${selectedStimme}` : ''}
</h2>
<p class="text-sm text-gray-500">{detailTotal} Abstimmungen</p>
</div>
<button onclick={clearDetail}
class="text-sm text-gray-500 hover:text-gray-700 border border-gray-300 rounded-lg px-3 py-1.5 hover:bg-gray-50 transition-colors">
✕ Schließen
</button>
</div>
{#if detailLoading}
<div class="flex justify-center py-8">
<div class="animate-spin rounded-full h-8 w-8 border-b-2 border-green-600"></div>
</div>
{:else if detailItems.length === 0}
<p class="text-gray-500 py-4">Keine Abstimmungen gefunden.</p>
{:else}
<!-- Desktop -->
<div class="hidden md:block overflow-x-auto">
<table class="w-full text-sm">
<thead class="bg-gray-50">
<tr>
<th class="px-3 py-2 text-left text-xs font-medium text-gray-500 uppercase">Datum</th>
<th class="px-3 py-2 text-left text-xs font-medium text-gray-500 uppercase">Aktenzeichen</th>
<th class="px-3 py-2 text-left text-xs font-medium text-gray-500 uppercase">Betreff</th>
<th class="px-3 py-2 text-center text-xs font-medium text-gray-500 uppercase">Stimme</th>
<th class="px-3 py-2 text-left text-xs font-medium text-gray-500 uppercase">Ergebnis</th>
</tr>
</thead>
<tbody class="divide-y divide-gray-100">
{#each detailItems as item}
<tr class="hover:bg-gray-50 cursor-pointer" onclick={() => goto(`/vorlagen/${item.vorlage_id}`)}>
<td class="px-3 py-2 text-gray-500 whitespace-nowrap">{item.sitzung_datum || ''}</td>
<td class="px-3 py-2">
<span class="font-mono text-green-700 text-xs bg-green-50 px-1.5 py-0.5 rounded">{item.aktenzeichen || ''}</span>
</td>
<td class="px-3 py-2 text-gray-700 max-w-md truncate">{item.betreff || ''}</td>
<td class="px-3 py-2 text-center">
<span class="px-2 py-0.5 rounded text-xs font-medium {stimmeColor(item.stimme)}">{item.stimme}</span>
</td>
<td class="px-3 py-2 text-gray-600 max-w-xs truncate">{item.ergebnis || ''}</td>
</tr>
{/each}
</tbody>
</table>
</div>
<!-- Mobile Cards -->
<div class="md:hidden space-y-2">
{#each detailItems as item}
<a href="/vorlagen/{item.vorlage_id}" class="block border border-gray-200 rounded-lg p-3 hover:shadow-sm transition-shadow">
<div class="flex items-center justify-between mb-1">
<span class="font-mono text-xs text-green-700 bg-green-50 px-1.5 py-0.5 rounded">{item.aktenzeichen || ''}</span>
<span class="px-2 py-0.5 rounded text-xs font-medium {stimmeColor(item.stimme)}">{item.stimme}</span>
</div>
<p class="text-sm text-gray-700 line-clamp-2">{item.betreff || ''}</p>
<div class="flex justify-between text-xs text-gray-500 mt-1">
<span>{item.sitzung_datum || ''}</span>
<span class="truncate ml-2">{item.ergebnis || ''}</span>
</div>
</a>
{/each}
</div>
<!-- Pagination -->
{#if detailTotal > 20}
{@const totalPages = Math.ceil(detailTotal / 20)}
<div class="flex justify-center mt-4 space-x-2">
<button disabled={detailPage <= 1} onclick={() => loadDetails(selectedFraktion, selectedStimme, detailPage - 1)}
class="px-3 py-2 rounded-lg text-sm border border-gray-300 hover:bg-gray-50 disabled:opacity-50 disabled:cursor-not-allowed">
« Zurück
</button>
<span class="px-3 py-2 text-sm text-gray-600">Seite {detailPage} von {totalPages}</span>
<button disabled={detailPage >= totalPages} onclick={() => loadDetails(selectedFraktion, selectedStimme, detailPage + 1)}
class="px-3 py-2 rounded-lg text-sm border border-gray-300 hover:bg-gray-50 disabled:opacity-50 disabled:cursor-not-allowed">
Weiter »
</button>
</div>
{/if}
{/if}
</section>
{/if}
<!-- Koalitionsmatrix -->
<section class="bg-white rounded-xl shadow-sm border border-gray-200 p-4 sm:p-6">
<h2 class="text-lg font-semibold text-gray-900 mb-4">🤝 Koalitionsmatrix</h2>
<p class="text-sm text-gray-500 mb-4">Wie oft stimmen Fraktionen gleich ab? (nur Ja/Nein-Stimmen)</p>
<p class="text-sm text-gray-500 mb-4">Wie oft stimmen Fraktionen gleich ab? Klicke auf eine Zelle für Details.</p>
{#if koalitionsmatrix.length > 0}
{@const allFraktionen = koalitionsmatrix.map(r => r.fraktion).sort()}
@ -185,10 +416,11 @@
{:else if row.uebereinstimmung[f2]}
{@const data = row.uebereinstimmung[f2]}
<td class="p-1">
<div class="w-10 h-10 {getColor(data.quote)} {getTextColor(data.quote)} rounded flex items-center justify-center font-medium"
<button onclick={() => loadVergleich(row.fraktion, f2)}
class="w-10 h-10 {getColor(data.quote)} {getTextColor(data.quote)} rounded flex items-center justify-center font-medium cursor-pointer hover:ring-2 hover:ring-offset-1 hover:ring-green-500 transition-all"
title="{row.fraktion} & {f2}: {data.gleich}/{data.gesamt} ({data.quote}%)">
{Math.round(data.quote)}
</div>
</button>
</td>
{:else}
<td class="p-1">
@ -216,4 +448,97 @@
<p class="text-gray-500">Noch keine Koalitionsdaten verfügbar.</p>
{/if}
</section>
<!-- Fraktionsvergleich -->
{#if vergleichF1 && vergleichF2}
<section id="vergleich-section" class="bg-white rounded-xl shadow-sm border border-gray-200 p-4 sm:p-6 mt-8">
<div class="flex items-center justify-between mb-4">
<div>
<h2 class="text-lg font-semibold text-gray-900">
⚖️ {vergleichF1} vs. {vergleichF2}
</h2>
<p class="text-sm text-gray-500">{vergleichTotal} gemeinsame Abstimmungen</p>
</div>
<button onclick={clearVergleich}
class="text-sm text-gray-500 hover:text-gray-700 border border-gray-300 rounded-lg px-3 py-1.5 hover:bg-gray-50 transition-colors">
✕ Schließen
</button>
</div>
{#if vergleichLoading}
<div class="flex justify-center py-8">
<div class="animate-spin rounded-full h-8 w-8 border-b-2 border-green-600"></div>
</div>
{:else if vergleichItems.length === 0}
<p class="text-gray-500 py-4">Keine gemeinsamen Abstimmungen gefunden.</p>
{:else}
<!-- Desktop -->
<div class="hidden md:block overflow-x-auto">
<table class="w-full text-sm">
<thead class="bg-gray-50">
<tr>
<th class="px-3 py-2 text-left text-xs font-medium text-gray-500 uppercase">Datum</th>
<th class="px-3 py-2 text-left text-xs font-medium text-gray-500 uppercase">Aktenzeichen</th>
<th class="px-3 py-2 text-left text-xs font-medium text-gray-500 uppercase">Betreff</th>
<th class="px-3 py-2 text-center text-xs font-medium text-gray-500 uppercase">{vergleichF1}</th>
<th class="px-3 py-2 text-center text-xs font-medium text-gray-500 uppercase">{vergleichF2}</th>
<th class="px-3 py-2 text-left text-xs font-medium text-gray-500 uppercase">Ergebnis</th>
</tr>
</thead>
<tbody class="divide-y divide-gray-100">
{#each vergleichItems as item}
<tr class="hover:bg-gray-50 cursor-pointer" onclick={() => goto(`/vorlagen/${item.vorlage_id}`)}>
<td class="px-3 py-2 text-gray-500 whitespace-nowrap">{item.sitzung_datum || ''}</td>
<td class="px-3 py-2">
<span class="font-mono text-green-700 text-xs bg-green-50 px-1.5 py-0.5 rounded">{item.aktenzeichen || ''}</span>
</td>
<td class="px-3 py-2 text-gray-700 max-w-sm truncate">{item.betreff || ''}</td>
<td class="px-3 py-2 text-center">
<span class="px-2 py-0.5 rounded text-xs font-medium {stimmeColor(item.stimme_f1)}">{item.stimme_f1}</span>
</td>
<td class="px-3 py-2 text-center">
<span class="px-2 py-0.5 rounded text-xs font-medium {stimmeColor(item.stimme_f2)}">{item.stimme_f2}</span>
</td>
<td class="px-3 py-2 text-gray-600 max-w-xs truncate">{item.ergebnis || ''}</td>
</tr>
{/each}
</tbody>
</table>
</div>
<!-- Mobile Cards -->
<div class="md:hidden space-y-2">
{#each vergleichItems as item}
<a href="/vorlagen/{item.vorlage_id}" class="block border border-gray-200 rounded-lg p-3 hover:shadow-sm transition-shadow">
<div class="flex items-center justify-between mb-1">
<span class="font-mono text-xs text-green-700 bg-green-50 px-1.5 py-0.5 rounded">{item.aktenzeichen || ''}</span>
<span class="text-xs text-gray-500">{item.sitzung_datum || ''}</span>
</div>
<p class="text-sm text-gray-700 line-clamp-2 mb-2">{item.betreff || ''}</p>
<div class="flex items-center gap-3 text-xs">
<span>{vergleichF1}: <span class="font-medium {stimmeColor(item.stimme_f1)} px-1.5 py-0.5 rounded">{item.stimme_f1}</span></span>
<span>{vergleichF2}: <span class="font-medium {stimmeColor(item.stimme_f2)} px-1.5 py-0.5 rounded">{item.stimme_f2}</span></span>
</div>
</a>
{/each}
</div>
<!-- Pagination -->
{#if vergleichTotal > 20}
{@const totalPages = Math.ceil(vergleichTotal / 20)}
<div class="flex justify-center mt-4 space-x-2">
<button disabled={vergleichPage <= 1} onclick={() => loadVergleich(vergleichF1, vergleichF2, vergleichPage - 1)}
class="px-3 py-2 rounded-lg text-sm border border-gray-300 hover:bg-gray-50 disabled:opacity-50 disabled:cursor-not-allowed">
« Zurück
</button>
<span class="px-3 py-2 text-sm text-gray-600">Seite {vergleichPage} von {totalPages}</span>
<button disabled={vergleichPage >= totalPages} onclick={() => loadVergleich(vergleichF1, vergleichF2, vergleichPage + 1)}
class="px-3 py-2 rounded-lg text-sm border border-gray-300 hover:bg-gray-50 disabled:opacity-50 disabled:cursor-not-allowed">
Weiter »
</button>
</div>
{/if}
{/if}
</section>
{/if}
{/if}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +0,0 @@
import{a5 as l,a6 as o,a7 as u,a8 as n,a9 as d,B as m,F as p,a4 as _,aa as v,ab as b}from"./Cjw4vZKn.js";class w{anchor;#t=new Map;#s=new Map;#e=new Map;#i=new Set;#a=!0;constructor(t,s=!0){this.anchor=t,this.#a=s}#f=t=>{if(this.#t.has(t)){var s=this.#t.get(t),e=this.#s.get(s);if(e)l(e),this.#i.delete(s);else{var a=this.#e.get(s);a&&(this.#s.set(s,a.effect),this.#e.delete(s),a.fragment.lastChild.remove(),this.anchor.before(a.fragment),e=a.effect)}for(const[i,f]of this.#t){if(this.#t.delete(i),i===t)break;const r=this.#e.get(f);r&&(o(r.effect),this.#e.delete(f))}for(const[i,f]of this.#s){if(i===s||this.#i.has(i))continue;const r=()=>{if(Array.from(this.#t.values()).includes(i)){var c=document.createDocumentFragment();v(f,c),c.append(n()),this.#e.set(i,{effect:f,fragment:c})}else o(f);this.#i.delete(i),this.#s.delete(i)};this.#a||!e?(this.#i.add(i),u(f,r,!1)):r()}}};#r=t=>{this.#t.delete(t);const s=Array.from(this.#t.values());for(const[e,a]of this.#e)s.includes(e)||(o(a.effect),this.#e.delete(e))};ensure(t,s){var e=m,a=b();if(s&&!this.#s.has(t)&&!this.#e.has(t))if(a){var i=document.createDocumentFragment(),f=n();i.append(f),this.#e.set(t,{effect:d(()=>s(f)),fragment:i})}else this.#s.set(t,d(()=>s(this.anchor)));if(this.#t.set(e,t),a){for(const[r,h]of this.#s)r===t?e.unskip_effect(h):e.skip_effect(h);for(const[r,h]of this.#e)r===t?e.unskip_effect(h.effect):e.skip_effect(h.effect);e.oncommit(this.#f),e.ondiscard(this.#r)}else p&&(this.anchor=_),this.#f(e)}}export{w as B};

View File

@ -0,0 +1 @@
import{N as i,R as n,T as d,U as v,V as u,W as h,X as l,Y as g}from"./reyx9_7L.js";const A=Symbol("is custom element"),N=Symbol("is html"),T=g?"link":"LINK";function M(r){if(i){var s=!1,e=()=>{if(!s){if(s=!0,r.hasAttribute("value")){var t=r.value;_(r,"value",null),r.value=t}if(r.hasAttribute("checked")){var o=r.checked;_(r,"checked",null),r.checked=o}}};r.__on_r=e,v(e),u()}}function _(r,s,e,t){var o=m(r);i&&(o[s]=r.getAttribute(s),s==="src"||s==="srcset"||s==="href"&&r.nodeName===T)||o[s]!==(o[s]=e)&&(s==="loading"&&(r[h]=e),e==null?r.removeAttribute(s):typeof e!="string"&&p(r).includes(s)?r[s]=e:r.setAttribute(s,e))}function m(r){return r.__attributes??={[A]:r.nodeName.includes("-"),[N]:r.namespaceURI===n}}var c=new Map;function p(r){var s=r.getAttribute("is")||r.nodeName,e=c.get(s);if(e)return e;c.set(s,e=[]);for(var t,o=r,f=Element.prototype;f!==o;){t=l(o);for(var a in t)t[a].set&&e.push(a);o=d(o)}return e}export{M as r,_ as s};

View File

@ -1 +0,0 @@
import{i as A,j as L,P as D,g as P,p as T,a as b,k as B,l as Y,D as x,m as M,o as N,q as U,v as h,w as q,x as w,y as z,z as $,S as j,L as y}from"./DAfY0XTB.js";import{c as C}from"./splFp8Bu.js";function F(r,a,t,s){var f=!U||(t&h)!==0,v=(t&M)!==0,E=(t&$)!==0,n=s,S=!0,g=()=>(S&&(S=!1,n=E?N(s):s),n);let u;if(v){var O=j in r||y in r;u=A(r,a)?.set??(O&&a in r?e=>r[a]=e:void 0)}var _,I=!1;v?[_,I]=C(()=>r[a]):_=r[a],_===void 0&&s!==void 0&&(_=g(),u&&(f&&L(),u(_)));var i;if(f?i=()=>{var e=r[a];return e===void 0?g():(S=!0,e)}:i=()=>{var e=r[a];return e!==void 0&&(n=void 0),e===void 0?n:e},f&&(t&D)===0)return i;if(u){var R=r.$$legacy;return(function(e,l){return arguments.length>0?((!f||!l||R||I)&&u(l?i():e),e):i()})}var c=!1,d=((t&q)!==0?w:z)(()=>(c=!1,i()));v&&P(d);var m=Y;return(function(e,l){if(arguments.length>0){const o=l?P(d):f&&v?T(e):e;return b(d,o),c=!0,n!==void 0&&(n=o),e}return B&&c||(m.f&x)!==0?d.v:P(d)})}export{F as p};

View File

@ -1,2 +0,0 @@
const e=[...`
\r\f \v\uFEFF`];function o(t,f,u){var n=t==null?"":""+t;if(f&&(n=n?n+" "+f:f),u){for(var s of Object.keys(u))if(u[s])n=n?n+" "+s:s;else if(n.length)for(var i=s.length,l=0;(l=n.indexOf(s,l))>=0;){var r=l+i;(l===0||e.includes(n[l-1]))&&(r===n.length||e.includes(n[r]))?n=(l===0?"":n.substring(0,l))+n.substring(r+1):l=r}}return n===""?null:n}function c(t,f){return t==null?null:String(t)}export{o as a,c as t};

View File

@ -0,0 +1 @@
import{J as O,aM as y,aL as E,aQ as S,l as m,C as A,U as P,b1 as C,a7 as R,ae as g,_ as h,b2 as D,b3 as H,b4 as I,N as d,a2 as u,b5 as W,a0 as k,b6 as B,Z as U,b7 as $}from"./reyx9_7L.js";const f=Symbol("events"),q=new Set,F=new Set;function j(e,r,t,i={}){function n(a){if(i.capture||G.call(r,a),!a.cancelBubble)return C(()=>t?.call(this,a))}return e.startsWith("pointer")||e.startsWith("touch")||e==="wheel"?P(()=>{r.addEventListener(e,n,i)}):r.addEventListener(e,n,i),n}function z(e,r,t,i,n){var a={capture:i,passive:n},s=j(e,r,t,a);(r===document.body||r===window||r===document||r instanceof HTMLMediaElement)&&A(()=>{r.removeEventListener(e,s,a)})}function K(e,r,t){(r[f]??={})[e]=t}function Y(e){for(var r=0;r<e.length;r++)q.add(e[r]);for(var t of F)t(e)}let L=null;function G(e){var r=this,t=r.ownerDocument,i=e.type,n=e.composedPath?.()||[],a=n[0]||e.target;L=e;var s=0,c=L===e&&e[f];if(c){var o=n.indexOf(c);if(o!==-1&&(r===document||r===window)){e[f]=r;return}var b=n.indexOf(r);if(b===-1)return;o<=b&&(s=o)}if(a=n[s]||e.target,a!==r){O(e,"currentTarget",{configurable:!0,get(){return a||t}});var N=S,x=m;y(null),E(null);try{for(var _,w=[];a!==null;){var p=a.assignedSlot||a.parentNode||a.host||null;try{var T=a[f]?.[i];T!=null&&(!a.disabled||e.target===a)&&T.call(a,e)}catch(v){_?w.push(v):_=v}if(e.cancelBubble||p===r||p===null)break;a=p}if(_){for(let v of w)queueMicrotask(()=>{throw v});throw _}}finally{e[f]=r,delete e.currentTarget,y(N),E(x)}}}const J=globalThis?.window?.trustedTypes&&globalThis.window.trustedTypes.createPolicy("svelte-trusted-html",{createHTML:e=>e});function Q(e){return J?.createHTML(e)??e}function M(e){var r=R("template");return r.innerHTML=Q(e.replaceAll("<!>","<!---->")),r.content}function l(e,r){var t=m;t.nodes===null&&(t.nodes={start:e,end:r,a:null,t:null})}function ee(e,r){var t=(r&H)!==0,i=(r&I)!==0,n,a=!e.startsWith("<!>");return()=>{if(d)return l(u,null),u;n===void 0&&(n=M(a?e:"<!>"+e),t||(n=h(n)));var s=i||D?document.importNode(n,!0):n.cloneNode(!0);if(t){var c=h(s),o=s.lastChild;l(c,o)}else l(s,s);return s}}function V(e,r,t="svg"){var i=!e.startsWith("<!>"),n=`<${t}>${i?e:"<!>"+e}</${t}>`,a;return()=>{if(d)return l(u,null),u;if(!a){var s=M(n),c=h(s);a=h(c)}var o=a.cloneNode(!0);return l(o,o),o}}function re(e,r){return V(e,r,"svg")}function te(e=""){if(!d){var r=g(e+"");return l(r,r),r}var t=u;return t.nodeType!==B?(t.before(t=g()),U(t)):$(t),l(t,t),t}function ae(){if(d)return l(u,null),u;var e=document.createDocumentFragment(),r=document.createComment(""),t=g();return e.append(r,t),l(r,t),e}function ne(e,r){if(d){var t=m;((t.f&W)===0||t.nodes.end===null)&&(t.nodes.end=u),k();return}e!==null&&e.before(r)}const X="5";typeof window<"u"&&((window.__svelte??={}).v??=new Set).add(X);export{ne as a,K as b,ae as c,Y as d,l as e,ee as f,re as g,z as h,q as i,G as j,F as r,te as t};

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
import{A as s,B as v,e as o,G as c,H as b,I as m,J as h}from"./Cjw4vZKn.js";function d(e,r,f=!1){if(e.multiple){if(r==null)return;if(!b(r))return m();for(var a of e.options)a.selected=r.includes(i(a));return}for(a of e.options){var t=i(a);if(h(t,r)){a.selected=!0;return}}(!f||r!==void 0)&&(e.selectedIndex=-1)}function y(e){var r=new MutationObserver(()=>{d(e,e.__value)});r.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["value"]}),c(()=>{r.disconnect()})}function S(e,r,f=r){var a=new WeakSet,t=!0;s(e,"change",u=>{var l=u?"[selected]":":checked",n;if(e.multiple)n=[].map.call(e.querySelectorAll(l),i);else{var _=e.querySelector(l)??e.querySelector("option:not([disabled])");n=_&&i(_)}f(n),e.__value=n,v!==null&&a.add(v)}),o(()=>{var u=r();if(e===document.activeElement){var l=v;if(a.has(l))return}if(d(e,u,t),t&&u===void 0){var n=e.querySelector(":checked");n!==null&&(u=i(n),f(u))}e.__value=u,t=!1}),y(e)}function i(e){return"__value"in e?e.__value:e.value}export{S as b};
import{A as s,B as v,e as o,C as c,E as b,F as m,G as h}from"./reyx9_7L.js";function d(e,r,f=!1){if(e.multiple){if(r==null)return;if(!b(r))return m();for(var a of e.options)a.selected=r.includes(i(a));return}for(a of e.options){var t=i(a);if(h(t,r)){a.selected=!0;return}}(!f||r!==void 0)&&(e.selectedIndex=-1)}function y(e){var r=new MutationObserver(()=>{d(e,e.__value)});r.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["value"]}),c(()=>{r.disconnect()})}function S(e,r,f=r){var a=new WeakSet,t=!0;s(e,"change",u=>{var l=u?"[selected]":":checked",n;if(e.multiple)n=[].map.call(e.querySelectorAll(l),i);else{var _=e.querySelector(l)??e.querySelector("option:not([disabled])");n=_&&i(_)}f(n),e.__value=n,v!==null&&a.add(v)}),o(()=>{var u=r();if(e===document.activeElement){var l=v;if(a.has(l))return}if(d(e,u,t),t&&u===void 0){var n=e.querySelector(":checked");n!==null&&(u=i(n),f(u))}e.__value=u,t=!1}),y(e)}function i(e){return"__value"in e?e.__value:e.value}export{S as b};

View File

@ -1 +0,0 @@
import{ai as v,a8 as d,ac as u,aF as T,l,aG as p,aH as h,F as i,a4 as s,aI as E,Z as y,aJ as g,a2 as w,aK as N}from"./Cjw4vZKn.js";const M=globalThis?.window?.trustedTypes&&globalThis.window.trustedTypes.createPolicy("svelte-trusted-html",{createHTML:t=>t});function x(t){return M?.createHTML(t)??t}function A(t){var r=v("template");return r.innerHTML=x(t.replaceAll("<!>","<!---->")),r.content}function a(t,r){var e=l;e.nodes===null&&(e.nodes={start:t,end:r,a:null,t:null})}function I(t,r){var e=(r&p)!==0,f=(r&h)!==0,n,_=!t.startsWith("<!>");return()=>{if(i)return a(s,null),s;n===void 0&&(n=A(_?t:"<!>"+t),e||(n=u(n)));var o=f||T?document.importNode(n,!0):n.cloneNode(!0);if(e){var c=u(o),m=o.lastChild;a(c,m)}else a(o,o);return o}}function O(t=""){if(!i){var r=d(t+"");return a(r,r),r}var e=s;return e.nodeType!==g?(e.before(e=d()),w(e)):N(e),a(e,e),e}function P(){if(i)return a(s,null),s;var t=document.createDocumentFragment(),r=document.createComment(""),e=d();return t.append(r,e),a(r,e),t}function R(t,r){if(i){var e=l;((e.f&E)===0||e.nodes.end===null)&&(e.nodes.end=s),y();return}t!==null&&t.before(r)}const L="5";typeof window<"u"&&((window.__svelte??={}).v??=new Set).add(L);export{R as a,a as b,P as c,I as f,O as t};

View File

@ -1 +0,0 @@
import{Q as c,F as o,R as l,T as b,U as p,V as v,W as g,X as f,Y as m}from"./DAfY0XTB.js";import{B as y}from"./Duumi1XQ.js";function F(_,d,h=!1){var n;o&&(n=m,l());var s=new y(_),u=h?b:0;function t(a,r){if(o){var e=p(n);if(a!==parseInt(e.substring(1))){var i=v();g(i),s.anchor=i,f(!1),s.ensure(a,r),f(!0);return}}s.ensure(a,r)}c(()=>{var a=!1;d((r,e=0)=>{a=!0,t(e,r)}),a||t(-1,null)},u)}export{F as i};

View File

@ -0,0 +1,2 @@
import{aG as Q,g as W,Q as G,o as K,aH as C,U as R,ay as $,a2 as u,N as p,l as y,aI as H,ai as X,a0 as Z,aq as ee,aJ as M,af as c,ae as q,ad as D,B as V,ag as te,aK as se,aL as Y,aM as L,aN as P,aO as re,aP as ie,aQ as ne,ao as U,as as ae,ac as F,Z as N,n as he,al as fe,aR as E,aj as oe,aF as de,aS as _e,aT as le,aU as O,_ as ce,a3 as z,aV as ue,a4 as pe,a6 as x,am as b,aW as ge,aD as ve,aX as ye,av as me,p as Ee,ar as be,a5 as Te,c as Re}from"./reyx9_7L.js";import{i as Ne,r as j,j as B,e as Se}from"./B89f14j0.js";function we(r){let e=0,t=$(0),i;return()=>{Q()&&(W(t),G(()=>(e===0&&(i=K(()=>r(()=>C(t)))),e+=1,()=>{R(()=>{e-=1,e===0&&(i?.(),i=void 0,C(t))})})))}}var Ae=oe|de;function De(r,e,t,i){new Fe(r,e,t,i)}class Fe{parent;is_pending=!1;transform_error;#t;#u=p?u:null;#i;#o;#e;#n=null;#s=null;#r=null;#a=null;#d=0;#f=0;#_=!1;#p=new Set;#g=new Set;#h=null;#m=we(()=>(this.#h=$(this.#d),()=>{this.#h=null}));constructor(e,t,i,f){this.#t=e,this.#i=t,this.#o=s=>{var n=y;n.b=this,n.f|=H,i(s)},this.parent=y.b,this.transform_error=f??this.parent?.transform_error??(s=>s),this.#e=X(()=>{if(p){const s=this.#u;Z();const n=s.data===ee;if(s.data.startsWith(M)){const a=JSON.parse(s.data.slice(M.length));this.#b(a)}else n?this.#T():this.#E()}else this.#v()},Ae),p&&(this.#t=u)}#E(){try{this.#n=c(()=>this.#o(this.#t))}catch(e){this.error(e)}}#b(e){const t=this.#i.failed;t&&(this.#r=c(()=>{t(this.#t,()=>e,()=>()=>{})}))}#T(){const e=this.#i.pending;e&&(this.is_pending=!0,this.#s=c(()=>e(this.#t)),R(()=>{var t=this.#a=document.createDocumentFragment(),i=q();t.append(i),this.#n=this.#c(()=>c(()=>this.#o(i))),this.#f===0&&(this.#t.before(t),this.#a=null,D(this.#s,()=>{this.#s=null}),this.#l(V))}))}#v(){try{if(this.is_pending=this.has_pending_snippet(),this.#f=0,this.#d=0,this.#n=c(()=>{this.#o(this.#t)}),this.#f>0){var e=this.#a=document.createDocumentFragment();te(this.#n,e);const t=this.#i.pending;this.#s=c(()=>t(this.#t))}else this.#l(V)}catch(t){this.error(t)}}#l(e){this.is_pending=!1,e.transfer_effects(this.#p,this.#g)}defer_effect(e){se(e,this.#p,this.#g)}is_rendered(){return!this.is_pending&&(!this.parent||this.parent.is_rendered())}has_pending_snippet(){return!!this.#i.pending}#c(e){var t=y,i=ne,f=U;Y(this.#e),L(this.#e),P(this.#e.ctx);try{return re.ensure(),e()}catch(s){return ie(s),null}finally{Y(t),L(i),P(f)}}#y(e,t){if(!this.has_pending_snippet()){this.parent&&this.parent.#y(e,t);return}this.#f+=e,this.#f===0&&(this.#l(t),this.#s&&D(this.#s,()=>{this.#s=null}),this.#a&&(this.#t.before(this.#a),this.#a=null))}update_pending_count(e,t){this.#y(e,t),this.#d+=e,!(!this.#h||this.#_)&&(this.#_=!0,R(()=>{this.#_=!1,this.#h&&ae(this.#h,this.#d)}))}get_effect_pending(){return this.#m(),W(this.#h)}error(e){var t=this.#i.onerror;let i=this.#i.failed;if(!t&&!i)throw e;this.#n&&(F(this.#n),this.#n=null),this.#s&&(F(this.#s),this.#s=null),this.#r&&(F(this.#r),this.#r=null),p&&(N(this.#u),he(),N(fe()));var f=!1,s=!1;const n=()=>{if(f){le();return}f=!0,s&&_e(),this.#r!==null&&D(this.#r,()=>{this.#r=null}),this.#c(()=>{this.#v()})},l=a=>{try{s=!0,t?.(a,n),s=!1}catch(h){E(h,this.#e&&this.#e.parent)}i&&(this.#r=this.#c(()=>{try{return c(()=>{var h=y;h.b=this,h.f|=H,i(this.#t,()=>a,()=>n)})}catch(h){return E(h,this.#e.parent),null}}))};R(()=>{var a;try{a=this.transform_error(e)}catch(h){E(h,this.#e&&this.#e.parent);return}a!==null&&typeof a=="object"&&typeof a.then=="function"?a.then(l,h=>E(h,this.#e&&this.#e.parent)):l(a)})}}const Oe=["touchstart","touchmove"];function xe(r){return Oe.includes(r)}function He(r,e){var t=e==null?"":typeof e=="object"?`${e}`:e;t!==(r.__t??=r.nodeValue)&&(r.__t=t,r.nodeValue=`${t}`)}function Ie(r,e){return J(r,e)}function Me(r,e){O(),e.intro=e.intro??!1;const t=e.target,i=p,f=u;try{for(var s=ce(t);s&&(s.nodeType!==z||s.data!==ue);)s=pe(s);if(!s)throw x;b(!0),N(s);const n=J(r,{...e,anchor:s});return b(!1),n}catch(n){if(n instanceof Error&&n.message.split(`
`).some(l=>l.startsWith("https://svelte.dev/e/")))throw n;return n!==x&&console.warn("Failed to hydrate: ",n),e.recover===!1&&ge(),O(),ve(t),b(!1),Ie(r,e)}finally{b(i),N(f)}}const T=new Map;function J(r,{target:e,anchor:t,props:i={},events:f,context:s,intro:n=!0,transformError:l}){O();var a=void 0,h=ye(()=>{var m=t??e.appendChild(q());De(m,{pending:()=>{}},o=>{Ee({});var d=U;if(s&&(d.c=s),f&&(i.$$events=f),p&&Se(o,null),a=r(o,i)||{},p&&(y.nodes.end=u,u===null||u.nodeType!==z||u.data!==be))throw Te(),x;Re()},l);var S=new Set,w=o=>{for(var d=0;d<o.length;d++){var _=o[d];if(!S.has(_)){S.add(_);var v=xe(_);for(const A of[e,document]){var g=T.get(A);g===void 0&&(g=new Map,T.set(A,g));var k=g.get(_);k===void 0?(A.addEventListener(_,B,{passive:v}),g.set(_,1)):g.set(_,k+1)}}}};return w(me(Ne)),j.add(w),()=>{for(var o of S)for(const v of[e,document]){var d=T.get(v),_=d.get(o);--_==0?(v.removeEventListener(o,B),d.delete(o),d.size===0&&T.delete(v)):d.set(o,_)}j.delete(w),m!==t&&m.parentNode?.removeChild(m)}});return I.set(a,h),a}let I=new WeakMap;function Ve(r,e){const t=I.get(r);return t?(I.delete(r),t(e)):Promise.resolve()}export{Me as h,Ie as m,He as s,Ve as u};

View File

@ -1 +0,0 @@
import{a as y}from"./DVOkFnep.js";import{F as r}from"./DAfY0XTB.js";function a(t,e,f,i){var l=t.__style;if(r||l!==e){var s=y(e);(!r||s!==t.getAttribute("style"))&&(s==null?t.removeAttribute("style"):t.style.cssText=s),t.__style=e}return i}export{a as s};

View File

@ -1 +1 @@
import{a as b}from"./B08B5jt4.js";import{F as g}from"./Cjw4vZKn.js";function A(i,h,f,N,t,r){var o=i.__className;if(g||o!==f||o===void 0){var a=b(f,N,r);(!g||a!==i.getAttribute("class"))&&(a==null?i.removeAttribute("class"):i.className=a),i.__className=f}else if(r&&t!==r)for(var l in r){var u=!!r[l];(t==null||u!==!!t[l])&&i.classList.toggle(l,u)}return r}export{A as s};
import{a as b}from"./D5EBvEcH.js";import{N as g}from"./reyx9_7L.js";function A(i,h,f,N,t,r){var o=i.__className;if(g||o!==f||o===void 0){var a=b(f,N,r);(!g||a!==i.getAttribute("class"))&&(a==null?i.removeAttribute("class"):i.className=a),i.__className=f}else if(r&&t!==r)for(var l in r){var u=!!r[l];(t==null||u!==!!t[l])&&i.classList.toggle(l,u)}return r}export{A as s};

View File

@ -1 +0,0 @@
import{a1 as z,Q as Z,ao as G,F as A,W as M,a5 as J,R as re,g as U,U as ae,ap as fe,V as X,X as O,Y as H,a7 as K,aq as ie,ar as P,B as le,as as C,a2 as L,at as se,a4 as ue,y as oe,H as te,au as q,av as ve,aw as de,O as ce,ax as Q,ay as pe,D as ge,Z as $,a0 as j,az as B,af as _e,aA as Ee,aB as he,aC as me,a3 as Te,_ as Ce,a8 as V,aD as we,aE as Ae}from"./DAfY0XTB.js";function Ie(e,a){return a}function Se(e,a,s){for(var u=[],t=a.length,r,i=a.length,p=0;p<t;p++){let E=a[p];j(E,()=>{if(r){if(r.pending.delete(E),r.done.add(E),r.pending.size===0){var v=e.outrogroups;Y(e,q(r.done)),v.delete(r),v.size===0&&(e.outrogroups=null)}}else i-=1},!1)}if(i===0){var l=u.length===0&&s!==null;if(l){var c=s,f=c.parentNode;me(f),f.append(c),e.items.clear()}Y(e,a,!l)}else r={pending:new Set(a),done:new Set},(e.outrogroups??=new Set).add(r)}function Y(e,a,s=!0){var u;if(e.pending.size>0){u=new Set;for(const i of e.pending.values())for(const p of i)u.add(e.items.get(p).e)}for(var t=0;t<a.length;t++){var r=a[t];if(u?.has(r)){r.f|=C;const i=document.createDocumentFragment();Te(r,i)}else Ce(a[t],s)}}var W;function Ne(e,a,s,u,t,r=null){var i=e,p=new Map,l=(a&G)!==0;if(l){var c=e;i=A?M(J(c)):c.appendChild(z())}A&&re();var f=null,E=oe(()=>{var d=s();return te(d)?d:d==null?[]:q(d)}),v,h=new Map,m=!0;function I(d){(S.effect.f&ge)===0&&(S.pending.delete(d),S.fallback=f,De(S,v,i,a,u),f!==null&&(v.length===0?(f.f&C)===0?$(f):(f.f^=C,k(f,null,i)):j(f,()=>{f=null})))}function n(d){S.pending.delete(d)}var o=Z(()=>{v=U(E);var d=v.length;let _=!1;if(A){var b=ae(i)===fe;b!==(d===0)&&(i=X(),M(i),O(!1),_=!0)}for(var D=new Set,g=le,N=ue(),R=0;R<d;R+=1){A&&H.nodeType===K&&H.data===ie&&(i=H,_=!0,O(!1));var T=v[R],y=u(T,R),w=m?null:p.get(y);w?(w.v&&P(w.v,T),w.i&&P(w.i,R),N&&g.unskip_effect(w.e)):(w=Re(p,m?i:W??=z(),T,y,R,t,a,s),m||(w.e.f|=C),p.set(y,w)),D.add(y)}if(d===0&&r&&!f&&(m?f=L(()=>r(i)):(f=L(()=>r(W??=z())),f.f|=C)),d>D.size&&se(),A&&d>0&&M(X()),!m)if(h.set(g,D),N){for(const[ee,ne]of p)D.has(ee)||g.skip_effect(ne.e);g.oncommit(I),g.ondiscard(n)}else I(g);_&&O(!0),U(E)}),S={effect:o,items:p,pending:h,outrogroups:null,fallback:f};m=!1,A&&(i=H)}function x(e){for(;e!==null&&(e.f&Ee)===0;)e=e.next;return e}function De(e,a,s,u,t){var r=(u&he)!==0,i=a.length,p=e.items,l=x(e.effect.first),c,f=null,E,v=[],h=[],m,I,n,o;if(r)for(o=0;o<i;o+=1)m=a[o],I=t(m,o),n=p.get(I).e,(n.f&C)===0&&(n.nodes?.a?.measure(),(E??=new Set).add(n));for(o=0;o<i;o+=1){if(m=a[o],I=t(m,o),n=p.get(I).e,e.outrogroups!==null)for(const T of e.outrogroups)T.pending.delete(n),T.done.delete(n);if((n.f&B)!==0&&($(n),r&&(n.nodes?.a?.unfix(),(E??=new Set).delete(n))),(n.f&C)!==0)if(n.f^=C,n===l)k(n,null,s);else{var S=f?f.next:l;n===e.effect.last&&(e.effect.last=n.prev),n.prev&&(n.prev.next=n.next),n.next&&(n.next.prev=n.prev),F(e,f,n),F(e,n,S),k(n,S,s),f=n,v=[],h=[],l=x(f.next);continue}if(n!==l){if(c!==void 0&&c.has(n)){if(v.length<h.length){var d=h[0],_;f=d.prev;var b=v[0],D=v[v.length-1];for(_=0;_<v.length;_+=1)k(v[_],d,s);for(_=0;_<h.length;_+=1)c.delete(h[_]);F(e,b.prev,D.next),F(e,f,b),F(e,D,d),l=d,f=D,o-=1,v=[],h=[]}else c.delete(n),k(n,l,s),F(e,n.prev,n.next),F(e,n,f===null?e.effect.first:f.next),F(e,f,n),f=n;continue}for(v=[],h=[];l!==null&&l!==n;)(c??=new Set).add(l),h.push(l),l=x(l.next);if(l===null)continue}(n.f&C)===0&&v.push(n),f=n,l=x(n.next)}if(e.outrogroups!==null){for(const T of e.outrogroups)T.pending.size===0&&(Y(e,q(T.done)),e.outrogroups?.delete(T));e.outrogroups.size===0&&(e.outrogroups=null)}if(l!==null||c!==void 0){var g=[];if(c!==void 0)for(n of c)(n.f&B)===0&&g.push(n);for(;l!==null;)(l.f&B)===0&&l!==e.fallback&&g.push(l),l=x(l.next);var N=g.length;if(N>0){var R=(u&G)!==0&&i===0?s:null;if(r){for(o=0;o<N;o+=1)g[o].nodes?.a?.measure();for(o=0;o<N;o+=1)g[o].nodes?.a?.fix()}Se(e,g,R)}}r&&_e(()=>{if(E!==void 0)for(n of E)n.nodes?.a?.apply()})}function Re(e,a,s,u,t,r,i,p){var l=(i&ve)!==0?(i&de)===0?ce(s,!1,!1):Q(s):null,c=(i&pe)!==0?Q(t):null;return{v:l,i:c,e:L(()=>(r(a,l??s,c??t,p),()=>{e.delete(u)}))}}function k(e,a,s){if(e.nodes)for(var u=e.nodes.start,t=e.nodes.end,r=a&&(a.f&C)===0?a.nodes.start:s;u!==null;){var i=V(u);if(r.before(u),u===t)return;u=i}}function F(e,a,s){a===null?e.effect.first=s:a.next=s,s===null?e.effect.last=a:s.prev=a}function xe(e,a){let s=null,u=A;var t;if(A){s=H;for(var r=J(document.head);r!==null&&(r.nodeType!==K||r.data!==e);)r=V(r);if(r===null)O(!1);else{var i=V(r);r.remove(),M(i)}}A||(t=document.head.appendChild(z()));try{Z(()=>a(t),we|Ae)}finally{u&&(O(!0),M(s))}}export{Ne as e,xe as h,Ie as i};

View File

@ -1 +0,0 @@
import{c as y,a as p,f as _}from"./Bkzsmr9I.js";import{d as j,f as S,h as B,c as i,r as n,b as c,t as v,g as r,u as I}from"./Cjw4vZKn.js";import{s as m}from"./DfJQ0EIT.js";import{i as q}from"./kjB3f-xG.js";import{s as w}from"./RVjQLo13.js";import{s as d}from"./CWOupeSg.js";import{p as z}from"./fSdafo1a.js";import{s as A}from"./utcFFRIM.js";var C=_('<a><span class="mr-1"> </span> </a>'),D=_('<span><span class="mr-1"> </span> </span>');function N(x,o){j(o,!0);let h=z(o,"linked",3,!1);const s=I(()=>A(o.status));var u=y(),b=S(u);{var g=e=>{var t=C(),a=i(t),f=i(a,!0);n(a);var l=c(a);n(t),v(()=>{w(t,"href",`/ketten?status=${o.status??""}`),d(t,1,`inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium ${r(s).color??""} hover:opacity-80 transition-opacity`),m(f,r(s).emoji),m(l,` ${r(s).label??""}`)}),p(e,t)},k=e=>{var t=D(),a=i(t),f=i(a,!0);n(a);var l=c(a);n(t),v(()=>{d(t,1,`inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium ${r(s).color??""}`),m(f,r(s).emoji),m(l,` ${r(s).label??""}`)}),p(e,t)};q(b,e=>{h()&&o.status?e(g):e(k,-1)})}p(x,u),B()}export{N as S};

View File

@ -1 +0,0 @@
import{A as m,B as v,C as _,o as b,E as i,F as y}from"./Cjw4vZKn.js";function k(e,l,u=l){var s=new WeakSet;m(e,"input",async r=>{var a=r?e.defaultValue:e.value;if(a=o(e)?t(a):a,u(a),v!==null&&s.add(v),await _(),a!==(a=l())){var d=e.selectionStart,f=e.selectionEnd,n=e.value.length;if(e.value=a??"",f!==null){var c=e.value.length;d===f&&f===n&&c>n?(e.selectionStart=c,e.selectionEnd=c):(e.selectionStart=d,e.selectionEnd=Math.min(f,c))}}}),(y&&e.defaultValue!==e.value||b(l)==null&&e.value)&&(u(o(e)?t(e.value):e.value),v!==null&&s.add(v)),i(()=>{var r=l();if(e===document.activeElement){var a=v;if(s.has(a))return}o(e)&&r===t(e.value)||e.type==="date"&&!r&&!e.value||r!==e.value&&(e.value=r??"")})}function o(e){var l=e.type;return l==="number"||l==="range"}function t(e){return e===""?null:+e}export{k as b};

File diff suppressed because one or more lines are too long

View File

@ -1 +0,0 @@
const a=typeof window<"u"&&window.location.port==="5173"?`http://${window.location.hostname}:8099/api`:"/api";async function e(t){const n=await fetch(`${a}${t}`);if(!n.ok)throw new Error(`API error: ${n.status}`);return n.json()}const r=t=>{const n=new URLSearchParams(t).toString();return e(`/vorlagen?${n}`)},s=t=>e(`/vorlagen/${t}`),c=t=>{const n=new URLSearchParams(t).toString();return e(`/ketten?${n}`)},i=t=>e(`/ketten/${t}`),f=()=>e("/fraktionen"),h=(t,n)=>{const o=n?`?jahr=${n}`:"";return e(`/fraktionen/${t}/dashboard${o}`)};export{c as a,s as b,i as c,r as d,h as e,f};

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
import{c as y,a as p,f as d}from"./B89f14j0.js";import{p as j,f as S,c as B,h as i,r as n,b as c,t as v,g as r,u as I}from"./reyx9_7L.js";import{s as m}from"./BwTTNG21.js";import{i as q}from"./Do7Yo2YN.js";import{s as w}from"./B-WTs0fq.js";import{s as _}from"./C7sCDBjT.js";import{p as z}from"./DfsAIpU3.js";import{s as A}from"./utcFFRIM.js";var C=d('<a><span class="mr-1"> </span> </a>'),D=d('<span><span class="mr-1"> </span> </span>');function N(x,o){j(o,!0);let h=z(o,"linked",3,!1);const s=I(()=>A(o.status));var u=y(),b=S(u);{var g=e=>{var t=C(),a=i(t),f=i(a,!0);n(a);var l=c(a);n(t),v(()=>{w(t,"href",`/ketten?status=${o.status??""}`),_(t,1,`inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium ${r(s).color??""} hover:opacity-80 transition-opacity`),m(f,r(s).emoji),m(l,` ${r(s).label??""}`)}),p(e,t)},k=e=>{var t=D(),a=i(t),f=i(a,!0);n(a);var l=c(a);n(t),v(()=>{_(t,1,`inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium ${r(s).color??""}`),m(f,r(s).emoji),m(l,` ${r(s).label??""}`)}),p(e,t)};q(b,e=>{h()&&o.status?e(g):e(k,-1)})}p(x,u),B()}export{N as S};

View File

@ -0,0 +1 @@
import{s as f,g as c}from"./Pu2RPHbX.js";import{C as l,J as b,K as a,M as _,g as d,d as p}from"./reyx9_7L.js";let u=!1,t=Symbol();function v(e,r,n){const s=n[r]??={store:null,source:_(void 0),unsubscribe:a};if(s.store!==e&&!(t in n))if(s.unsubscribe(),s.store=e??null,e==null)s.source.v=void 0,s.unsubscribe=a;else{var i=!0;s.unsubscribe=f(e,o=>{i?s.source.v=o:p(s.source,o)}),i=!1}return e&&t in n?c(e):d(s.source)}function y(){const e={};function r(){l(()=>{for(var n in e)e[n].unsubscribe();b(e,t,{enumerable:!1,value:!0})})}return[e,r]}function M(e){var r=u;try{return u=!1,[e(),u]}finally{u=r}}export{v as a,M as c,y as s};

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,2 @@
import{ae as y,ai as K,ap as Q,N as A,Z as b,_ as W,a0 as fe,g as U,ak as ae,aq as ie,al as P,am as H,a2 as M,a3 as $,ar as le,as as X,B as se,at as w,af as L,au as ue,ah as te,y as oe,E as de,av as Y,aw as ve,ax as ce,M as pe,ay as Z,az as ge,D as _e,ab as j,ad as ee,aA as B,U as Ee,aB as he,aC as me,aD as Te,ag as we,ac as Ce,a4 as q,aE as Ae,aF as Se}from"./reyx9_7L.js";function Ie(e,a){return a}function De(e,a,l){for(var r=[],t=a.length,i,f=a.length,o=0;o<t;o++){let E=a[o];ee(E,()=>{if(i){if(i.pending.delete(E),i.done.add(E),i.pending.size===0){var v=e.outrogroups;V(e,Y(i.done)),v.delete(i),v.size===0&&(e.outrogroups=null)}}else f-=1},!1)}if(f===0){var u=r.length===0&&l!==null;if(u){var p=l,s=p.parentNode;Te(s),s.append(p),e.items.clear()}V(e,a,!u)}else i={pending:new Set(a),done:new Set},(e.outrogroups??=new Set).add(i)}function V(e,a,l=!0){var r;if(e.pending.size>0){r=new Set;for(const f of e.pending.values())for(const o of f)r.add(e.items.get(o).e)}for(var t=0;t<a.length;t++){var i=a[t];if(r?.has(i)){i.f|=w;const f=document.createDocumentFragment();we(i,f)}else Ce(a[t],l)}}var G;function Re(e,a,l,r,t,i=null){var f=e,o=new Map,u=(a&Q)!==0;if(u){var p=e;f=A?b(W(p)):p.appendChild(y())}A&&fe();var s=null,E=oe(()=>{var c=l();return de(c)?c:c==null?[]:Y(c)}),v,h=new Map,m=!0;function F(c){(S.effect.f&_e)===0&&(S.pending.delete(c),S.fallback=s,Ne(S,v,f,a,r),s!==null&&(v.length===0?(s.f&w)===0?j(s):(s.f^=w,O(s,null,f)):ee(s,()=>{s=null})))}function n(c){S.pending.delete(c)}var d=K(()=>{v=U(E);var c=v.length;let _=!1;if(A){var k=ae(f)===ie;k!==(c===0)&&(f=P(),b(f),H(!1),_=!0)}for(var D=new Set,g=se,I=te(),N=0;N<c;N+=1){A&&M.nodeType===$&&M.data===le&&(f=M,_=!0,H(!1));var T=v[N],z=r(T,N),C=m?null:o.get(z);C?(C.v&&X(C.v,T),C.i&&X(C.i,N),I&&g.unskip_effect(C.e)):(C=xe(o,m?f:G??=y(),T,z,N,t,a,l),m||(C.e.f|=w),o.set(z,C)),D.add(z)}if(c===0&&i&&!s&&(m?s=L(()=>i(f)):(s=L(()=>i(G??=y())),s.f|=w)),c>D.size&&ue(),A&&c>0&&b(P()),!m)if(h.set(g,D),I){for(const[ne,re]of o)D.has(ne)||g.skip_effect(re.e);g.oncommit(F),g.ondiscard(n)}else F(g);_&&H(!0),U(E)}),S={effect:d,items:o,pending:h,outrogroups:null,fallback:s};m=!1,A&&(f=M)}function R(e){for(;e!==null&&(e.f&he)===0;)e=e.next;return e}function Ne(e,a,l,r,t){var i=(r&me)!==0,f=a.length,o=e.items,u=R(e.effect.first),p,s=null,E,v=[],h=[],m,F,n,d;if(i)for(d=0;d<f;d+=1)m=a[d],F=t(m,d),n=o.get(F).e,(n.f&w)===0&&(n.nodes?.a?.measure(),(E??=new Set).add(n));for(d=0;d<f;d+=1){if(m=a[d],F=t(m,d),n=o.get(F).e,e.outrogroups!==null)for(const T of e.outrogroups)T.pending.delete(n),T.done.delete(n);if((n.f&B)!==0&&(j(n),i&&(n.nodes?.a?.unfix(),(E??=new Set).delete(n))),(n.f&w)!==0)if(n.f^=w,n===u)O(n,null,l);else{var S=s?s.next:u;n===e.effect.last&&(e.effect.last=n.prev),n.prev&&(n.prev.next=n.next),n.next&&(n.next.prev=n.prev),x(e,s,n),x(e,n,S),O(n,S,l),s=n,v=[],h=[],u=R(s.next);continue}if(n!==u){if(p!==void 0&&p.has(n)){if(v.length<h.length){var c=h[0],_;s=c.prev;var k=v[0],D=v[v.length-1];for(_=0;_<v.length;_+=1)O(v[_],c,l);for(_=0;_<h.length;_+=1)p.delete(h[_]);x(e,k.prev,D.next),x(e,s,k),x(e,D,c),u=c,s=D,d-=1,v=[],h=[]}else p.delete(n),O(n,u,l),x(e,n.prev,n.next),x(e,n,s===null?e.effect.first:s.next),x(e,s,n),s=n;continue}for(v=[],h=[];u!==null&&u!==n;)(p??=new Set).add(u),h.push(u),u=R(u.next);if(u===null)continue}(n.f&w)===0&&v.push(n),s=n,u=R(n.next)}if(e.outrogroups!==null){for(const T of e.outrogroups)T.pending.size===0&&(V(e,Y(T.done)),e.outrogroups?.delete(T));e.outrogroups.size===0&&(e.outrogroups=null)}if(u!==null||p!==void 0){var g=[];if(p!==void 0)for(n of p)(n.f&B)===0&&g.push(n);for(;u!==null;)(u.f&B)===0&&u!==e.fallback&&g.push(u),u=R(u.next);var I=g.length;if(I>0){var N=(r&Q)!==0&&f===0?l:null;if(i){for(d=0;d<I;d+=1)g[d].nodes?.a?.measure();for(d=0;d<I;d+=1)g[d].nodes?.a?.fix()}De(e,g,N)}}i&&Ee(()=>{if(E!==void 0)for(n of E)n.nodes?.a?.apply()})}function xe(e,a,l,r,t,i,f,o){var u=(f&ve)!==0?(f&ce)===0?pe(l,!1,!1):Z(l):null,p=(f&ge)!==0?Z(t):null;return{v:u,i:p,e:L(()=>(i(a,u??l,p??t,o),()=>{e.delete(r)}))}}function O(e,a,l){if(e.nodes)for(var r=e.nodes.start,t=e.nodes.end,i=a&&(a.f&w)===0?a.nodes.start:l;r!==null;){var f=q(r);if(i.before(r),r===t)return;r=f}}function x(e,a,l){a===null?e.effect.first=l:a.next=l,l===null?e.effect.last=a:l.prev=a}function Me(e,a){let l=null,r=A;var t;if(A){l=M;for(var i=W(document.head);i!==null&&(i.nodeType!==$||i.data!==e);)i=q(i);if(i===null)H(!1);else{var f=q(i);i.remove(),b(f)}}A||(t=document.head.appendChild(y()));try{K(()=>a(t),Ae|Se)}finally{r&&(H(!0),b(l))}}const J=[...`
\r\f \v\uFEFF`];function Oe(e,a,l){var r=e==null?"":""+e;if(a&&(r=r?r+" "+a:a),l){for(var t of Object.keys(l))if(l[t])r=r?r+" "+t:t;else if(r.length)for(var i=t.length,f=0;(f=r.indexOf(t,f))>=0;){var o=f+i;(f===0||J.includes(r[f-1]))&&(o===r.length||J.includes(r[o]))?r=(f===0?"":r.substring(0,f))+r.substring(o+1):f=o}}return r===""?null:r}function be(e,a){return e==null?null:String(e)}export{Oe as a,Re as e,Me as h,Ie as i,be as t};

View File

@ -1 +0,0 @@
import{t as b}from"./DVOkFnep.js";import{F as g}from"./DAfY0XTB.js";function A(i,h,t,N,f,r){var o=i.__className;if(g||o!==t||o===void 0){var a=b(t,N,r);(!g||a!==i.getAttribute("class"))&&(a==null?i.removeAttribute("class"):i.className=a),i.__className=t}else if(r&&f!==r)for(var l in r){var u=!!r[l];(f==null||u!==!!f[l])&&i.classList.toggle(l,u)}return r}export{A as s};

File diff suppressed because one or more lines are too long

View File

@ -1 +0,0 @@
import{ab as v,a1 as d,a5 as u,aF as T,l,aG as p,aH as h,F as i,Y as s,aI as E,R as y,aJ as g,W as w,aK as N}from"./DAfY0XTB.js";const M=globalThis?.window?.trustedTypes&&globalThis.window.trustedTypes.createPolicy("svelte-trusted-html",{createHTML:t=>t});function b(t){return M?.createHTML(t)??t}function x(t){var r=v("template");return r.innerHTML=b(t.replaceAll("<!>","<!---->")),r.content}function a(t,r){var e=l;e.nodes===null&&(e.nodes={start:t,end:r,a:null,t:null})}function R(t,r){var e=(r&p)!==0,f=(r&h)!==0,n,_=!t.startsWith("<!>");return()=>{if(i)return a(s,null),s;n===void 0&&(n=x(_?t:"<!>"+t),e||(n=u(n)));var o=f||T?document.importNode(n,!0):n.cloneNode(!0);if(e){var c=u(o),m=o.lastChild;a(c,m)}else a(o,o);return o}}function I(t=""){if(!i){var r=d(t+"");return a(r,r),r}var e=s;return e.nodeType!==g?(e.before(e=d()),w(e)):N(e),a(e,e),e}function O(){if(i)return a(s,null),s;var t=document.createDocumentFragment(),r=document.createComment(""),e=d();return t.append(r,e),a(r,e),t}function P(t,r){if(i){var e=l;((e.f&E)===0||e.nodes.end===null)&&(e.nodes.end=s),y();return}t!==null&&t.before(r)}const A="5";typeof window<"u"&&((window.__svelte??={}).v??=new Set).add(A);export{P as a,a as b,O as c,R as f,I as t};

View File

@ -1 +0,0 @@
import{am as o,an as t,q as c,o as l}from"./DAfY0XTB.js";function a(e){throw new Error("https://svelte.dev/e/lifecycle_outside_component")}function r(e){t===null&&a(),c&&t.l!==null?u(t).m.push(e):o(()=>{const n=l(e);if(typeof n=="function")return n})}function u(e){var n=e.l;return n.u??={a:[],b:[],m:[]}}export{r as o};

View File

@ -1 +0,0 @@
import{N as o,o as a,ae as d}from"./DAfY0XTB.js";function p(s,u,n){if(s==null)return u(void 0),o;const t=a(()=>s.subscribe(u,n));return t.unsubscribe?()=>t.unsubscribe():t}const i=[];function _(s,u=o){let n=null;const t=new Set;function c(r){if(d(s,r)&&(s=r,n)){const b=!i.length;for(const e of t)e[1](),i.push(e,s);if(b){for(let e=0;e<i.length;e+=2)i[e][0](i[e+1]);i.length=0}}}function f(r){c(r(s))}function l(r,b=o){const e=[r,b];return t.add(e),t.size===1&&(n=u(c,f)||o),r(s),()=>{t.delete(e),t.size===0&&n&&(n(),n=null)}}return{set:c,update:f,subscribe:l}}function h(s){let u;return p(s,n=>u=n)(),u}export{h as g,p as s,_ as w};

View File

@ -1 +1 @@
import{A as m,B as v,C as _,o as b,E as i,F as y}from"./DAfY0XTB.js";function k(e,l,u=l){var s=new WeakSet;m(e,"input",async r=>{var a=r?e.defaultValue:e.value;if(a=o(e)?t(a):a,u(a),v!==null&&s.add(v),await _(),a!==(a=l())){var d=e.selectionStart,f=e.selectionEnd,n=e.value.length;if(e.value=a??"",f!==null){var c=e.value.length;d===f&&f===n&&c>n?(e.selectionStart=c,e.selectionEnd=c):(e.selectionStart=d,e.selectionEnd=Math.min(f,c))}}}),(y&&e.defaultValue!==e.value||b(l)==null&&e.value)&&(u(o(e)?t(e.value):e.value),v!==null&&s.add(v)),i(()=>{var r=l();if(e===document.activeElement){var a=v;if(s.has(a))return}o(e)&&r===t(e.value)||e.type==="date"&&!r&&!e.value||r!==e.value&&(e.value=r??"")})}function o(e){var l=e.type;return l==="number"||l==="range"}function t(e){return e===""?null:+e}export{k as b};
import{A as m,B as v,O as _,o as b,Q as i,N as y}from"./reyx9_7L.js";function E(e,l,u=l){var s=new WeakSet;m(e,"input",async r=>{var a=r?e.defaultValue:e.value;if(a=o(e)?t(a):a,u(a),v!==null&&s.add(v),await _(),a!==(a=l())){var d=e.selectionStart,f=e.selectionEnd,n=e.value.length;if(e.value=a??"",f!==null){var c=e.value.length;d===f&&f===n&&c>n?(e.selectionStart=c,e.selectionEnd=c):(e.selectionStart=d,e.selectionEnd=Math.min(f,c))}}}),(y&&e.defaultValue!==e.value||b(l)==null&&e.value)&&(u(o(e)?t(e.value):e.value),v!==null&&s.add(v)),i(()=>{var r=l();if(e===document.activeElement){var a=v;if(s.has(a))return}o(e)&&r===t(e.value)||e.type==="date"&&!r&&!e.value||r!==e.value&&(e.value=r??"")})}function o(e){var l=e.type;return l==="number"||l==="range"}function t(e){return e===""?null:+e}export{E as b};

View File

@ -1,2 +0,0 @@
import{F as l,af as u,ag as d,ah as g,ai as v,aj as h,ak as A,al as m}from"./DAfY0XTB.js";const i=[...`
\r\f \v\uFEFF`];function I(r,s,t){var e=r==null?"":""+r;if(s&&(e=e?e+" "+s:s),t){for(var n of Object.keys(t))if(t[n])e=e?e+" "+n:n;else if(e.length)for(var f=n.length,o=0;(o=e.indexOf(n,o))>=0;){var a=o+f;(o===0||i.includes(e[o-1]))&&(a===e.length||i.includes(e[a]))?e=(o===0?"":e.substring(0,o))+e.substring(a+1):o=a}}return e===""?null:e}function y(r,s){return r==null?null:String(r)}const p=Symbol("is custom element"),S=Symbol("is html"),L=h?"link":"LINK";function E(r){if(l){var s=!1,t=()=>{if(!s){if(s=!0,r.hasAttribute("value")){var e=r.value;c(r,"value",null),r.value=e}if(r.hasAttribute("checked")){var n=r.checked;c(r,"checked",null),r.checked=n}}};r.__on_r=t,u(t),d()}}function c(r,s,t,e){var n=M(r);l&&(n[s]=r.getAttribute(s),s==="src"||s==="srcset"||s==="href"&&r.nodeName===L)||n[s]!==(n[s]=t)&&(s==="loading"&&(r[g]=t),t==null?r.removeAttribute(s):typeof t!="string"&&N(r).includes(s)?r[s]=t:r.setAttribute(s,t))}function M(r){return r.__attributes??={[p]:r.nodeName.includes("-"),[S]:r.namespaceURI===v}}var _=new Map;function N(r){var s=r.getAttribute("is")||r.nodeName,t=_.get(s);if(t)return t;_.set(s,t=[]);for(var e,n=r,f=Element.prototype;f!==n;){e=m(n);for(var o in e)e[o].set&&t.push(o);n=A(n)}return t}export{y as a,E as r,c as s,I as t};

View File

@ -1 +0,0 @@
import{a8 as z,Y as G,F as A,a2 as M,ac as J,Z as ae,g as P,a0 as re,ao as fe,a1 as Q,a3 as O,a4 as H,ae as K,ap as ie,aq as U,B as le,ar as C,a9 as L,as as se,ab as ue,y as oe,H as te,at as V,au as ve,av as de,O as ce,aw as X,ax as pe,D as ge,a5 as W,a7 as $,ay as B,az as _e,aA as Ee,aa as he,a6 as me,af as Y,aB as j,Q as Te,aC as Ce,aD as we,aE as Ae}from"./Cjw4vZKn.js";function Ne(e,r){return r}function Se(e,r,s){for(var u=[],t=r.length,a,i=r.length,p=0;p<t;p++){let E=r[p];$(E,()=>{if(a){if(a.pending.delete(E),a.done.add(E),a.pending.size===0){var v=e.outrogroups;q(e,V(a.done)),v.delete(a),v.size===0&&(e.outrogroups=null)}}else i-=1},!1)}if(i===0){var l=u.length===0&&s!==null;if(l){var c=s,f=c.parentNode;Ee(f),f.append(c),e.items.clear()}q(e,r,!l)}else a={pending:new Set(r),done:new Set},(e.outrogroups??=new Set).add(a)}function q(e,r,s=!0){var u;if(e.pending.size>0){u=new Set;for(const i of e.pending.values())for(const p of i)u.add(e.items.get(p).e)}for(var t=0;t<r.length;t++){var a=r[t];if(u?.has(a)){a.f|=C;const i=document.createDocumentFragment();he(a,i)}else me(r[t],s)}}var Z;function Re(e,r,s,u,t,a=null){var i=e,p=new Map,l=(r&j)!==0;if(l){var c=e;i=A?M(J(c)):c.appendChild(z())}A&&ae();var f=null,E=oe(()=>{var d=s();return te(d)?d:d==null?[]:V(d)}),v,h=new Map,m=!0;function N(d){(S.effect.f&ge)===0&&(S.pending.delete(d),S.fallback=f,De(S,v,i,r,u),f!==null&&(v.length===0?(f.f&C)===0?W(f):(f.f^=C,k(f,null,i)):$(f,()=>{f=null})))}function n(d){S.pending.delete(d)}var o=G(()=>{v=P(E);var d=v.length;let _=!1;if(A){var b=re(i)===fe;b!==(d===0)&&(i=Q(),M(i),O(!1),_=!0)}for(var D=new Set,g=le,R=ue(),F=0;F<d;F+=1){A&&H.nodeType===K&&H.data===ie&&(i=H,_=!0,O(!1));var T=v[F],y=u(T,F),w=m?null:p.get(y);w?(w.v&&U(w.v,T),w.i&&U(w.i,F),R&&g.unskip_effect(w.e)):(w=Fe(p,m?i:Z??=z(),T,y,F,t,r,s),m||(w.e.f|=C),p.set(y,w)),D.add(y)}if(d===0&&a&&!f&&(m?f=L(()=>a(i)):(f=L(()=>a(Z??=z())),f.f|=C)),d>D.size&&se(),A&&d>0&&M(Q()),!m)if(h.set(g,D),R){for(const[ee,ne]of p)D.has(ee)||g.skip_effect(ne.e);g.oncommit(N),g.ondiscard(n)}else N(g);_&&O(!0),P(E)}),S={effect:o,items:p,pending:h,outrogroups:null,fallback:f};m=!1,A&&(i=H)}function x(e){for(;e!==null&&(e.f&_e)===0;)e=e.next;return e}function De(e,r,s,u,t){var a=(u&Ce)!==0,i=r.length,p=e.items,l=x(e.effect.first),c,f=null,E,v=[],h=[],m,N,n,o;if(a)for(o=0;o<i;o+=1)m=r[o],N=t(m,o),n=p.get(N).e,(n.f&C)===0&&(n.nodes?.a?.measure(),(E??=new Set).add(n));for(o=0;o<i;o+=1){if(m=r[o],N=t(m,o),n=p.get(N).e,e.outrogroups!==null)for(const T of e.outrogroups)T.pending.delete(n),T.done.delete(n);if((n.f&B)!==0&&(W(n),a&&(n.nodes?.a?.unfix(),(E??=new Set).delete(n))),(n.f&C)!==0)if(n.f^=C,n===l)k(n,null,s);else{var S=f?f.next:l;n===e.effect.last&&(e.effect.last=n.prev),n.prev&&(n.prev.next=n.next),n.next&&(n.next.prev=n.prev),I(e,f,n),I(e,n,S),k(n,S,s),f=n,v=[],h=[],l=x(f.next);continue}if(n!==l){if(c!==void 0&&c.has(n)){if(v.length<h.length){var d=h[0],_;f=d.prev;var b=v[0],D=v[v.length-1];for(_=0;_<v.length;_+=1)k(v[_],d,s);for(_=0;_<h.length;_+=1)c.delete(h[_]);I(e,b.prev,D.next),I(e,f,b),I(e,D,d),l=d,f=D,o-=1,v=[],h=[]}else c.delete(n),k(n,l,s),I(e,n.prev,n.next),I(e,n,f===null?e.effect.first:f.next),I(e,f,n),f=n;continue}for(v=[],h=[];l!==null&&l!==n;)(c??=new Set).add(l),h.push(l),l=x(l.next);if(l===null)continue}(n.f&C)===0&&v.push(n),f=n,l=x(n.next)}if(e.outrogroups!==null){for(const T of e.outrogroups)T.pending.size===0&&(q(e,V(T.done)),e.outrogroups?.delete(T));e.outrogroups.size===0&&(e.outrogroups=null)}if(l!==null||c!==void 0){var g=[];if(c!==void 0)for(n of c)(n.f&B)===0&&g.push(n);for(;l!==null;)(l.f&B)===0&&l!==e.fallback&&g.push(l),l=x(l.next);var R=g.length;if(R>0){var F=(u&j)!==0&&i===0?s:null;if(a){for(o=0;o<R;o+=1)g[o].nodes?.a?.measure();for(o=0;o<R;o+=1)g[o].nodes?.a?.fix()}Se(e,g,F)}}a&&Te(()=>{if(E!==void 0)for(n of E)n.nodes?.a?.apply()})}function Fe(e,r,s,u,t,a,i,p){var l=(i&ve)!==0?(i&de)===0?ce(s,!1,!1):X(s):null,c=(i&pe)!==0?X(t):null;return{v:l,i:c,e:L(()=>(a(r,l??s,c??t,p),()=>{e.delete(u)}))}}function k(e,r,s){if(e.nodes)for(var u=e.nodes.start,t=e.nodes.end,a=r&&(r.f&C)===0?r.nodes.start:s;u!==null;){var i=Y(u);if(a.before(u),u===t)return;u=i}}function I(e,r,s){r===null?e.effect.first=s:r.next=s,s===null?e.effect.last=r:s.prev=r}function xe(e,r){let s=null,u=A;var t;if(A){s=H;for(var a=J(document.head);a!==null&&(a.nodeType!==K||a.data!==e);)a=Y(a);if(a===null)O(!1);else{var i=Y(a);a.remove(),M(i)}}A||(t=document.head.appendChild(z()));try{G(()=>r(t),we|Ae)}finally{u&&(O(!0),M(s))}}export{Re as e,xe as h,Ne as i};

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
import{i as A,j as L,P as D,g as P,p as T,a as b,k as B,l as Y,D as x,m as M,o as N,q as U,v as h,w as q,x as w,y as z,z as $,S as j,L as y}from"./Cjw4vZKn.js";import{c as C}from"./DjXdyWBG.js";function F(r,a,t,s){var f=!U||(t&h)!==0,v=(t&M)!==0,E=(t&$)!==0,n=s,S=!0,g=()=>(S&&(S=!1,n=E?N(s):s),n);let u;if(v){var O=j in r||y in r;u=A(r,a)?.set??(O&&a in r?e=>r[a]=e:void 0)}var _,I=!1;v?[_,I]=C(()=>r[a]):_=r[a],_===void 0&&s!==void 0&&(_=g(),u&&(f&&L(),u(_)));var i;if(f?i=()=>{var e=r[a];return e===void 0?g():(S=!0,e)}:i=()=>{var e=r[a];return e!==void 0&&(n=void 0),e===void 0?n:e},f&&(t&D)===0)return i;if(u){var R=r.$$legacy;return(function(e,l){return arguments.length>0?((!f||!l||R||I)&&u(l?i():e),e):i()})}var c=!1,d=((t&q)!==0?w:z)(()=>(c=!1,i()));v&&P(d);var m=Y;return(function(e,l){if(arguments.length>0){const o=l?P(d):f&&v?T(e):e;return b(d,o),c=!0,n!==void 0&&(n=o),e}return B&&c||(m.f&x)!==0?d.v:P(d)})}export{F as p};
import{i as A,j as L,P as D,g as P,a as T,d as b,k as B,l as Y,D as x,m as M,o as N,q as U,v as h,w as q,x as w,y as z,z as $,S as j,L as y}from"./reyx9_7L.js";import{c as C}from"./CvtDgobB.js";function F(r,a,t,s){var f=!U||(t&h)!==0,v=(t&M)!==0,E=(t&$)!==0,n=s,S=!0,g=()=>(S&&(S=!1,n=E?N(s):s),n);let u;if(v){var O=j in r||y in r;u=A(r,a)?.set??(O&&a in r?e=>r[a]=e:void 0)}var _,I=!1;v?[_,I]=C(()=>r[a]):_=r[a],_===void 0&&s!==void 0&&(_=g(),u&&(f&&L(),u(_)));var i;if(f?i=()=>{var e=r[a];return e===void 0?g():(S=!0,e)}:i=()=>{var e=r[a];return e!==void 0&&(n=void 0),e===void 0?n:e},f&&(t&D)===0)return i;if(u){var R=r.$$legacy;return(function(e,l){return arguments.length>0?((!f||!l||R||I)&&u(l?i():e),e):i()})}var c=!1,d=((t&q)!==0?w:z)(()=>(c=!1,i()));v&&P(d);var m=Y;return(function(e,l){if(arguments.length>0){const o=l?P(d):f&&v?T(e):e;return b(d,o),c=!0,n!==void 0&&(n=o),e}return B&&c||(m.f&x)!==0?d.v:P(d)})}export{F as p};

View File

@ -1 +0,0 @@
import{s as f,g as c}from"./DiIboHMF.js";import{G as l,M as b,N as a,O as _,g as p,a as d}from"./Cjw4vZKn.js";let u=!1,t=Symbol();function v(e,r,n){const s=n[r]??={store:null,source:_(void 0),unsubscribe:a};if(s.store!==e&&!(t in n))if(s.unsubscribe(),s.store=e??null,e==null)s.source.v=void 0,s.unsubscribe=a;else{var i=!0;s.unsubscribe=f(e,o=>{i?s.source.v=o:d(s.source,o)}),i=!1}return e&&t in n?c(e):p(s.source)}function y(){const e={};function r(){l(()=>{for(var n in e)e[n].unsubscribe();b(e,t,{enumerable:!1,value:!0})})}return[e,r]}function N(e){var r=u;try{return u=!1,[e(),u]}finally{u=r}}export{v as a,N as c,y as s};

View File

@ -1 +1 @@
import{t as y}from"./B08B5jt4.js";import{F as r}from"./Cjw4vZKn.js";function n(t,e,f,i){var l=t.__style;if(r||l!==e){var s=y(e);(!r||s!==t.getAttribute("style"))&&(s==null?t.removeAttribute("style"):t.style.cssText=s),t.__style=e}return i}export{n as s};
import{t as y}from"./D5EBvEcH.js";import{N as r}from"./reyx9_7L.js";function n(t,e,f,i){var l=t.__style;if(r||l!==e){var s=y(e);(!r||s!==t.getAttribute("style"))&&(s==null?t.removeAttribute("style"):t.style.cssText=s),t.__style=e}return i}export{n as s};

View File

@ -0,0 +1 @@
import{ab as v,ac as c,ad as b,ae as u,af as _,B as g,N as o,a2 as m,ag as k,ah as y,ai as w,a0 as A,aj as F,ak as M,al as x,Z as B,am as p}from"./reyx9_7L.js";class E{anchor;#t=new Map;#s=new Map;#e=new Map;#a=new Set;#i=!0;constructor(t,s=!0){this.anchor=t,this.#i=s}#r=t=>{if(this.#t.has(t)){var s=this.#t.get(t),e=this.#s.get(s);if(e)v(e),this.#a.delete(s);else{var r=this.#e.get(s);r&&(this.#s.set(s,r.effect),this.#e.delete(s),r.fragment.lastChild.remove(),this.anchor.before(r.fragment),e=r.effect)}for(const[i,f]of this.#t){if(this.#t.delete(i),i===t)break;const a=this.#e.get(f);a&&(c(a.effect),this.#e.delete(f))}for(const[i,f]of this.#s){if(i===s||this.#a.has(i))continue;const a=()=>{if(Array.from(this.#t.values()).includes(i)){var h=document.createDocumentFragment();k(f,h),h.append(u()),this.#e.set(i,{effect:f,fragment:h})}else c(f);this.#a.delete(i),this.#s.delete(i)};this.#i||!e?(this.#a.add(i),b(f,a,!1)):a()}}};#f=t=>{this.#t.delete(t);const s=Array.from(this.#t.values());for(const[e,r]of this.#e)s.includes(e)||(c(r.effect),this.#e.delete(e))};ensure(t,s){var e=g,r=y();if(s&&!this.#s.has(t)&&!this.#e.has(t))if(r){var i=document.createDocumentFragment(),f=u();i.append(f),this.#e.set(t,{effect:_(()=>s(f)),fragment:i})}else this.#s.set(t,_(()=>s(this.anchor)));if(this.#t.set(e,t),r){for(const[a,n]of this.#s)a===t?e.unskip_effect(n):e.skip_effect(n);for(const[a,n]of this.#e)a===t?e.unskip_effect(n.effect):e.skip_effect(n.effect);e.oncommit(this.#r),e.ondiscard(this.#f)}else o&&(this.anchor=m),this.#r(e)}}function T(d,t,s=!1){var e;o&&(e=m,A());var r=new E(d),i=s?F:0;function f(a,n){if(o){var h=M(e);if(a!==parseInt(h.substring(1))){var l=x();B(l),r.anchor=l,p(!1),r.ensure(a,n),p(!0);return}}r.ensure(a,n)}w(()=>{var a=!1;t((n,h=0)=>{a=!0,f(h,n)}),a||f(-1,null)},i)}export{E as B,T as i};

View File

@ -0,0 +1 @@
import{an as t,ao as o,q as c,o as l}from"./reyx9_7L.js";function a(e){throw new Error("https://svelte.dev/e/lifecycle_outside_component")}function r(e){o===null&&a(),c&&o.l!==null?u(o).m.push(e):t(()=>{const n=l(e);if(typeof n=="function")return n})}function u(e){var n=e.l;return n.u??={a:[],b:[],m:[]}}export{r as o};

View File

@ -1 +0,0 @@
import{Z as l,_ as o,a0 as u,a1 as n,a2 as d,B as m,F as p,Y as _,a3 as v,a4 as k}from"./DAfY0XTB.js";class w{anchor;#t=new Map;#s=new Map;#e=new Map;#i=new Set;#a=!0;constructor(t,s=!0){this.anchor=t,this.#a=s}#f=t=>{if(this.#t.has(t)){var s=this.#t.get(t),e=this.#s.get(s);if(e)l(e),this.#i.delete(s);else{var a=this.#e.get(s);a&&(this.#s.set(s,a.effect),this.#e.delete(s),a.fragment.lastChild.remove(),this.anchor.before(a.fragment),e=a.effect)}for(const[i,f]of this.#t){if(this.#t.delete(i),i===t)break;const r=this.#e.get(f);r&&(o(r.effect),this.#e.delete(f))}for(const[i,f]of this.#s){if(i===s||this.#i.has(i))continue;const r=()=>{if(Array.from(this.#t.values()).includes(i)){var c=document.createDocumentFragment();v(f,c),c.append(n()),this.#e.set(i,{effect:f,fragment:c})}else o(f);this.#i.delete(i),this.#s.delete(i)};this.#a||!e?(this.#i.add(i),u(f,r,!1)):r()}}};#r=t=>{this.#t.delete(t);const s=Array.from(this.#t.values());for(const[e,a]of this.#e)s.includes(e)||(o(a.effect),this.#e.delete(e))};ensure(t,s){var e=m,a=k();if(s&&!this.#s.has(t)&&!this.#e.has(t))if(a){var i=document.createDocumentFragment(),f=n();i.append(f),this.#e.set(t,{effect:d(()=>s(f)),fragment:i})}else this.#s.set(t,d(()=>s(this.anchor)));if(this.#t.set(e,t),a){for(const[r,h]of this.#s)r===t?e.unskip_effect(h):e.skip_effect(h);for(const[r,h]of this.#e)r===t?e.unskip_effect(h.effect):e.skip_effect(h.effect);e.oncommit(this.#f),e.ondiscard(this.#r)}else p&&(this.anchor=_),this.#f(e)}}export{w as B};

View File

@ -1 +0,0 @@
import{c as y,a as p,f as _}from"./DCPIP6Ym.js";import{d as j,f as S,h as B,c as i,r as n,b as c,t as v,g as r,u as I}from"./DAfY0XTB.js";import{s as m}from"./D2u1A_4g.js";import{i as q}from"./Br6sCvve.js";import{s as w}from"./DVOkFnep.js";import{s as d}from"./D6E-zrqv.js";import{p as z}from"./B-uV6-Xr.js";import{s as A}from"./utcFFRIM.js";var C=_('<a><span class="mr-1"> </span> </a>'),D=_('<span><span class="mr-1"> </span> </span>');function N(x,o){j(o,!0);let h=z(o,"linked",3,!1);const s=I(()=>A(o.status));var u=y(),b=S(u);{var g=e=>{var t=C(),a=i(t),f=i(a,!0);n(a);var l=c(a);n(t),v(()=>{w(t,"href",`/ketten?status=${o.status??""}`),d(t,1,`inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium ${r(s).color??""} hover:opacity-80 transition-opacity`),m(f,r(s).emoji),m(l,` ${r(s).label??""}`)}),p(e,t)},k=e=>{var t=D(),a=i(t),f=i(a,!0);n(a);var l=c(a);n(t),v(()=>{d(t,1,`inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium ${r(s).color??""}`),m(f,r(s).emoji),m(l,` ${r(s).label??""}`)}),p(e,t)};q(b,e=>{h()&&o.status?e(g):e(k,-1)})}p(x,u),B()}export{N as S};

View File

@ -1 +0,0 @@
import{s as e}from"./3I_XkZiy.js";const r=()=>{const s=e;return{page:{subscribe:s.page.subscribe},navigating:{subscribe:s.navigating.subscribe},updated:s.updated}},b={subscribe(s){return r().page.subscribe(s)}};export{b as p};

View File

@ -1 +1 @@
import{N as o,o as a,al as d}from"./Cjw4vZKn.js";function p(s,u,e){if(s==null)return u(void 0),o;const t=a(()=>s.subscribe(u,e));return t.unsubscribe?()=>t.unsubscribe():t}const i=[];function _(s,u=o){let e=null;const t=new Set;function c(r){if(d(s,r)&&(s=r,e)){const b=!i.length;for(const n of t)n[1](),i.push(n,s);if(b){for(let n=0;n<i.length;n+=2)i[n][0](i[n+1]);i.length=0}}}function f(r){c(r(s))}function l(r,b=o){const n=[r,b];return t.add(n),t.size===1&&(e=u(c,f)||o),r(s),()=>{t.delete(n),t.size===0&&e&&(e(),e=null)}}return{set:c,update:f,subscribe:l}}function h(s){let u;return p(s,e=>u=e)(),u}export{h as g,p as s,_ as w};
import{K as o,o as a,aa as d}from"./reyx9_7L.js";function p(s,u,e){if(s==null)return u(void 0),o;const t=a(()=>s.subscribe(u,e));return t.unsubscribe?()=>t.unsubscribe():t}const i=[];function _(s,u=o){let e=null;const t=new Set;function c(r){if(d(s,r)&&(s=r,e)){const b=!i.length;for(const n of t)n[1](),i.push(n,s);if(b){for(let n=0;n<i.length;n+=2)i[n][0](i[n+1]);i.length=0}}}function f(r){c(r(s))}function l(r,b=o){const n=[r,b];return t.add(n),t.size===1&&(e=u(c,f)||o),r(s),()=>{t.delete(n),t.size===0&&e&&(e(),e=null)}}return{set:c,update:f,subscribe:l}}function h(s){let u;return p(s,e=>u=e)(),u}export{h as g,p as s,_ as w};

View File

@ -1 +0,0 @@
import{F as i,Q as n,R as d,T as v,U as u,V as h,W as l,X as g}from"./Cjw4vZKn.js";const A=Symbol("is custom element"),T=Symbol("is html"),m=h?"link":"LINK";function N(r){if(i){var s=!1,e=()=>{if(!s){if(s=!0,r.hasAttribute("value")){var t=r.value;_(r,"value",null),r.value=t}if(r.hasAttribute("checked")){var o=r.checked;_(r,"checked",null),r.checked=o}}};r.__on_r=e,n(e),d()}}function _(r,s,e,t){var o=p(r);i&&(o[s]=r.getAttribute(s),s==="src"||s==="srcset"||s==="href"&&r.nodeName===m)||o[s]!==(o[s]=e)&&(s==="loading"&&(r[v]=e),e==null?r.removeAttribute(s):typeof e!="string"&&L(r).includes(s)?r[s]=e:r.setAttribute(s,e))}function p(r){return r.__attributes??={[A]:r.nodeName.includes("-"),[T]:r.namespaceURI===u}}var c=new Map;function L(r){var s=r.getAttribute("is")||r.nodeName,e=c.get(s);if(e)return e;c.set(s,e=[]);for(var t,o=r,f=Element.prototype;f!==o;){t=g(o);for(var a in t)t[a].set&&e.push(a);o=l(o)}return e}export{N as r,_ as s};

View File

@ -1 +0,0 @@
import{Y as c,F as o,Z as l,_ as b,a0 as p,a1 as v,a2 as g,a3 as _,a4 as m}from"./Cjw4vZKn.js";import{B as y}from"./6IKeDOr0.js";function T(f,d,h=!1){var n;o&&(n=m,l());var s=new y(f),u=h?b:0;function t(a,r){if(o){var e=p(n);if(a!==parseInt(e.substring(1))){var i=v();g(i),s.anchor=i,_(!1),s.ensure(a,r),_(!0);return}}s.ensure(a,r)}c(()=>{var a=!1;d((r,e=0)=>{a=!0,t(e,r)}),a||t(-1,null)},u)}export{T as i};

View File

@ -0,0 +1 @@
const r=typeof window<"u"&&window.location.port==="5173"?`http://${window.location.hostname}:8099/api`:"/api";async function n(t){const e=await fetch(`${r}${t}`);if(!e.ok)throw new Error(`API error: ${e.status}`);return e.json()}const s=t=>{const e=new URLSearchParams(t).toString();return n(`/vorlagen?${e}`)},c=t=>n(`/vorlagen/${t}`),i=t=>{const e=new URLSearchParams(t).toString();return n(`/ketten?${e}`)},h=t=>n(`/ketten/${t}`);async function a(t,e){const o=await fetch(`${r}${t}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)});if(!o.ok)throw new Error(`API error: ${o.status}`);return o.json()}const f=(t,e)=>a(`/bewertung/vorlagen/${t}`,{anmerkung:e}),g=(t,e)=>a(`/bewertung/ketten/${t}`,{anmerkung:e}),$=t=>n(`/bewertung/status/${t}`),u=t=>n(`/vorlagen/suggest?q=${encodeURIComponent(t)}`),w=()=>n("/fraktionen"),d=(t,e)=>{const o=e?`?jahr=${e}`:"";return n(`/fraktionen/${t}/dashboard${o}`)};export{i as a,c as b,h as c,$ as d,g as e,w as f,u as g,s as h,d as i,f as r};

File diff suppressed because one or more lines are too long

View File

@ -1 +0,0 @@
import{s as f,g as c}from"./DIGUPa-Q.js";import{G as l,M as b,N as a,O as _,g as p,a as d}from"./DAfY0XTB.js";let u=!1,t=Symbol();function v(e,r,n){const s=n[r]??={store:null,source:_(void 0),unsubscribe:a};if(s.store!==e&&!(t in n))if(s.unsubscribe(),s.store=e??null,e==null)s.source.v=void 0,s.unsubscribe=a;else{var i=!0;s.unsubscribe=f(e,o=>{i?s.source.v=o:d(s.source,o)}),i=!1}return e&&t in n?c(e):p(s.source)}function y(){const e={};function r(){l(()=>{for(var n in e)e[n].unsubscribe();b(e,t,{enumerable:!1,value:!0})})}return[e,r]}function N(e){var r=u;try{return u=!1,[e(),u]}finally{u=r}}export{v as a,N as c,y as s};

View File

@ -1 +0,0 @@
import{am as o,an as t,q as c,o as l}from"./Cjw4vZKn.js";function a(e){throw new Error("https://svelte.dev/e/lifecycle_outside_component")}function r(e){t===null&&a(),c&&t.l!==null?u(t).m.push(e):o(()=>{const n=l(e);if(typeof n=="function")return n})}function u(e){var n=e.l;return n.u??={a:[],b:[],m:[]}}export{r as o};

View File

@ -1 +1 @@
import{s as e}from"./CTIvq_GE.js";const r=()=>{const s=e;return{page:{subscribe:s.page.subscribe},navigating:{subscribe:s.navigating.subscribe},updated:s.updated}},b={subscribe(s){return r().page.subscribe(s)}};export{b as p};
import{s as e}from"./BHBF0lbh.js";const r=()=>{const s=e;return{page:{subscribe:s.page.subscribe},navigating:{subscribe:s.navigating.subscribe},updated:s.updated}},b={subscribe(s){return r().page.subscribe(s)}};export{b as p};

View File

@ -1 +0,0 @@
import{A as s,B as v,e as o,G as c,H as b,I as m,J as h}from"./DAfY0XTB.js";function d(e,r,f=!1){if(e.multiple){if(r==null)return;if(!b(r))return m();for(var a of e.options)a.selected=r.includes(i(a));return}for(a of e.options){var t=i(a);if(h(t,r)){a.selected=!0;return}}(!f||r!==void 0)&&(e.selectedIndex=-1)}function y(e){var r=new MutationObserver(()=>{d(e,e.__value)});r.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["value"]}),c(()=>{r.disconnect()})}function S(e,r,f=r){var a=new WeakSet,t=!0;s(e,"change",u=>{var l=u?"[selected]":":checked",n;if(e.multiple)n=[].map.call(e.querySelectorAll(l),i);else{var _=e.querySelector(l)??e.querySelector("option:not([disabled])");n=_&&i(_)}f(n),e.__value=n,v!==null&&a.add(v)}),o(()=>{var u=r();if(e===document.activeElement){var l=v;if(a.has(l))return}if(d(e,u,t),t&&u===void 0){var n=e.querySelector(":checked");n!==null&&(u=i(n),f(u))}e.__value=u,t=!1}),y(e)}function i(e){return"__value"in e?e.__value:e.value}export{S as b};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +0,0 @@
import{l as o,a as r}from"../chunks/CTIvq_GE.js";export{o as load_css,r as start};

View File

@ -0,0 +1 @@
import{l as o,a as r}from"../chunks/BHBF0lbh.js";export{o as load_css,r as start};

View File

@ -1 +0,0 @@
import{l as o,a as r}from"../chunks/3I_XkZiy.js";export{o as load_css,r as start};

View File

@ -1 +0,0 @@
import{a as d,f as x}from"../chunks/Bkzsmr9I.js";import{Y as i,_ as l,b as p,c as n,r as o}from"../chunks/Cjw4vZKn.js";import{B as c}from"../chunks/6IKeDOr0.js";/* empty css */function f(r,s,...e){var t=new c(r);i(()=>{const a=s()??null;t.ensure(a,a&&(m=>a(m,...e)))},l)}const g=!1,u=!1,k=Object.freeze(Object.defineProperty({__proto__:null,prerender:g,ssr:u},Symbol.toStringTag,{value:"Module"}));var v=x('<div class="min-h-screen bg-gray-50"><nav class="bg-white border-b border-gray-200 shadow-sm"><div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"><div class="flex justify-between h-16"><div class="flex items-center space-x-8"><a href="/" class="text-xl font-bold text-gray-900">Antragstracker <span class="text-green-600">Hagen</span></a> <div class="hidden sm:flex space-x-4"><a href="/" class="text-gray-600 hover:text-gray-900 px-3 py-2 rounded-md text-sm font-medium">Dashboard</a> <a href="/ketten" class="text-gray-600 hover:text-gray-900 px-3 py-2 rounded-md text-sm font-medium">Ketten</a> <a href="/vorlagen" class="text-gray-600 hover:text-gray-900 px-3 py-2 rounded-md text-sm font-medium">Vorlagen</a> <a href="/abstimmungen" class="text-gray-600 hover:text-gray-900 px-3 py-2 rounded-md text-sm font-medium">Abstimmungen</a> <a href="/karte" class="text-gray-600 hover:text-gray-900 px-3 py-2 rounded-md text-sm font-medium">Karte</a> <a href="/fraktionen" class="text-gray-600 hover:text-gray-900 px-3 py-2 rounded-md text-sm font-medium">Fraktionen</a></div></div></div></div></nav> <main class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-8"><!></main></div>');function w(r,s){var e=v(),t=p(n(e),2),a=n(t);f(a,()=>s.children),o(t),o(e),d(r,e)}export{w as component,k as universal};

View File

@ -1 +0,0 @@
import{a as d,f as x}from"../chunks/DCPIP6Ym.js";import{Q as i,T as l,b as p,c as n,r as o}from"../chunks/DAfY0XTB.js";import{B as c}from"../chunks/Duumi1XQ.js";/* empty css */function f(r,s,...e){var t=new c(r);i(()=>{const a=s()??null;t.ensure(a,a&&(m=>a(m,...e)))},l)}const g=!1,u=!1,k=Object.freeze(Object.defineProperty({__proto__:null,prerender:g,ssr:u},Symbol.toStringTag,{value:"Module"}));var v=x('<div class="min-h-screen bg-gray-50"><nav class="bg-white border-b border-gray-200 shadow-sm"><div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"><div class="flex justify-between h-16"><div class="flex items-center space-x-8"><a href="/" class="text-xl font-bold text-gray-900">Antragstracker <span class="text-green-600">Hagen</span></a> <div class="hidden sm:flex space-x-4"><a href="/" class="text-gray-600 hover:text-gray-900 px-3 py-2 rounded-md text-sm font-medium">Dashboard</a> <a href="/ketten" class="text-gray-600 hover:text-gray-900 px-3 py-2 rounded-md text-sm font-medium">Ketten</a> <a href="/vorlagen" class="text-gray-600 hover:text-gray-900 px-3 py-2 rounded-md text-sm font-medium">Vorlagen</a> <a href="/abstimmungen" class="text-gray-600 hover:text-gray-900 px-3 py-2 rounded-md text-sm font-medium">Abstimmungen</a> <a href="/karte" class="text-gray-600 hover:text-gray-900 px-3 py-2 rounded-md text-sm font-medium">Karte</a> <a href="/fraktionen" class="text-gray-600 hover:text-gray-900 px-3 py-2 rounded-md text-sm font-medium">Fraktionen</a></div></div></div></div></nav> <main class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-8"><!></main></div>');function w(r,s){var e=v(),t=p(n(e),2),a=n(t);f(a,()=>s.children),o(t),o(e),d(r,e)}export{w as component,k as universal};

View File

@ -0,0 +1 @@
import{d as D,b as d,a as c,f as A,g as B}from"../chunks/B89f14j0.js";import{ai as H,aj as N,t as P,h as t,b as s,g,r,d as i,s as R}from"../chunks/reyx9_7L.js";import{B as V,i as M}from"../chunks/Do7Yo2YN.js";import{s as z}from"../chunks/B-WTs0fq.js";/* empty css */function L(x,p,...e){var l=new V(x);H(()=>{const o=p()??null;l.ensure(o,o&&(m=>o(m,...e)))},N)}const q=!1,G=!1,ee=Object.freeze(Object.defineProperty({__proto__:null,prerender:q,ssr:G},Symbol.toStringTag,{value:"Module"}));var I=B('<svg class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"></path></svg>'),J=B('<svg class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16"></path></svg>'),Q=A('<div class="sm:hidden border-t border-gray-200 bg-white"><div class="px-2 pt-2 pb-3 space-y-1"><a href="/" class="block text-gray-600 hover:text-gray-900 hover:bg-gray-50 px-3 py-3 rounded-md text-base font-medium">Dashboard</a> <a href="/ketten" class="block text-gray-600 hover:text-gray-900 hover:bg-gray-50 px-3 py-3 rounded-md text-base font-medium">Ketten</a> <a href="/vorlagen" class="block text-gray-600 hover:text-gray-900 hover:bg-gray-50 px-3 py-3 rounded-md text-base font-medium">Vorlagen</a> <a href="/abstimmungen" class="block text-gray-600 hover:text-gray-900 hover:bg-gray-50 px-3 py-3 rounded-md text-base font-medium">Abstimmungen</a> <a href="/karte" class="block text-gray-600 hover:text-gray-900 hover:bg-gray-50 px-3 py-3 rounded-md text-base font-medium">Karte</a> <a href="/fraktionen" class="block text-gray-600 hover:text-gray-900 hover:bg-gray-50 px-3 py-3 rounded-md text-base font-medium">Fraktionen</a></div></div>'),U=A('<div class="min-h-screen bg-gray-50"><nav class="bg-white border-b border-gray-200 shadow-sm"><div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"><div class="flex justify-between h-16"><div class="flex items-center"><a href="/" class="text-xl font-bold text-gray-900 shrink-0">Antragstracker <span class="text-green-600">Hagen</span></a> <div class="hidden sm:flex sm:ml-8 space-x-4"><a href="/" class="text-gray-600 hover:text-gray-900 px-3 py-2 rounded-md text-sm font-medium">Dashboard</a> <a href="/ketten" class="text-gray-600 hover:text-gray-900 px-3 py-2 rounded-md text-sm font-medium">Ketten</a> <a href="/vorlagen" class="text-gray-600 hover:text-gray-900 px-3 py-2 rounded-md text-sm font-medium">Vorlagen</a> <a href="/abstimmungen" class="text-gray-600 hover:text-gray-900 px-3 py-2 rounded-md text-sm font-medium">Abstimmungen</a> <a href="/karte" class="text-gray-600 hover:text-gray-900 px-3 py-2 rounded-md text-sm font-medium">Karte</a> <a href="/fraktionen" class="text-gray-600 hover:text-gray-900 px-3 py-2 rounded-md text-sm font-medium">Fraktionen</a></div></div> <div class="flex items-center sm:hidden"><button class="inline-flex items-center justify-center p-3 rounded-md text-gray-500 hover:text-gray-900 hover:bg-gray-100 focus:outline-none focus:ring-2 focus:ring-green-500" aria-label="Hauptmenü"><!></button></div></div></div> <!></nav> <main class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-6 sm:py-8"><!></main></div>');function ae(x,p){let e=R(!1);var l=U(),o=t(l),m=t(o),f=t(m),h=s(t(f),2),v=t(h),F=t(v);{var K=a=>{var n=I();c(a,n)},T=a=>{var n=J();c(a,n)};M(F,a=>{g(e)?a(K):a(T,-1)})}r(v),r(h),r(f),r(m);var C=s(m,2);{var E=a=>{var n=Q(),y=t(n),b=t(y),k=s(b,2),_=s(k,2),w=s(_,2),j=s(w,2),S=s(j,2);r(y),r(n),d("click",b,()=>i(e,!1)),d("click",k,()=>i(e,!1)),d("click",_,()=>i(e,!1)),d("click",w,()=>i(e,!1)),d("click",j,()=>i(e,!1)),d("click",S,()=>i(e,!1)),c(a,n)};M(C,a=>{g(e)&&a(E)})}r(o);var u=s(o,2),O=t(u);L(O,()=>p.children),r(u),r(l),P(()=>z(v,"aria-expanded",g(e))),d("click",v,()=>i(e,!g(e))),c(x,l)}D(["click"]);export{ae as component,ee as universal};

View File

@ -1 +0,0 @@
import{a as b,f as x}from"../chunks/DCPIP6Ym.js";import{an as k,aL as y,am as i,o as $,aM as l,aN as E,g as v,aO as L,x as M,aP as N,d as O,f as P,t as j,h as q,c as u,r as m,b as w}from"../chunks/DAfY0XTB.js";import{s as g}from"../chunks/D2u1A_4g.js";import{s as z,p as _}from"../chunks/CTIvq_GE.js";function A(r=!1){const t=k,e=t.l.u;if(!e)return;let a=()=>L(t.s);if(r){let o=0,s={};const f=M(()=>{let p=!1;const c=t.s;for(const n in c)c[n]!==s[n]&&(s[n]=c[n],p=!0);return p&&o++,o});a=()=>v(f)}e.b.length&&y(()=>{d(t,a),l(e.b)}),i(()=>{const o=$(()=>e.m.map(E));return()=>{for(const s of o)typeof s=="function"&&s()}}),e.a.length&&i(()=>{d(t,a),l(e.a)})}function d(r,t){if(r.l.s)for(const e of r.l.s)v(e);t()}N();const B={get error(){return _.error},get status(){return _.status}};z.updated.check;const h=B;var C=x("<h1> </h1> <p> </p>",1);function I(r,t){O(t,!1),A();var e=C(),a=P(e),o=u(a,!0);m(a);var s=w(a,2),f=u(s,!0);m(s),j(()=>{g(o,h.status),g(f,h.error?.message)}),b(r,e),q()}export{I as component};

View File

@ -1 +0,0 @@
import{a as b,f as x}from"../chunks/Bkzsmr9I.js";import{an as k,aL as y,am as i,o as $,aM as l,aN as E,g as v,aO as L,x as M,aP as N,d as O,f as P,t as j,h as q,c as u,r as m,b as w}from"../chunks/Cjw4vZKn.js";import{s as g}from"../chunks/DfJQ0EIT.js";import{s as z,p as _}from"../chunks/3I_XkZiy.js";function A(r=!1){const t=k,e=t.l.u;if(!e)return;let a=()=>L(t.s);if(r){let o=0,s={};const f=M(()=>{let p=!1;const c=t.s;for(const n in c)c[n]!==s[n]&&(s[n]=c[n],p=!0);return p&&o++,o});a=()=>v(f)}e.b.length&&y(()=>{d(t,a),l(e.b)}),i(()=>{const o=$(()=>e.m.map(E));return()=>{for(const s of o)typeof s=="function"&&s()}}),e.a.length&&i(()=>{d(t,a),l(e.a)})}function d(r,t){if(r.l.s)for(const e of r.l.s)v(e);t()}N();const B={get error(){return _.error},get status(){return _.status}};z.updated.check;const h=B;var C=x("<h1> </h1> <p> </p>",1);function I(r,t){O(t,!1),A();var e=C(),a=P(e),o=u(a,!0);m(a);var s=w(a,2),f=u(s,!0);m(s),j(()=>{g(o,h.status),g(f,h.error?.message)}),b(r,e),q()}export{I as component};

View File

@ -0,0 +1 @@
import{a as b,f as x}from"../chunks/B89f14j0.js";import{ao as k,aY as $,an as i,o as y,aZ as l,a_ as E,g as v,a$ as Y,x as Z,b0 as j,p as q,f as w,t as z,c as A,h as u,r as m,b as B}from"../chunks/reyx9_7L.js";import{s as _}from"../chunks/BwTTNG21.js";import{s as C,p as g}from"../chunks/BHBF0lbh.js";function D(r=!1){const t=k,e=t.l.u;if(!e)return;let a=()=>Y(t.s);if(r){let o=0,s={};const f=Z(()=>{let p=!1;const c=t.s;for(const n in c)c[n]!==s[n]&&(s[n]=c[n],p=!0);return p&&o++,o});a=()=>v(f)}e.b.length&&$(()=>{h(t,a),l(e.b)}),i(()=>{const o=y(()=>e.m.map(E));return()=>{for(const s of o)typeof s=="function"&&s()}}),e.a.length&&i(()=>{h(t,a),l(e.a)})}function h(r,t){if(r.l.s)for(const e of r.l.s)v(e);t()}j();const F={get error(){return g.error},get status(){return g.status}};C.updated.check;const d=F;var G=x("<h1> </h1> <p> </p>",1);function L(r,t){q(t,!1),D();var e=G(),a=w(e),o=u(a,!0);m(a);var s=B(a,2),f=u(s,!0);m(s),z(()=>{_(o,d.status),_(f,d.error?.message)}),b(r,e),A()}export{L as component};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +0,0 @@
import{a as l,f as v}from"../chunks/DCPIP6Ym.js";import{p as S,s as $,t as m,a as u,g as o,e as Q,$ as T,b as d,c as s,r as a,n as _}from"../chunks/DAfY0XTB.js";import{s as n}from"../chunks/D2u1A_4g.js";import{i as U}from"../chunks/Br6sCvve.js";import{h as W,e as X,i as Y}from"../chunks/CBOKTDOo.js";/* empty css */var ee=v('<div class="p-6 text-center text-red-500"> </div>'),te=v('<div class="p-6 text-center text-gray-500"> </div>'),ae=v('<div class="p-6 text-center text-gray-500">Keine Anträge gefunden</div>'),se=v('<li class="px-6 py-4 hover:bg-gray-50 cursor-pointer"><div class="flex justify-between items-start"><div class="flex-1"><div class="flex items-center gap-2"><span class="font-mono text-sm text-green-700 bg-green-50 px-2 py-0.5 rounded"> </span> <span class="text-xs text-gray-400"> </span></div> <p class="mt-1 text-gray-700 line-clamp-2"> </p></div> <span class="text-xs px-2 py-1 rounded-full bg-yellow-100 text-yellow-800">⏳ offen</span></div></li>'),re=v('<ul class="divide-y divide-gray-100"></ul>'),oe=v('<main class="min-h-screen bg-gray-50"><header class="bg-green-700 text-white py-6 shadow-lg"><div class="max-w-6xl mx-auto px-4"><h1 class="text-3xl font-bold">🏛️ Antragstracker Hagen</h1> <p class="text-green-100 mt-1">Kommunale Anträge & Anfragen nachverfolgen</p></div></header> <div class="max-w-6xl mx-auto px-4 py-8"><div class="grid grid-cols-2 md:grid-cols-4 gap-4 mb-8"><div class="bg-white rounded-lg shadow p-4 text-center"><div class="text-3xl font-bold text-green-600"> </div> <div class="text-gray-500 text-sm">Vorlagen</div></div> <div class="bg-white rounded-lg shadow p-4 text-center"><div class="text-3xl font-bold text-blue-600"> </div> <div class="text-gray-500 text-sm">Ketten</div></div> <div class="bg-white rounded-lg shadow p-4 text-center"><div class="text-3xl font-bold text-purple-600">41</div> <div class="text-gray-500 text-sm">Gremien</div></div> <div class="bg-white rounded-lg shadow p-4 text-center"><div class="text-3xl font-bold text-orange-600">20042026</div> <div class="text-gray-500 text-sm">Zeitraum</div></div></div> <section class="bg-white rounded-lg shadow"><div class="px-6 py-4 border-b border-gray-200"><h2 class="text-xl font-semibold text-gray-800">📋 Aktuelle Anträge</h2></div> <!></section></div></main>');function ge(K){let g=S({vorlagen:0,beratungen:0,ketten:0,gremien:0}),x=$(S([])),R=$(!0),p=$("");const i=typeof window<"u"&&window.location.port==="5173"?`http://${window.location.hostname}:8099/api`:"/api";async function B(){console.log("API_BASE:",i);try{console.log("Fetching health...");const e=await fetch(`${i}/health`);if(console.log("Health response:",e.status),e.ok){console.log("Fetching vorlagen...");const r=await fetch(`${i}/vorlagen?page_size=1`);console.log("Vorlagen response:",r.status);const c=await r.json();g.vorlagen=c.total;const f=await(await fetch(`${i}/ketten?page_size=1`)).json();g.ketten=f.total}else u(p,`Health check failed: ${e.status}`);const t=await fetch(`${i}/vorlagen?typ=antrag&page_size=10`);if(console.log("Antraege response:",t.status),t.ok){const r=await t.json();console.log("Antraege data:",r.items.length),u(x,r.items,!0)}}catch(e){console.error("API Fehler:",e),u(p,`Fehler: ${e}`)}finally{u(R,!1),console.log("Loading done, antraege:",o(x).length)}}B();var w=oe();W("1uha8ag",e=>{Q(()=>{T.title="Antragstracker Hagen"})});var j=d(s(w),2),y=s(j),b=s(y),z=s(b),E=s(z,!0);a(z),_(2),a(b);var D=d(b,2),F=s(D),V=s(F,!0);a(F),_(2),a(D),_(4),a(y);var H=d(y,2),G=d(s(H),2);{var Z=e=>{var t=ee(),r=s(t,!0);a(t),m(()=>n(r,o(p))),l(e,t)},q=e=>{var t=te(),r=s(t);a(t),m(()=>n(r,`Lade Daten... (API: ${i})`)),l(e,t)},C=e=>{var t=ae();l(e,t)},J=e=>{var t=re();X(t,21,()=>o(x),Y,(r,c)=>{var h=se(),f=s(h),I=s(f),k=s(I),A=s(k),M=s(A,!0);a(A);var L=d(A,2),N=s(L,!0);a(L),a(k);var P=d(k,2),O=s(P,!0);a(P),a(I),_(2),a(f),a(h),m(()=>{n(M,o(c).aktenzeichen),n(N,o(c).datum_eingang),n(O,o(c).betreff)}),l(r,h)}),a(t),l(e,t)};U(G,e=>{o(p)?e(Z):o(R)?e(q,1):o(x).length===0?e(C,2):e(J,-1)})}a(H),a(j),a(w),m((e,t)=>{n(E,e),n(V,t)},[()=>g.vorlagen.toLocaleString(),()=>g.ketten.toLocaleString()]),l(K,w)}export{ge as component};

View File

@ -1 +0,0 @@
import{a as l,f as v}from"../chunks/Bkzsmr9I.js";import{p as S,s as $,t as m,a as u,g as o,e as Q,$ as T,b as d,c as s,r as a,n as _}from"../chunks/Cjw4vZKn.js";import{s as n}from"../chunks/DfJQ0EIT.js";import{i as U}from"../chunks/kjB3f-xG.js";import{h as W,e as X,i as Y}from"../chunks/DaCWmHjB.js";/* empty css */var ee=v('<div class="p-6 text-center text-red-500"> </div>'),te=v('<div class="p-6 text-center text-gray-500"> </div>'),ae=v('<div class="p-6 text-center text-gray-500">Keine Anträge gefunden</div>'),se=v('<li class="px-6 py-4 hover:bg-gray-50 cursor-pointer"><div class="flex justify-between items-start"><div class="flex-1"><div class="flex items-center gap-2"><span class="font-mono text-sm text-green-700 bg-green-50 px-2 py-0.5 rounded"> </span> <span class="text-xs text-gray-400"> </span></div> <p class="mt-1 text-gray-700 line-clamp-2"> </p></div> <span class="text-xs px-2 py-1 rounded-full bg-yellow-100 text-yellow-800">⏳ offen</span></div></li>'),re=v('<ul class="divide-y divide-gray-100"></ul>'),oe=v('<main class="min-h-screen bg-gray-50"><header class="bg-green-700 text-white py-6 shadow-lg"><div class="max-w-6xl mx-auto px-4"><h1 class="text-3xl font-bold">🏛️ Antragstracker Hagen</h1> <p class="text-green-100 mt-1">Kommunale Anträge & Anfragen nachverfolgen</p></div></header> <div class="max-w-6xl mx-auto px-4 py-8"><div class="grid grid-cols-2 md:grid-cols-4 gap-4 mb-8"><div class="bg-white rounded-lg shadow p-4 text-center"><div class="text-3xl font-bold text-green-600"> </div> <div class="text-gray-500 text-sm">Vorlagen</div></div> <div class="bg-white rounded-lg shadow p-4 text-center"><div class="text-3xl font-bold text-blue-600"> </div> <div class="text-gray-500 text-sm">Ketten</div></div> <div class="bg-white rounded-lg shadow p-4 text-center"><div class="text-3xl font-bold text-purple-600">41</div> <div class="text-gray-500 text-sm">Gremien</div></div> <div class="bg-white rounded-lg shadow p-4 text-center"><div class="text-3xl font-bold text-orange-600">20042026</div> <div class="text-gray-500 text-sm">Zeitraum</div></div></div> <section class="bg-white rounded-lg shadow"><div class="px-6 py-4 border-b border-gray-200"><h2 class="text-xl font-semibold text-gray-800">📋 Aktuelle Anträge</h2></div> <!></section></div></main>');function ge(K){let g=S({vorlagen:0,beratungen:0,ketten:0,gremien:0}),x=$(S([])),R=$(!0),p=$("");const i=typeof window<"u"&&window.location.port==="5173"?`http://${window.location.hostname}:8099/api`:"/api";async function B(){console.log("API_BASE:",i);try{console.log("Fetching health...");const e=await fetch(`${i}/health`);if(console.log("Health response:",e.status),e.ok){console.log("Fetching vorlagen...");const r=await fetch(`${i}/vorlagen?page_size=1`);console.log("Vorlagen response:",r.status);const c=await r.json();g.vorlagen=c.total;const f=await(await fetch(`${i}/ketten?page_size=1`)).json();g.ketten=f.total}else u(p,`Health check failed: ${e.status}`);const t=await fetch(`${i}/vorlagen?typ=antrag&page_size=10`);if(console.log("Antraege response:",t.status),t.ok){const r=await t.json();console.log("Antraege data:",r.items.length),u(x,r.items,!0)}}catch(e){console.error("API Fehler:",e),u(p,`Fehler: ${e}`)}finally{u(R,!1),console.log("Loading done, antraege:",o(x).length)}}B();var w=oe();W("1uha8ag",e=>{Q(()=>{T.title="Antragstracker Hagen"})});var j=d(s(w),2),y=s(j),b=s(y),z=s(b),E=s(z,!0);a(z),_(2),a(b);var D=d(b,2),F=s(D),V=s(F,!0);a(F),_(2),a(D),_(4),a(y);var H=d(y,2),G=d(s(H),2);{var Z=e=>{var t=ee(),r=s(t,!0);a(t),m(()=>n(r,o(p))),l(e,t)},q=e=>{var t=te(),r=s(t);a(t),m(()=>n(r,`Lade Daten... (API: ${i})`)),l(e,t)},C=e=>{var t=ae();l(e,t)},J=e=>{var t=re();X(t,21,()=>o(x),Y,(r,c)=>{var h=se(),f=s(h),I=s(f),k=s(I),A=s(k),M=s(A,!0);a(A);var L=d(A,2),N=s(L,!0);a(L),a(k);var P=d(k,2),O=s(P,!0);a(P),a(I),_(2),a(f),a(h),m(()=>{n(M,o(c).aktenzeichen),n(N,o(c).datum_eingang),n(O,o(c).betreff)}),l(r,h)}),a(t),l(e,t)};U(G,e=>{o(p)?e(Z):o(R)?e(q,1):o(x).length===0?e(C,2):e(J,-1)})}a(H),a(j),a(w),m((e,t)=>{n(E,e),n(V,t)},[()=>g.vorlagen.toLocaleString(),()=>g.ketten.toLocaleString()]),l(K,w)}export{ge as component};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
import{a as l,f as n}from"../chunks/B89f14j0.js";import{o as L}from"../chunks/DrzKg1h1.js";import{p as M,s as _,a as j,c as q,e as B,b as c,h as i,d as h,$ as C,g as a,r as e,n as D,t as E}from"../chunks/reyx9_7L.js";import{s as f}from"../chunks/BwTTNG21.js";import{i as G}from"../chunks/Do7Yo2YN.js";import{h as I,e as J,i as K}from"../chunks/D5EBvEcH.js";import{s as N}from"../chunks/B-WTs0fq.js";import{s as u}from"../chunks/DnBxR3jh.js";import{f as O}from"../chunks/nhOotKLT.js";var P=n('<div class="text-gray-500">Laden...</div>'),Q=n('<a class="block p-4 rounded-lg border hover:shadow-md transition-shadow"><div class="font-bold text-lg"> </div> <div class="text-sm text-gray-600"> </div> <div class="mt-2 text-2xl font-semibold"> </div> <div class="text-xs text-gray-500">Anträge & Anfragen</div></a>'),R=n('<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4"></div>'),S=n('<div class="max-w-4xl mx-auto"><h1 class="text-2xl font-bold mb-6">Fraktionen</h1> <!></div>');function ra(b,k){M(k,!0);let p=_(j([])),x=_(!0);L(async()=>{h(p,await O(),!0),h(x,!1)});var v=S();I("caopi2",t=>{B(()=>{C.title="Fraktionen — Antragstracker Hagen"})});var y=c(i(v),2);{var $=t=>{var s=P();l(t,s)},w=t=>{var s=R();J(s,21,()=>a(p),K,(z,r)=>{var o=Q(),d=i(o),A=i(d,!0);e(d);var m=c(d,2),F=i(m,!0);e(m);var g=c(m,2),H=i(g,!0);e(g),D(2),e(o),E(()=>{N(o,"href",`/fraktionen/${a(r).kuerzel??""}`),u(o,`border-left: 4px solid ${(a(r).farbe||"#6b7280")??""}`),u(d,`color: ${(a(r).farbe||"#374151")??""}`),f(A,a(r).kuerzel),f(F,a(r).name),f(H,a(r).anzahl)}),l(z,o)}),e(s),l(t,s)};G(y,t=>{a(x)?t($):t(w,-1)})}e(v),l(b,v),q()}export{ra as component};

View File

@ -1 +0,0 @@
import{a as l,f as n}from"../chunks/Bkzsmr9I.js";import{o as L}from"../chunks/trpXq522.js";import{d as M,s as _,p as j,h as q,e as B,b as c,c as i,a as h,$ as C,g as a,r as e,n as D,t as E}from"../chunks/Cjw4vZKn.js";import{s as f}from"../chunks/DfJQ0EIT.js";import{i as G}from"../chunks/kjB3f-xG.js";import{h as I,e as J,i as K}from"../chunks/DaCWmHjB.js";import{s as N}from"../chunks/RVjQLo13.js";import{s as u}from"../chunks/QfvBL-nR.js";import{f as O}from"../chunks/Cgke0YGN.js";var P=n('<div class="text-gray-500">Laden...</div>'),Q=n('<a class="block p-4 rounded-lg border hover:shadow-md transition-shadow"><div class="font-bold text-lg"> </div> <div class="text-sm text-gray-600"> </div> <div class="mt-2 text-2xl font-semibold"> </div> <div class="text-xs text-gray-500">Anträge & Anfragen</div></a>'),R=n('<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4"></div>'),S=n('<div class="max-w-4xl mx-auto p-6"><h1 class="text-2xl font-bold mb-6">Fraktionen</h1> <!></div>');function ra(b,k){M(k,!0);let p=_(j([])),x=_(!0);L(async()=>{h(p,await O(),!0),h(x,!1)});var v=S();I("caopi2",t=>{B(()=>{C.title="Fraktionen — Antragstracker Hagen"})});var y=c(i(v),2);{var $=t=>{var s=P();l(t,s)},w=t=>{var s=R();J(s,21,()=>a(p),K,(z,r)=>{var o=Q(),d=i(o),A=i(d,!0);e(d);var m=c(d,2),F=i(m,!0);e(m);var g=c(m,2),H=i(g,!0);e(g),D(2),e(o),E(()=>{N(o,"href",`/fraktionen/${a(r).kuerzel??""}`),u(o,`border-left: 4px solid ${(a(r).farbe||"#6b7280")??""}`),u(d,`color: ${(a(r).farbe||"#374151")??""}`),f(A,a(r).kuerzel),f(F,a(r).name),f(H,a(r).anzahl)}),l(z,o)}),e(s),l(t,s)};G(y,t=>{a(x)?t($):t(w,-1)})}e(v),l(b,v),q()}export{ra as component};

View File

@ -1 +0,0 @@
import{a as l,f as n}from"../chunks/DCPIP6Ym.js";import{o as L}from"../chunks/DDErvS7v.js";import{d as M,s as _,p as j,h as q,e as B,b as c,c as i,a as h,$ as C,g as a,r as e,n as D,t as E}from"../chunks/DAfY0XTB.js";import{s as f}from"../chunks/D2u1A_4g.js";import{i as G}from"../chunks/Br6sCvve.js";import{h as I,e as J,i as K}from"../chunks/CBOKTDOo.js";import{s as N}from"../chunks/DVOkFnep.js";import{s as u}from"../chunks/C-x9yHfs.js";import{f as O}from"../chunks/Cgke0YGN.js";var P=n('<div class="text-gray-500">Laden...</div>'),Q=n('<a class="block p-4 rounded-lg border hover:shadow-md transition-shadow"><div class="font-bold text-lg"> </div> <div class="text-sm text-gray-600"> </div> <div class="mt-2 text-2xl font-semibold"> </div> <div class="text-xs text-gray-500">Anträge & Anfragen</div></a>'),R=n('<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4"></div>'),S=n('<div class="max-w-4xl mx-auto p-6"><h1 class="text-2xl font-bold mb-6">Fraktionen</h1> <!></div>');function ra(b,k){M(k,!0);let p=_(j([])),x=_(!0);L(async()=>{h(p,await O(),!0),h(x,!1)});var v=S();I("caopi2",t=>{B(()=>{C.title="Fraktionen — Antragstracker Hagen"})});var y=c(i(v),2);{var $=t=>{var s=P();l(t,s)},w=t=>{var s=R();J(s,21,()=>a(p),K,(z,r)=>{var o=Q(),d=i(o),A=i(d,!0);e(d);var m=c(d,2),F=i(m,!0);e(m);var g=c(m,2),H=i(g,!0);e(g),D(2),e(o),E(()=>{N(o,"href",`/fraktionen/${a(r).kuerzel??""}`),u(o,`border-left: 4px solid ${(a(r).farbe||"#6b7280")??""}`),u(d,`color: ${(a(r).farbe||"#374151")??""}`),f(A,a(r).kuerzel),f(F,a(r).name),f(H,a(r).anzahl)}),l(z,o)}),e(s),l(t,s)};G(y,t=>{a(x)?t($):t(w,-1)})}e(v),l(b,v),q()}export{ra as component};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,6 +1,6 @@
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["../assets/leaflet.CIGW-MKW.css"])))=>i.map(i=>d[i]);
import{_ as S}from"../chunks/PPVm8Dsz.js";import{a as l,f as n}from"../chunks/DCPIP6Ym.js";import{o as de}from"../chunks/DDErvS7v.js";import{d as ce,s as u,p as B,b as i,f as ve,t as _,h as pe,e as ge,c as r,g as o,$ as me,r as a,a as h}from"../chunks/DAfY0XTB.js";import{d as fe,s as d,a as ue}from"../chunks/D2u1A_4g.js";import{i as L}from"../chunks/Br6sCvve.js";import{h as _e,e as Z,i as q}from"../chunks/CBOKTDOo.js";import{s as he}from"../chunks/DVOkFnep.js";import{s as xe}from"../chunks/D6E-zrqv.js";var be=n('<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css"/>'),ye=n('<div class="h-[500px] flex items-center justify-center"><div class="animate-spin rounded-full h-12 w-12 border-b-2 border-green-600"></div></div>'),we=n('<div id="map" class="h-[500px]"></div>'),ke=n('<li><a class="block p-2 rounded-lg border border-gray-100 hover:bg-gray-50 transition-colors"><div class="flex items-center gap-2"><span class="font-mono text-xs font-medium text-green-700"> </span> <span class="text-xs px-1.5 py-0.5 rounded bg-gray-100 text-gray-500"> </span></div> <p class="text-xs text-gray-600 mt-1 line-clamp-2"> </p></a></li>'),Oe=n('<ul class="space-y-2"></ul>'),Ae=n('<div class="bg-white rounded-xl shadow-sm border border-gray-200 p-6"><h2 class="text-lg font-semibold text-gray-900 mb-2"> </h2> <p class="text-sm text-gray-500 mb-4"> </p> <!></div>'),Ee=n('<div class="bg-white rounded-xl shadow-sm border border-gray-200 p-6"><p class="text-gray-500 text-sm">Klicke auf einen Marker um die zugehörigen Vorlagen zu sehen.</p></div>'),$e=n('<li><button><span class="font-medium"> </span> <span class="text-gray-400 ml-2"> </span></button></li>'),Ve=n('<div class="mb-6"><h1 class="text-2xl font-bold text-gray-900">📍 Anträge auf der Karte</h1> <p class="text-gray-500 text-sm mt-1">Orte aus Anträgen und Anfragen in Hagen</p></div> <div class="grid grid-cols-1 lg:grid-cols-3 gap-6"><div class="lg:col-span-2"><div class="bg-white rounded-xl shadow-sm border border-gray-200 overflow-hidden"><!></div> <div class="mt-4 text-sm text-gray-500"> </div></div> <div class="space-y-6"><!> <div class="bg-white rounded-xl shadow-sm border border-gray-200 p-6"><h2 class="text-lg font-semibold text-gray-900 mb-4">🗺️ Alle Orte</h2> <ul class="space-y-1 max-h-80 overflow-y-auto"></ul></div></div></div>',1);function Ke(J,Q){ce(Q,!0);let g=u(B([])),p=u(null),x=u(B([])),P=u(!0),b=null;const T=typeof window<"u"&&window.location.port==="5173"?`http://${window.location.hostname}:8099/api`:"/api",U=[51.361,7.476],W=12;async function X(){try{const t=await fetch(`${T}/orte`);t.ok&&h(g,await t.json(),!0)}catch(t){console.error("Fehler beim Laden der Orte:",t)}finally{h(P,!1)}}async function H(t){h(p,t,!0);try{const e=await fetch(`${T}/orte/${t.id}/vorlagen`);e.ok&&h(x,await e.json(),!0)}catch(e){console.error("Fehler:",e)}}de(async()=>{await X();const t=await S(()=>import("../chunks/CjPBq9Bq.js").then(e=>e.l),[],import.meta.url);await S(()=>Promise.resolve({}),__vite__mapDeps([0]),import.meta.url),b=t.map("map").setView(U,W),t.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",{attribution:'&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a>'}).addTo(b);for(const e of o(g)){const s=t.circleMarker([e.lat,e.lon],{radius:Math.min(8+e.vorlage_count*2,20),fillColor:"#16a34a",color:"#166534",weight:2,opacity:1,fillOpacity:.7}).addTo(b);s.bindPopup(`
import{_ as S}from"../chunks/PPVm8Dsz.js";import{d as de,a as l,f as n,b as ce}from"../chunks/B89f14j0.js";import{o as ve}from"../chunks/DrzKg1h1.js";import{p as pe,s as u,a as B,b as i,f as ge,t as _,c as me,e as fe,h as r,g as o,$ as ue,r as a,d as h}from"../chunks/reyx9_7L.js";import{s as d}from"../chunks/BwTTNG21.js";import{i as L}from"../chunks/Do7Yo2YN.js";import{h as _e,e as Z,i as q}from"../chunks/D5EBvEcH.js";import{s as he}from"../chunks/B-WTs0fq.js";import{s as xe}from"../chunks/C7sCDBjT.js";var be=n('<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css"/>'),ye=n('<div class="h-[500px] flex items-center justify-center"><div class="animate-spin rounded-full h-12 w-12 border-b-2 border-green-600"></div></div>'),we=n('<div id="map" class="h-[500px]"></div>'),ke=n('<li><a class="block p-2 rounded-lg border border-gray-100 hover:bg-gray-50 transition-colors"><div class="flex items-center gap-2"><span class="font-mono text-xs font-medium text-green-700"> </span> <span class="text-xs px-1.5 py-0.5 rounded bg-gray-100 text-gray-500"> </span></div> <p class="text-xs text-gray-600 mt-1 line-clamp-2"> </p></a></li>'),Oe=n('<ul class="space-y-2"></ul>'),Ae=n('<div class="bg-white rounded-xl shadow-sm border border-gray-200 p-6"><h2 class="text-lg font-semibold text-gray-900 mb-2"> </h2> <p class="text-sm text-gray-500 mb-4"> </p> <!></div>'),Ee=n('<div class="bg-white rounded-xl shadow-sm border border-gray-200 p-6"><p class="text-gray-500 text-sm">Klicke auf einen Marker um die zugehörigen Vorlagen zu sehen.</p></div>'),$e=n('<li><button><span class="font-medium"> </span> <span class="text-gray-400 ml-2"> </span></button></li>'),Ve=n('<div class="mb-6"><h1 class="text-2xl font-bold text-gray-900">📍 Anträge auf der Karte</h1> <p class="text-gray-500 text-sm mt-1">Orte aus Anträgen und Anfragen in Hagen</p></div> <div class="grid grid-cols-1 lg:grid-cols-3 gap-6"><div class="lg:col-span-2"><div class="bg-white rounded-xl shadow-sm border border-gray-200 overflow-hidden"><!></div> <div class="mt-4 text-sm text-gray-500"> </div></div> <div class="space-y-6"><!> <div class="bg-white rounded-xl shadow-sm border border-gray-200 p-6"><h2 class="text-lg font-semibold text-gray-900 mb-4">🗺️ Alle Orte</h2> <ul class="space-y-1 max-h-80 overflow-y-auto"></ul></div></div></div>',1);function Ke(J,Q){pe(Q,!0);let g=u(B([])),p=u(null),x=u(B([])),P=u(!0),b=null;const T=typeof window<"u"&&window.location.port==="5173"?`http://${window.location.hostname}:8099/api`:"/api",U=[51.361,7.476],W=12;async function X(){try{const t=await fetch(`${T}/orte`);t.ok&&h(g,await t.json(),!0)}catch(t){console.error("Fehler beim Laden der Orte:",t)}finally{h(P,!1)}}async function H(t){h(p,t,!0);try{const e=await fetch(`${T}/orte/${t.id}/vorlagen`);e.ok&&h(x,await e.json(),!0)}catch(e){console.error("Fehler:",e)}}ve(async()=>{await X();const t=await S(()=>import("../chunks/CjPBq9Bq.js").then(e=>e.l),[],import.meta.url);await S(()=>Promise.resolve({}),__vite__mapDeps([0]),import.meta.url),b=t.map("map").setView(U,W),t.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",{attribution:'&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a>'}).addTo(b);for(const e of o(g)){const s=t.circleMarker([e.lat,e.lon],{radius:Math.min(8+e.vorlage_count*2,20),fillColor:"#16a34a",color:"#166534",weight:2,opacity:1,fillOpacity:.7}).addTo(b);s.bindPopup(`
<strong>${e.name}</strong><br>
${e.vorlage_count} Vorlage(n)
`),s.on("click",()=>H(e))}});var j=Ve();_e("hbihfm",t=>{var e=be();ge(()=>{me.title="Karte - Antragstracker Hagen"}),l(t,e)});var G=i(ve(j),2),y=r(G),w=r(y),Y=r(w);{var ee=t=>{var e=ye();l(t,e)},te=t=>{var e=we();l(t,e)};L(Y,t=>{o(P)?t(ee):t(te,-1)})}a(w);var I=i(w,2),ae=r(I);a(I),a(y);var K=i(y,2),N=r(K);{var re=t=>{var e=Ae(),s=r(e),v=r(s,!0);a(s);var c=i(s,2),k=r(c);a(c);var m=i(c,2);{var O=A=>{var E=Oe();Z(E,21,()=>o(x),q,(se,f)=>{var $=ke(),V=r($),M=r(V),z=r(M),ie=r(z,!0);a(z);var D=i(z,2),le=r(D,!0);a(D),a(M);var F=i(M,2),ne=r(F,!0);a(F),a(V),a($),_(()=>{he(V,"href",`/vorlagen/${o(f).id??""}`),d(ie,o(f).aktenzeichen),d(le,o(f).typ),d(ne,o(f).betreff)}),l(se,$)}),a(E),l(A,E)};L(m,A=>{o(x).length>0&&A(O)})}a(e),_(()=>{d(v,o(p).name),d(k,`${o(p).vorlage_count??""} Vorlage(n) betreffen diesen Ort`)}),l(t,e)},oe=t=>{var e=Ee();l(t,e)};L(N,t=>{o(p)?t(re):t(oe,-1)})}var R=i(N,2),C=i(r(R),2);Z(C,21,()=>o(g),q,(t,e)=>{var s=$e(),v=r(s),c=r(v),k=r(c,!0);a(c);var m=i(c,2),O=r(m);a(m),a(v),a(s),_(()=>{xe(v,1,`w-full text-left px-3 py-2 rounded-lg hover:bg-gray-50 transition-colors text-sm
${o(p)?.id===o(e).id?"bg-green-50 text-green-700":"text-gray-700"}`),d(k,o(e).name),d(O,`(${o(e).vorlage_count??""})`)}),ue("click",v,()=>H(o(e))),l(t,s)}),a(C),a(R),a(K),a(G),_(()=>d(ae,`${o(g).length??""} Orte geocodiert Marker-Größe = Anzahl Vorlagen`)),l(J,j),pe()}fe(["click"]);export{Ke as component};
`),s.on("click",()=>H(e))}});var j=Ve();_e("hbihfm",t=>{var e=be();fe(()=>{ue.title="Karte - Antragstracker Hagen"}),l(t,e)});var G=i(ge(j),2),y=r(G),w=r(y),Y=r(w);{var ee=t=>{var e=ye();l(t,e)},te=t=>{var e=we();l(t,e)};L(Y,t=>{o(P)?t(ee):t(te,-1)})}a(w);var I=i(w,2),ae=r(I);a(I),a(y);var K=i(y,2),N=r(K);{var re=t=>{var e=Ae(),s=r(e),v=r(s,!0);a(s);var c=i(s,2),k=r(c);a(c);var m=i(c,2);{var O=A=>{var E=Oe();Z(E,21,()=>o(x),q,(se,f)=>{var $=ke(),V=r($),M=r(V),z=r(M),ie=r(z,!0);a(z);var D=i(z,2),le=r(D,!0);a(D),a(M);var F=i(M,2),ne=r(F,!0);a(F),a(V),a($),_(()=>{he(V,"href",`/vorlagen/${o(f).id??""}`),d(ie,o(f).aktenzeichen),d(le,o(f).typ),d(ne,o(f).betreff)}),l(se,$)}),a(E),l(A,E)};L(m,A=>{o(x).length>0&&A(O)})}a(e),_(()=>{d(v,o(p).name),d(k,`${o(p).vorlage_count??""} Vorlage(n) betreffen diesen Ort`)}),l(t,e)},oe=t=>{var e=Ee();l(t,e)};L(N,t=>{o(p)?t(re):t(oe,-1)})}var R=i(N,2),C=i(r(R),2);Z(C,21,()=>o(g),q,(t,e)=>{var s=$e(),v=r(s),c=r(v),k=r(c,!0);a(c);var m=i(c,2),O=r(m);a(m),a(v),a(s),_(()=>{xe(v,1,`w-full text-left px-3 py-2 rounded-lg hover:bg-gray-50 transition-colors text-sm
${o(p)?.id===o(e).id?"bg-green-50 text-green-700":"text-gray-700"}`),d(k,o(e).name),d(O,`(${o(e).vorlage_count??""})`)}),ce("click",v,()=>H(o(e))),l(t,s)}),a(C),a(R),a(K),a(G),_(()=>d(ae,`${o(g).length??""} Orte geocodiert Marker-Größe = Anzahl Vorlagen`)),l(J,j),me()}de(["click"]);export{Ke as component};

View File

@ -1,6 +0,0 @@
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["../assets/leaflet.CIGW-MKW.css"])))=>i.map(i=>d[i]);
import{_ as S}from"../chunks/PPVm8Dsz.js";import{a as l,f as n}from"../chunks/Bkzsmr9I.js";import{o as de}from"../chunks/trpXq522.js";import{d as ce,s as u,p as B,b as i,f as ve,t as _,h as pe,e as ge,c as r,g as o,$ as me,r as a,a as h}from"../chunks/Cjw4vZKn.js";import{d as fe,s as d,a as ue}from"../chunks/DfJQ0EIT.js";import{i as L}from"../chunks/kjB3f-xG.js";import{h as _e,e as Z,i as q}from"../chunks/DaCWmHjB.js";import{s as he}from"../chunks/RVjQLo13.js";import{s as xe}from"../chunks/CWOupeSg.js";var be=n('<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css"/>'),ye=n('<div class="h-[500px] flex items-center justify-center"><div class="animate-spin rounded-full h-12 w-12 border-b-2 border-green-600"></div></div>'),we=n('<div id="map" class="h-[500px]"></div>'),ke=n('<li><a class="block p-2 rounded-lg border border-gray-100 hover:bg-gray-50 transition-colors"><div class="flex items-center gap-2"><span class="font-mono text-xs font-medium text-green-700"> </span> <span class="text-xs px-1.5 py-0.5 rounded bg-gray-100 text-gray-500"> </span></div> <p class="text-xs text-gray-600 mt-1 line-clamp-2"> </p></a></li>'),Oe=n('<ul class="space-y-2"></ul>'),Ae=n('<div class="bg-white rounded-xl shadow-sm border border-gray-200 p-6"><h2 class="text-lg font-semibold text-gray-900 mb-2"> </h2> <p class="text-sm text-gray-500 mb-4"> </p> <!></div>'),Ee=n('<div class="bg-white rounded-xl shadow-sm border border-gray-200 p-6"><p class="text-gray-500 text-sm">Klicke auf einen Marker um die zugehörigen Vorlagen zu sehen.</p></div>'),$e=n('<li><button><span class="font-medium"> </span> <span class="text-gray-400 ml-2"> </span></button></li>'),Ve=n('<div class="mb-6"><h1 class="text-2xl font-bold text-gray-900">📍 Anträge auf der Karte</h1> <p class="text-gray-500 text-sm mt-1">Orte aus Anträgen und Anfragen in Hagen</p></div> <div class="grid grid-cols-1 lg:grid-cols-3 gap-6"><div class="lg:col-span-2"><div class="bg-white rounded-xl shadow-sm border border-gray-200 overflow-hidden"><!></div> <div class="mt-4 text-sm text-gray-500"> </div></div> <div class="space-y-6"><!> <div class="bg-white rounded-xl shadow-sm border border-gray-200 p-6"><h2 class="text-lg font-semibold text-gray-900 mb-4">🗺️ Alle Orte</h2> <ul class="space-y-1 max-h-80 overflow-y-auto"></ul></div></div></div>',1);function Ke(J,Q){ce(Q,!0);let g=u(B([])),p=u(null),x=u(B([])),P=u(!0),b=null;const T=typeof window<"u"&&window.location.port==="5173"?`http://${window.location.hostname}:8099/api`:"/api",U=[51.361,7.476],W=12;async function X(){try{const t=await fetch(`${T}/orte`);t.ok&&h(g,await t.json(),!0)}catch(t){console.error("Fehler beim Laden der Orte:",t)}finally{h(P,!1)}}async function H(t){h(p,t,!0);try{const e=await fetch(`${T}/orte/${t.id}/vorlagen`);e.ok&&h(x,await e.json(),!0)}catch(e){console.error("Fehler:",e)}}de(async()=>{await X();const t=await S(()=>import("../chunks/CjPBq9Bq.js").then(e=>e.l),[],import.meta.url);await S(()=>Promise.resolve({}),__vite__mapDeps([0]),import.meta.url),b=t.map("map").setView(U,W),t.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",{attribution:'&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a>'}).addTo(b);for(const e of o(g)){const s=t.circleMarker([e.lat,e.lon],{radius:Math.min(8+e.vorlage_count*2,20),fillColor:"#16a34a",color:"#166534",weight:2,opacity:1,fillOpacity:.7}).addTo(b);s.bindPopup(`
<strong>${e.name}</strong><br>
${e.vorlage_count} Vorlage(n)
`),s.on("click",()=>H(e))}});var j=Ve();_e("hbihfm",t=>{var e=be();ge(()=>{me.title="Karte - Antragstracker Hagen"}),l(t,e)});var G=i(ve(j),2),y=r(G),w=r(y),Y=r(w);{var ee=t=>{var e=ye();l(t,e)},te=t=>{var e=we();l(t,e)};L(Y,t=>{o(P)?t(ee):t(te,-1)})}a(w);var I=i(w,2),ae=r(I);a(I),a(y);var K=i(y,2),N=r(K);{var re=t=>{var e=Ae(),s=r(e),v=r(s,!0);a(s);var c=i(s,2),k=r(c);a(c);var m=i(c,2);{var O=A=>{var E=Oe();Z(E,21,()=>o(x),q,(se,f)=>{var $=ke(),V=r($),M=r(V),z=r(M),ie=r(z,!0);a(z);var D=i(z,2),le=r(D,!0);a(D),a(M);var F=i(M,2),ne=r(F,!0);a(F),a(V),a($),_(()=>{he(V,"href",`/vorlagen/${o(f).id??""}`),d(ie,o(f).aktenzeichen),d(le,o(f).typ),d(ne,o(f).betreff)}),l(se,$)}),a(E),l(A,E)};L(m,A=>{o(x).length>0&&A(O)})}a(e),_(()=>{d(v,o(p).name),d(k,`${o(p).vorlage_count??""} Vorlage(n) betreffen diesen Ort`)}),l(t,e)},oe=t=>{var e=Ee();l(t,e)};L(N,t=>{o(p)?t(re):t(oe,-1)})}var R=i(N,2),C=i(r(R),2);Z(C,21,()=>o(g),q,(t,e)=>{var s=$e(),v=r(s),c=r(v),k=r(c,!0);a(c);var m=i(c,2),O=r(m);a(m),a(v),a(s),_(()=>{xe(v,1,`w-full text-left px-3 py-2 rounded-lg hover:bg-gray-50 transition-colors text-sm
${o(p)?.id===o(e).id?"bg-green-50 text-green-700":"text-gray-700"}`),d(k,o(e).name),d(O,`(${o(e).vorlage_count??""})`)}),ue("click",v,()=>H(o(e))),l(t,s)}),a(C),a(R),a(K),a(G),_(()=>d(ae,`${o(g).length??""} Orte geocodiert Marker-Größe = Anzahl Vorlagen`)),l(J,j),pe()}fe(["click"]);export{Ke as component};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
{"version":"1774994287140"}
{"version":"1775046465615"}

View File

@ -3,34 +3,33 @@
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link href="/_app/immutable/entry/start.BlI5Xt52.js" rel="modulepreload">
<link href="/_app/immutable/chunks/CTIvq_GE.js" rel="modulepreload">
<link href="/_app/immutable/chunks/DAfY0XTB.js" rel="modulepreload">
<link href="/_app/immutable/chunks/DIGUPa-Q.js" rel="modulepreload">
<link href="/_app/immutable/chunks/DDErvS7v.js" rel="modulepreload">
<link href="/_app/immutable/entry/app.CPVPz_La.js" rel="modulepreload">
<link href="/_app/immutable/entry/start.CJw4zQCo.js" rel="modulepreload">
<link href="/_app/immutable/chunks/BHBF0lbh.js" rel="modulepreload">
<link href="/_app/immutable/chunks/reyx9_7L.js" rel="modulepreload">
<link href="/_app/immutable/chunks/Pu2RPHbX.js" rel="modulepreload">
<link href="/_app/immutable/chunks/DrzKg1h1.js" rel="modulepreload">
<link href="/_app/immutable/entry/app.Bf2mSiZt.js" rel="modulepreload">
<link href="/_app/immutable/chunks/PPVm8Dsz.js" rel="modulepreload">
<link href="/_app/immutable/chunks/D2u1A_4g.js" rel="modulepreload">
<link href="/_app/immutable/chunks/DCPIP6Ym.js" rel="modulepreload">
<link href="/_app/immutable/chunks/Br6sCvve.js" rel="modulepreload">
<link href="/_app/immutable/chunks/Duumi1XQ.js" rel="modulepreload">
<link href="/_app/immutable/chunks/B-uV6-Xr.js" rel="modulepreload">
<link href="/_app/immutable/chunks/splFp8Bu.js" rel="modulepreload">
<link href="/_app/immutable/chunks/BwTTNG21.js" rel="modulepreload">
<link href="/_app/immutable/chunks/B89f14j0.js" rel="modulepreload">
<link href="/_app/immutable/chunks/Do7Yo2YN.js" rel="modulepreload">
<link href="/_app/immutable/chunks/DfsAIpU3.js" rel="modulepreload">
<link href="/_app/immutable/chunks/CvtDgobB.js" rel="modulepreload">
</head>
<body data-sveltekit-preload-data="hover">
<div style="display: contents">
<script>
{
__sveltekit_1fbmgu4 = {
__sveltekit_jcwz9y = {
base: ""
};
const element = document.currentScript.parentElement;
Promise.all([
import("/_app/immutable/entry/start.BlI5Xt52.js"),
import("/_app/immutable/entry/app.CPVPz_La.js")
import("/_app/immutable/entry/start.CJw4zQCo.js"),
import("/_app/immutable/entry/app.Bf2mSiZt.js")
]).then(([kit, app]) => {
kit.start(app, element);
});