This commit is contained in:
team3
2026-06-22 10:13:30 +02:00
parent b54f5e23f3
commit 4f1f8d18d0
7 changed files with 60 additions and 25 deletions

View File

@@ -74,13 +74,19 @@ const bausteine = computed(() =>
const fokusBaustein = computed(() => (fokusIndex.value === null ? null : bausteine.value[fokusIndex.value]))
function openFokus(baustein, tab) {
if (!baustein.pruefbar) return // reine Lese-Sections (Rest/Rand) öffnen keinen Prüfungs-Fokus
const i = bausteine.value.findIndex((s) => s.title === baustein.title)
if (i === -1) return
fokusIndex.value = i
fokusTab.value = tab || 'pruefung'
}
function fokusPrev() { if (fokusIndex.value > 0) fokusIndex.value-- }
function fokusNext() { if (fokusIndex.value < bausteine.value.length - 1) fokusIndex.value++ }
// Nur prüfbare Sections im Fokus anspringen (FullGuide hat dazwischen reine Lese-Sections).
function fokusPrev() {
for (let i = fokusIndex.value - 1; i >= 0; i--) if (bausteine.value[i].pruefbar) { fokusIndex.value = i; return }
}
function fokusNext() {
for (let i = fokusIndex.value + 1; i < bausteine.value.length; i++) if (bausteine.value[i].pruefbar) { fokusIndex.value = i; return }
}
// Erfahrungsleiste: Lernstand über alle Bausteine des Guides (sticky, absolviert ⊇ verstanden ⊇ gemeistert).
const fortschritt = computed(() => {
@@ -94,8 +100,8 @@ const fortschritt = computed(() => {
return { total: bausteine.value.length, absolviert: a, verstanden: v, gemeistert: g }
})
// Ein Format „Guide" → Prüfung läuft voll 030. Ohne fertigen Guide kein Deckel relevant (6).
const cap = computed(() => (props.doneByFormat?.Guide ? 30 : 6))
// Prüfung läuft voll 030, sobald Guide ODER FullGuide fertig ist (gleicher Baustein-Score).
const cap = computed(() => ((props.doneByFormat?.Guide || props.doneByFormat?.FullGuide) ? 30 : 6))
// --- Chat (Mechanik in useChat; Kontext-Extraktion bleibt hier) ---
const chat = useChat((msgs) => {
@@ -202,15 +208,18 @@ function extractContext() {
:key="s.num"
:class="['section-card', lernstand[s.title]?.gemeistert ? 'gemeistert' : (lernstand[s.title]?.verstanden ? 'verstanden' : (lernstand[s.title]?.absolviert ? 'absolviert' : ''))]"
>
<h3 class="baustein-klick" @click="openFokus(s, 'pruefung')">
<h3 :class="{ 'baustein-klick': s.pruefbar }" @click="s.pruefbar && openFokus(s, 'pruefung')">
{{ s.title }}
<span v-if="lernstand[s.title]?.gemeistert" class="baustein-done gemeistert" title="Gemeistert (25/25)"> Gemeistert</span>
<span v-else-if="lernstand[s.title]?.verstanden" class="baustein-done verstanden" title="Vollständig verstanden (10/10)"> Verstanden</span>
<span v-else-if="lernstand[s.title]?.absolviert" class="baustein-done" title="Prüfung bestanden"> Absolviert</span>
<template v-if="s.pruefbar">
<span v-if="lernstand[s.title]?.gemeistert" class="baustein-done gemeistert" title="Gemeistert (25/25)"> Gemeistert</span>
<span v-else-if="lernstand[s.title]?.verstanden" class="baustein-done verstanden" title="Vollständig verstanden (10/10)"> Verstanden</span>
<span v-else-if="lernstand[s.title]?.absolviert" class="baustein-done" title="Prüfung bestanden"> Absolviert</span>
</template>
</h3>
<GraphView v-if="ansichtModus === 'grafik'" :graph="grafiken[s.title] || null" />
<div v-else class="section-body markdown" v-html="renderMarkdown(ansichtModus === 'kompakt' ? (s.kompakt || s.md) : s.md)"></div>
<BausteinPanel
v-if="s.pruefbar"
mode="trigger"
:baustein="s.title"
:status="lernstand[s.title]"