update
This commit is contained in:
@@ -12,9 +12,13 @@ const props = defineProps({
|
||||
status: { type: Object, default: null }, // {gute_antworten, absolviert, verstanden, gemeistert, vertiefung}
|
||||
tier2: { type: Boolean, default: false }, // Tier 2 frei (ganzer Guide absolviert)
|
||||
tier3: { type: Boolean, default: false }, // Meisterpfad frei (ganzer Guide verstanden)
|
||||
// 'trigger' (Liste): nur Tab-Leiste, Klick öffnet den Vollbild-Fokus.
|
||||
// 'full' (Fokus): Tabs + Panel-Inhalt wie gehabt.
|
||||
mode: { type: String, default: 'trigger' },
|
||||
initialTab: { type: String, default: null },
|
||||
})
|
||||
|
||||
const emit = defineEmits(['statusChanged'])
|
||||
const emit = defineEmits(['statusChanged', 'openFokus'])
|
||||
|
||||
const NOETIG = 3 // absolviert
|
||||
const MAX = 10 // verstanden
|
||||
@@ -22,7 +26,13 @@ const MEISTERN = 25 // gemeistert (Maximum)
|
||||
const st = computed(() => props.status || { gute_antworten: 0, streak: 0, absolviert: false, verstanden: false, gemeistert: false, vertiefung: false, deepdive: false })
|
||||
|
||||
// --- Toggle-Bereich ---
|
||||
const activeTab = ref(null) // null | 'vertiefung' | 'deepdive' | 'chat' | 'pruefung'
|
||||
const activeTab = ref(props.mode === 'full' ? props.initialTab : null) // null | 'vertiefung' | 'deepdive' | 'chat' | 'pruefung'
|
||||
|
||||
// Klick auf einen Tab: in der Liste den Fokus öffnen, im Fokus den Tab umschalten.
|
||||
function tabKlick(tab) {
|
||||
if (props.mode === 'trigger') { emit('openFokus', tab); return }
|
||||
toggle(tab)
|
||||
}
|
||||
|
||||
function toggle(tab) {
|
||||
activeTab.value = activeTab.value === tab ? null : tab
|
||||
@@ -310,7 +320,12 @@ function pruefAbbrechen() {
|
||||
function onWindowKey(e) {
|
||||
if (e.key === 'Escape' && pruefLoading.value) { e.preventDefault(); pruefAbbrechen() }
|
||||
}
|
||||
onMounted(() => window.addEventListener('keydown', onWindowKey))
|
||||
onMounted(() => {
|
||||
if (props.mode !== 'full') return // Trigger-Modus (Liste): nur Tab-Leiste, keine Prüfungs-/Text-Logik
|
||||
window.addEventListener('keydown', onWindowKey)
|
||||
// Direkt im Fokus geöffneter Vertiefung-/Amateur-Tab: Text laden (sonst nur via toggle).
|
||||
if (activeTab.value === 'vertiefung' || activeTab.value === 'deepdive') openText(activeTab.value)
|
||||
})
|
||||
onUnmounted(() => window.removeEventListener('keydown', onWindowKey))
|
||||
|
||||
// ALT+1 Nachfragen/Nachhaken · ALT+2 primär (Antwort abgeben / Nächste Frage)
|
||||
@@ -332,16 +347,16 @@ function onPruefKey(e) {
|
||||
<template>
|
||||
<div class="bp">
|
||||
<div class="bp-toggles">
|
||||
<button :class="{ active: activeTab === 'vertiefung' }" @click="toggle('vertiefung')">
|
||||
<button :class="{ active: activeTab === 'vertiefung' }" @click="tabKlick('vertiefung')">
|
||||
Vertiefung
|
||||
</button>
|
||||
<button :class="{ active: activeTab === 'deepdive' }" @click="toggle('deepdive')">
|
||||
<button :class="{ active: activeTab === 'deepdive' }" @click="tabKlick('deepdive')">
|
||||
Amateur
|
||||
</button>
|
||||
<button :class="{ active: activeTab === 'chat' }" @click="toggle('chat')">
|
||||
<button :class="{ active: activeTab === 'chat' }" @click="tabKlick('chat')">
|
||||
Chat
|
||||
</button>
|
||||
<button :class="{ active: activeTab === 'pruefung' }" @click="toggle('pruefung')">
|
||||
<button :class="{ active: activeTab === 'pruefung' }" @click="tabKlick('pruefung')">
|
||||
Prüfung
|
||||
<span v-if="st.gemeistert" class="bp-chip gold" title="Gemeistert (25/25)">✓✓✓ Max</span>
|
||||
<span v-else-if="st.verstanden && tier3" class="bp-chip lila" title="Meisterpfad">✓✓ {{ st.gute_antworten }}/{{ MEISTERN }}</span>
|
||||
@@ -352,7 +367,7 @@ function onPruefKey(e) {
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div v-if="activeTab" class="bp-panel">
|
||||
<div v-if="mode === 'full' && activeTab" class="bp-panel">
|
||||
<!-- Vertiefung (gleicher Stoff, mehr) / Amateur (gleicher Stoff, für Einsteiger) -->
|
||||
<div v-if="activeTab === 'vertiefung' || activeTab === 'deepdive'">
|
||||
<p v-if="texte[activeTab].loading" class="bp-hint">{{ texte[activeTab].md === null ? 'Generiere…' : 'Lade…' }}</p>
|
||||
|
||||
Reference in New Issue
Block a user