Backup #1547
| ID | 1547 |
| Dateipfad | /var/www/dev.campus.systemische-tools.de/src/View/chat/index.php |
| Version | 25 |
| Typ |
modified |
| Größe | 23.2 KB |
| Hash | 5ac77826185eb25ab933edae0c34d822a40bd5b73eaaad3ed5893e41c1af2b9a |
| Datum | 2025-12-26 20:06:20 |
| Geändert von | claude-code-hook |
| Grund | Claude Code Pre-Hook Backup vor Edit-Operation |
| Datei existiert |
Ja
|
Dateiinhalt
<?php
/**
* Chat - Redesign (ChatGPT-Stil)
* Alle Features aus dem Original erhalten
*/
$currentModel = $session['model'] ?? $defaultModel ?? 'claude-opus-4-5-20251101';
$selected = json_decode($session['collections'] ?? '["documents"]', true) ?: ['documents'];
$currentLimit = (int) ($session['context_limit'] ?? 5);
$currentProfileId = (int) ($session['author_profile_id'] ?? 0);
$currentPromptId = (int) ($session['system_prompt_id'] ?? 1);
$currentTemperature = (float) ($session['temperature'] ?? 0.7);
$currentMaxTokens = (int) ($session['max_tokens'] ?? 4096);
?>
<!DOCTYPE html>
<html lang="de" data-theme="light">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title><?= htmlspecialchars($session['title'] ?? 'KI-Chat') ?> - Campus</title>
<link rel="icon" type="image/png" href="https://campus-am-see.de/wp-content/uploads/menu-logo.png">
<link rel="stylesheet" href="/css/chat-redesign.css">
<script src="/js/htmx.min.js"></script>
</head>
<body>
<div class="chat-layout">
<!-- Sidebar -->
<aside class="chat-sidebar" id="sidebar">
<div class="chat-sidebar__header">
<a href="/chat" class="chat-sidebar__new">+ Neuer Chat</a>
<button class="chat-sidebar__delete-all" hx-delete="/chat" hx-confirm="Alle <?= count($sessions ?? []) ?> Chats löschen?" title="Alle löschen">× Alle</button>
</div>
<div class="chat-sidebar__list" id="session-list">
<?php foreach ($sessions ?? [] as $s):
$totalTokens = (int) ($s['total_input_tokens'] ?? 0) + (int) ($s['total_output_tokens'] ?? 0);
$totalCost = ((int) ($s['total_input_tokens'] ?? 0) * 0.000015) + ((int) ($s['total_output_tokens'] ?? 0) * 0.000075);
$isOllama = str_starts_with($s['model'] ?? '', 'ollama:');
?>
<a href="/chat/<?= $s['uuid'] ?>"
class="chat-session <?= ($session['uuid'] ?? '') === $s['uuid'] ? 'chat-session--active' : '' ?>"
data-uuid="<?= $s['uuid'] ?>">
<div class="chat-session__title" id="title-<?= $s['uuid'] ?>"><?= htmlspecialchars($s['title'] ?? 'Neuer Chat') ?></div>
<div class="chat-session__meta">
<span><?= $isOllama ? 'Lokal' : 'Claude' ?></span>
<span><?= $s['message_count'] ?? 0 ?> Nachr.</span>
<?php if (!$isOllama && $totalTokens > 0): ?>
<span title="<?= number_format((int) $s['total_input_tokens']) ?> in / <?= number_format((int) $s['total_output_tokens']) ?> out"><?= number_format($totalTokens) ?> Tok.</span>
<span class="chat-session__cost">~$<?= number_format($totalCost, 2) ?></span>
<?php elseif ($isOllama): ?>
<span class="chat-session__local">lokal</span>
<?php endif; ?>
</div>
<div class="chat-session__actions">
<button class="chat-session__edit" onclick="event.preventDefault(); event.stopPropagation(); editTitle('<?= $s['uuid'] ?>');" title="Bearbeiten">✎</button>
<button class="chat-session__delete" hx-delete="/chat/<?= $s['uuid'] ?>" hx-confirm="Session löschen?" onclick="event.preventDefault(); event.stopPropagation();">×</button>
</div>
</a>
<?php endforeach; ?>
<?php if (empty($sessions)): ?>
<div class="chat-session chat-session--empty">Keine Sessions</div>
<?php endif; ?>
</div>
</aside>
<div class="chat-overlay" id="overlay"></div>
<!-- Main -->
<main class="chat-main">
<!-- Header -->
<header class="chat-header">
<button class="chat-toggle" id="toggle" title="Sidebar">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M3 12h18M3 6h18M3 18h18"/></svg>
</button>
<div class="chat-header__title">
<h1 id="page-title"><?= htmlspecialchars($session['title'] ?? 'KI-Chat') ?></h1>
</div>
<div class="chat-header__actions">
<div class="chat-dropdown" id="exportDropdown">
<button class="chat-btn chat-btn--ghost" id="exportBtn">Export</button>
<div class="chat-dropdown__menu">
<a href="/chat/<?= $session['uuid'] ?? '' ?>/export?format=markdown" class="chat-dropdown__item">Markdown (.md)</a>
<a href="/chat/<?= $session['uuid'] ?? '' ?>/export?format=json" class="chat-dropdown__item">JSON (.json)</a>
</div>
</div>
<button class="chat-btn chat-btn--icon" id="themeToggle" title="Theme">
<span id="themeIcon">☾</span>
</button>
</div>
</header>
<!-- Messages -->
<div class="chat-messages" id="messages">
<div class="chat-messages__inner">
<?php if (empty($messages)): ?>
<div class="chat-welcome">
<img src="https://campus-am-see.de/wp-content/uploads/menu-logo.png" alt="Campus am See" class="chat-welcome__logo">
<h2>Campus am See KI Assistent</h2>
</div>
<?php endif; ?>
<?php foreach ($messages ?? [] as $msg): ?>
<div class="chat-msg chat-msg--<?= $msg['role'] ?>">
<div class="chat-msg__content">
<?php if ($msg['role'] === 'user'): ?>
<?= htmlspecialchars($msg['content']) ?>
<?php else: ?>
<?= nl2br(htmlspecialchars($msg['content'])) ?>
<?php if (!empty($msg['sources'])): ?>
<?php $sources = json_decode($msg['sources'], true) ?: []; ?>
<?php if (!empty($sources)): ?>
<div class="chat-sources" id="sources-<?= $msg['id'] ?>">
<button type="button" class="chat-sources__toggle" onclick="this.parentElement.classList.toggle('chat-sources--open')">
<?= count($sources) ?> Quelle<?= count($sources) > 1 ? 'n' : '' ?> ▾
</button>
<div class="chat-sources__list">
<?php foreach ($sources as $source): ?>
<div class="chat-source">
<div class="chat-source__header">
<?php if (!empty($source['collection'])): ?>
<span class="chat-source__collection">[<?= htmlspecialchars($source['collection']) ?>]</span>
<?php endif; ?>
<span class="chat-source__title"><?= htmlspecialchars($source['title'] ?? 'Unbekannt') ?></span>
<span class="chat-source__score"><?= round(($source['score'] ?? 0) * 100) ?>%</span>
</div>
<?php if (!empty($source['content'])): ?>
<div class="chat-source__content">"<?= htmlspecialchars(mb_substr($source['content'], 0, 200)) ?><?= mb_strlen($source['content']) > 200 ? '...' : '' ?>"</div>
<?php endif; ?>
</div>
<?php endforeach; ?>
</div>
</div>
<?php endif; ?>
<?php endif; ?>
<?php
$inputTokens = (int) ($msg['tokens_input'] ?? 0);
$outputTokens = (int) ($msg['tokens_output'] ?? 0);
$msgCost = ($inputTokens * 0.000015) + ($outputTokens * 0.000075);
$msgModel = $msg['model'] ?? 'claude-opus-4-5-20251101';
$msgIsOllama = str_starts_with($msgModel, 'ollama:');
?>
<div class="chat-msg__meta">
<span><?= $msgIsOllama ? substr($msgModel, 7) : $msgModel ?></span>
<?php if (!$msgIsOllama && ($inputTokens > 0 || $outputTokens > 0)): ?>
<span class="chat-msg__tokens">↓<?= number_format($inputTokens) ?> ↑<?= number_format($outputTokens) ?></span>
<span class="chat-msg__cost">~$<?= number_format($msgCost, 4) ?></span>
<?php elseif ($msgIsOllama): ?>
<span class="chat-msg__local">lokal</span>
<?php endif; ?>
</div>
<?php endif; ?>
</div>
</div>
<?php endforeach; ?>
</div>
</div>
<!-- Input Area -->
<div class="chat-input-area">
<div class="chat-input-wrapper">
<form class="chat-form" id="chatForm"
hx-post="/chat/<?= $session['uuid'] ?? '' ?>/message"
hx-target="#messages .chat-messages__inner"
hx-swap="beforeend">
<div class="chat-input-row">
<input type="text" name="message" class="chat-input" placeholder="Nachricht eingeben..." autocomplete="off" required>
<button type="submit" class="chat-send" id="sendBtn">
<span class="chat-send__text">Senden</span>
<span class="chat-send__loading"><span></span><span></span><span></span></span>
</button>
</div>
<!-- Settings Row 1 -->
<div class="chat-settings" id="settings">
<select name="model" class="chat-select">
<optgroup label="Anthropic">
<?php foreach ($models ?? [] as $modelId => $modelLabel): ?>
<?php if (!str_starts_with($modelId, 'ollama:')): ?>
<option value="<?= htmlspecialchars($modelId) ?>" <?= $currentModel === $modelId ? 'selected' : '' ?>><?= htmlspecialchars($modelLabel) ?></option>
<?php endif; ?>
<?php endforeach; ?>
</optgroup>
<optgroup label="Ollama (lokal)">
<?php foreach ($models ?? [] as $modelId => $modelLabel): ?>
<?php if (str_starts_with($modelId, 'ollama:')): ?>
<option value="<?= htmlspecialchars($modelId) ?>" <?= $currentModel === $modelId ? 'selected' : '' ?>><?= htmlspecialchars($modelLabel) ?></option>
<?php endif; ?>
<?php endforeach; ?>
</optgroup>
</select>
<select name="context_limit" class="chat-select">
<option value="3" <?= $currentLimit === 3 ? 'selected' : '' ?>>3 Quellen</option>
<option value="5" <?= $currentLimit === 5 ? 'selected' : '' ?>>5 Quellen</option>
<option value="10" <?= $currentLimit === 10 ? 'selected' : '' ?>>10 Quellen</option>
<option value="15" <?= $currentLimit === 15 ? 'selected' : '' ?>>15 Quellen</option>
</select>
<select name="author_profile_id" class="chat-select">
<option value="0" <?= $currentProfileId === 0 ? 'selected' : '' ?>>Kein Profil</option>
<?php foreach ($authorProfiles ?? [] as $profile): ?>
<option value="<?= $profile['id'] ?>" <?= $currentProfileId === (int) $profile['id'] ? 'selected' : '' ?>><?= htmlspecialchars($profile['name']) ?></option>
<?php endforeach; ?>
</select>
<select name="system_prompt_id" class="chat-select">
<?php foreach ($systemPrompts ?? [] as $prompt): ?>
<option value="<?= $prompt['id'] ?>" <?= $currentPromptId === (int) $prompt['id'] ? 'selected' : '' ?>><?= htmlspecialchars($prompt['name']) ?></option>
<?php endforeach; ?>
</select>
<select name="structure_id" class="chat-select" title="Ausgabeformat">
<option value="0">Frei (kein Format)</option>
<?php foreach ($outputStructures ?? [] as $structure): ?>
<option value="<?= $structure['id'] ?>"><?= htmlspecialchars($structure['name']) ?></option>
<?php endforeach; ?>
</select>
<button type="button" class="chat-settings-toggle" id="settingsToggle">Mehr</button>
</div>
<!-- Settings Row 2 (Advanced) -->
<div class="chat-settings chat-settings--advanced" id="settingsAdvanced">
<!-- Collections -->
<div class="chat-collections">
<?php foreach ($collections ?? [] as $col):
$colId = $col['collection_id'];
$isSelected = in_array($colId, $selected, true);
$points = (int) ($col['points_count'] ?? 0);
?>
<label class="chat-checkbox" title="<?= number_format($points) ?> Dokumente">
<input type="checkbox" name="collections[]" value="<?= htmlspecialchars($colId) ?>" <?= $isSelected ? 'checked' : '' ?>>
<?= htmlspecialchars($col['display_name']) ?> <span class="chat-checkbox__count">(<?= number_format($points) ?>)</span>
</label>
<?php endforeach; ?>
</div>
<!-- Temperature -->
<div class="chat-temp">
<label>Temp: <span id="tempValue"><?= number_format($currentTemperature, 1) ?></span></label>
<input type="range" name="temperature" id="temperature" min="0" max="1" step="0.1" value="<?= $currentTemperature ?>">
</div>
<!-- Max Tokens -->
<select name="max_tokens" class="chat-select">
<option value="1024" <?= $currentMaxTokens === 1024 ? 'selected' : '' ?>>1024 Tok.</option>
<option value="2048" <?= $currentMaxTokens === 2048 ? 'selected' : '' ?>>2048 Tok.</option>
<option value="4096" <?= $currentMaxTokens === 4096 ? 'selected' : '' ?>>4096 Tok.</option>
<option value="8192" <?= $currentMaxTokens === 8192 ? 'selected' : '' ?>>8192 Tok.</option>
</select>
<!-- Presets -->
<div class="chat-presets">
<button type="button" class="chat-preset" data-temp="0.3" data-tokens="2048">Präzise</button>
<button type="button" class="chat-preset" data-temp="0.7" data-tokens="4096">Ausgewogen</button>
<button type="button" class="chat-preset" data-temp="0.9" data-tokens="4096">Kreativ</button>
</div>
<!-- Quality Check -->
<label class="chat-checkbox chat-checkbox--quality" title="LLM-basierte Validierung">
<input type="checkbox" name="quality_check" value="1">
Qualitätsprüfung
</label>
</div>
</form>
</div>
</div>
</main>
</div>
<script>
const sidebar = document.getElementById('sidebar');
const overlay = document.getElementById('overlay');
const toggle = document.getElementById('toggle');
const messages = document.getElementById('messages');
const form = document.getElementById('chatForm');
const sendBtn = document.getElementById('sendBtn');
const settings = document.getElementById('settings');
const settingsAdvanced = document.getElementById('settingsAdvanced');
const settingsToggle = document.getElementById('settingsToggle');
const themeToggle = document.getElementById('themeToggle');
const themeIcon = document.getElementById('themeIcon');
const html = document.documentElement;
const exportDropdown = document.getElementById('exportDropdown');
const exportBtn = document.getElementById('exportBtn');
// Theme
const savedTheme = localStorage.getItem('chat-theme') || 'light';
html.setAttribute('data-theme', savedTheme);
themeIcon.textContent = savedTheme === 'dark' ? '☀' : '☽';
themeToggle.addEventListener('click', () => {
const current = html.getAttribute('data-theme');
const next = current === 'dark' ? 'light' : 'dark';
html.setAttribute('data-theme', next);
localStorage.setItem('chat-theme', next);
themeIcon.textContent = next === 'dark' ? '☀' : '☽';
});
// Sidebar
toggle.addEventListener('click', () => {
sidebar.classList.toggle('chat-sidebar--open');
});
overlay.addEventListener('click', () => {
sidebar.classList.remove('chat-sidebar--open');
});
// Export Dropdown
exportBtn.addEventListener('click', (e) => {
e.stopPropagation();
exportDropdown.classList.toggle('chat-dropdown--open');
});
document.addEventListener('click', (e) => {
if (!exportDropdown.contains(e.target)) {
exportDropdown.classList.remove('chat-dropdown--open');
}
});
// Settings Toggle
settingsToggle.addEventListener('click', () => {
settingsAdvanced.classList.toggle('chat-settings--hidden');
settingsToggle.textContent = settingsAdvanced.classList.contains('chat-settings--hidden') ? 'Mehr' : 'Weniger';
});
// Temperature Slider
const tempSlider = document.getElementById('temperature');
const tempValue = document.getElementById('tempValue');
tempSlider.addEventListener('input', () => {
tempValue.textContent = parseFloat(tempSlider.value).toFixed(1);
});
// Presets
document.querySelectorAll('.chat-preset').forEach(btn => {
btn.addEventListener('click', () => {
tempSlider.value = btn.dataset.temp;
tempValue.textContent = parseFloat(btn.dataset.temp).toFixed(1);
document.querySelector('select[name="max_tokens"]').value = btn.dataset.tokens;
document.querySelectorAll('.chat-preset').forEach(b => b.classList.remove('chat-preset--active'));
btn.classList.add('chat-preset--active');
localStorage.setItem('chat_temperature', btn.dataset.temp);
localStorage.setItem('chat_max_tokens', btn.dataset.tokens);
});
});
// Form handling
document.body.addEventListener('htmx:beforeRequest', (e) => {
if (e.detail.elt === form) {
sendBtn.disabled = true;
sendBtn.classList.add('chat-send--loading');
}
});
document.body.addEventListener('htmx:afterRequest', (e) => {
if (e.detail.elt === form) {
form.querySelector('input[name="message"]').value = '';
form.querySelector('input[name="message"]').focus();
sendBtn.disabled = false;
sendBtn.classList.remove('chat-send--loading');
messages.scrollTop = messages.scrollHeight;
// Refresh session list
htmx.ajax('GET', '/chat/sessions?current=<?= $session['uuid'] ?? '' ?>', '#session-list');
}
});
document.body.addEventListener('htmx:afterSwap', (e) => {
if (e.detail.target.classList.contains('chat-messages__inner')) {
messages.scrollTop = messages.scrollHeight;
}
});
// Scroll to bottom on load
messages.scrollTop = messages.scrollHeight;
// Mobile: Start with sidebar hidden
if (window.innerWidth <= 768) {
sidebar.classList.remove('chat-sidebar--open');
}
// Close sidebar on mobile when clicking main
document.querySelector('.chat-main').addEventListener('click', () => {
if (window.innerWidth <= 768) {
sidebar.classList.remove('chat-sidebar--open');
}
});
// LocalStorage persistence
const dropdowns = ['model', 'context_limit', 'author_profile_id', 'system_prompt_id', 'max_tokens'];
dropdowns.forEach(name => {
const saved = localStorage.getItem('chat_' + name);
const select = document.querySelector(`select[name="${name}"]`);
if (saved && select) select.value = saved;
if (select) {
select.addEventListener('change', () => localStorage.setItem('chat_' + name, select.value));
}
});
// Temperature
const savedTemp = localStorage.getItem('chat_temperature');
if (savedTemp) {
tempSlider.value = savedTemp;
tempValue.textContent = parseFloat(savedTemp).toFixed(1);
}
tempSlider.addEventListener('change', () => localStorage.setItem('chat_temperature', tempSlider.value));
// Collections
const savedCollections = localStorage.getItem('chat_collections');
if (savedCollections) {
try {
const arr = JSON.parse(savedCollections);
document.querySelectorAll('input[name="collections[]"]').forEach(cb => {
cb.checked = arr.includes(cb.value);
});
} catch (e) {}
}
document.querySelectorAll('input[name="collections[]"]').forEach(cb => {
cb.addEventListener('change', () => {
const selected = Array.from(document.querySelectorAll('input[name="collections[]"]:checked')).map(c => c.value);
localStorage.setItem('chat_collections', JSON.stringify(selected));
});
});
// Inline Title Edit
function editTitle(uuid) {
const titleEl = document.getElementById('title-' + uuid);
if (!titleEl) return;
const currentTitle = titleEl.textContent;
const input = document.createElement('input');
input.type = 'text';
input.value = currentTitle;
input.className = 'chat-session__input';
input.maxLength = 100;
titleEl.innerHTML = '';
titleEl.appendChild(input);
input.focus();
input.select();
function save() {
const newTitle = input.value.trim() || 'Neuer Chat';
titleEl.textContent = newTitle;
fetch('/chat/' + uuid + '/title', {
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
body: 'title=' + encodeURIComponent(newTitle)
}).then(r => r.text()).then(html => {
titleEl.textContent = html || newTitle;
const pageTitle = document.getElementById('page-title');
if (pageTitle && window.location.pathname.includes(uuid)) {
pageTitle.textContent = html || newTitle;
}
});
}
input.addEventListener('blur', save);
input.addEventListener('keydown', (e) => {
if (e.key === 'Enter') { e.preventDefault(); input.blur(); }
if (e.key === 'Escape') { titleEl.textContent = currentTitle; }
});
}
</script>
</body>
</html>
Vollständig herunterladen
Aktionen
Andere Versionen dieser Datei
| ID |
Version |
Typ |
Größe |
Datum |
| 1988 |
58 |
modified |
21.2 KB |
2025-12-28 03:01 |
| 1979 |
57 |
modified |
38.9 KB |
2025-12-28 02:49 |
| 1920 |
56 |
modified |
38.9 KB |
2025-12-28 01:19 |
| 1773 |
55 |
modified |
38.8 KB |
2025-12-27 14:01 |
| 1751 |
54 |
modified |
38.8 KB |
2025-12-27 12:46 |
| 1750 |
53 |
modified |
38.7 KB |
2025-12-27 12:45 |
| 1748 |
52 |
modified |
38.7 KB |
2025-12-27 12:45 |
| 1741 |
51 |
modified |
38.6 KB |
2025-12-27 12:43 |
| 1740 |
50 |
modified |
38.6 KB |
2025-12-27 12:43 |
| 1667 |
49 |
modified |
38.6 KB |
2025-12-27 11:25 |
| 1663 |
48 |
modified |
39.7 KB |
2025-12-27 11:07 |
| 1662 |
47 |
modified |
39.7 KB |
2025-12-27 11:07 |
| 1661 |
46 |
modified |
39.0 KB |
2025-12-27 11:07 |
| 1660 |
45 |
modified |
37.8 KB |
2025-12-27 11:05 |
| 1659 |
44 |
modified |
43.2 KB |
2025-12-27 11:04 |
| 1658 |
43 |
modified |
37.7 KB |
2025-12-27 11:03 |
| 1654 |
42 |
modified |
37.4 KB |
2025-12-27 10:58 |
| 1648 |
41 |
modified |
37.4 KB |
2025-12-27 10:55 |
| 1646 |
40 |
modified |
32.5 KB |
2025-12-27 10:28 |
| 1645 |
39 |
modified |
33.5 KB |
2025-12-27 10:28 |
| 1644 |
38 |
modified |
28.2 KB |
2025-12-27 10:27 |
| 1584 |
37 |
modified |
27.9 KB |
2025-12-26 21:09 |
| 1582 |
36 |
modified |
27.5 KB |
2025-12-26 21:03 |
| 1581 |
35 |
modified |
27.0 KB |
2025-12-26 21:01 |
| 1577 |
34 |
modified |
26.8 KB |
2025-12-26 20:55 |
| 1576 |
33 |
modified |
26.7 KB |
2025-12-26 20:48 |
| 1569 |
32 |
modified |
26.1 KB |
2025-12-26 20:36 |
| 1568 |
31 |
modified |
26.1 KB |
2025-12-26 20:36 |
| 1567 |
30 |
modified |
25.9 KB |
2025-12-26 20:34 |
| 1564 |
29 |
modified |
26.1 KB |
2025-12-26 20:30 |
| 1563 |
28 |
modified |
22.6 KB |
2025-12-26 20:30 |
| 1554 |
27 |
modified |
23.2 KB |
2025-12-26 20:18 |
| 1548 |
26 |
modified |
23.2 KB |
2025-12-26 20:06 |
| 1547 |
25 |
modified |
23.2 KB |
2025-12-26 20:06 |
| 1546 |
24 |
modified |
23.1 KB |
2025-12-26 20:06 |
| 1545 |
23 |
modified |
23.0 KB |
2025-12-26 20:05 |
| 1537 |
22 |
modified |
23.4 KB |
2025-12-26 19:54 |
| 565 |
21 |
modified |
23.0 KB |
2025-12-23 03:36 |
| 552 |
20 |
modified |
22.6 KB |
2025-12-23 02:39 |
| 543 |
19 |
modified |
22.2 KB |
2025-12-22 22:31 |
| 541 |
18 |
modified |
21.4 KB |
2025-12-22 22:31 |
| 537 |
17 |
modified |
21.1 KB |
2025-12-22 22:27 |
| 205 |
16 |
modified |
21.1 KB |
2025-12-21 16:21 |
| 200 |
15 |
modified |
21.9 KB |
2025-12-21 14:44 |
| 184 |
14 |
modified |
21.9 KB |
2025-12-21 14:16 |
| 170 |
13 |
modified |
22.0 KB |
2025-12-21 04:13 |
| 121 |
12 |
modified |
22.2 KB |
2025-12-20 19:27 |
| 120 |
11 |
modified |
22.1 KB |
2025-12-20 19:27 |
| 119 |
10 |
modified |
22.1 KB |
2025-12-20 19:27 |
| 118 |
9 |
modified |
22.2 KB |
2025-12-20 19:27 |
| 90 |
8 |
modified |
21.4 KB |
2025-12-20 19:16 |
| 88 |
7 |
modified |
21.2 KB |
2025-12-20 19:16 |
| 73 |
6 |
modified |
20.9 KB |
2025-12-20 19:04 |
| 72 |
5 |
modified |
20.8 KB |
2025-12-20 19:00 |
| 70 |
4 |
modified |
20.5 KB |
2025-12-20 18:59 |
| 69 |
3 |
modified |
20.5 KB |
2025-12-20 18:49 |
| 62 |
2 |
modified |
18.7 KB |
2025-12-20 18:33 |
| 61 |
1 |
modified |
17.0 KB |
2025-12-20 18:32 |
← Zurück zur Übersicht