From 61a22a4d9fc4e44e8c9165544b898fe78108a2aa Mon Sep 17 00:00:00 2001 From: team3 Date: Wed, 17 Jun 2026 16:41:04 +0200 Subject: [PATCH] update --- frontend/src/components/BausteinFokus.vue | 170 ++++++++++++++++++++++ frontend/src/components/BausteinPanel.vue | 31 +++- frontend/src/components/TopicDetail.vue | 122 +++++++--------- 3 files changed, 249 insertions(+), 74 deletions(-) create mode 100644 frontend/src/components/BausteinFokus.vue diff --git a/frontend/src/components/BausteinFokus.vue b/frontend/src/components/BausteinFokus.vue new file mode 100644 index 0000000..f444add --- /dev/null +++ b/frontend/src/components/BausteinFokus.vue @@ -0,0 +1,170 @@ + + + + + diff --git a/frontend/src/components/BausteinPanel.vue b/frontend/src/components/BausteinPanel.vue index faad0a4..8fe3d64 100644 --- a/frontend/src/components/BausteinPanel.vue +++ b/frontend/src/components/BausteinPanel.vue @@ -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) {