diff --git a/frontend/src/assets/markdown.css b/frontend/src/assets/markdown.css index e6ed281..292d326 100644 --- a/frontend/src/assets/markdown.css +++ b/frontend/src/assets/markdown.css @@ -95,7 +95,8 @@ .sub-stufe { position: relative; border-left: 3px solid color-mix(in srgb, var(--stufe-farbe) 55%, transparent); - padding-left: 0.75rem; + background: color-mix(in srgb, var(--stufe-farbe) 8%, transparent); + padding: 0.15rem 0.5rem 0.15rem 0.75rem; margin: 0.5rem 0; border-radius: 2px; } @@ -116,7 +117,8 @@ .sub-neu { position: relative; border-left: 3px solid var(--neu-farbe); - padding-left: 0.75rem; + background: color-mix(in srgb, var(--neu-farbe) 12%, transparent); + padding: 0.15rem 0.5rem 0.15rem 0.75rem; margin: 0.5rem 0; border-radius: 2px; } diff --git a/frontend/src/components/BlockFocus.vue b/frontend/src/components/BlockFocus.vue index 0855f45..6d4d297 100644 --- a/frontend/src/components/BlockFocus.vue +++ b/frontend/src/components/BlockFocus.vue @@ -18,6 +18,7 @@ const props = defineProps({ hasPrev: { type: Boolean, default: false }, hasNext: { type: Boolean, default: false }, fortschritt: { type: Object, default: () => ({ total: 0, beginner: 0, advanced: 0, expert: 0, master: 0 }) }, + stufe: { type: Number, default: 4 }, // höchste sichtbare Stufe (1=A … 4=V) — wie die Standardansicht }) import { computed, onMounted, onUnmounted, reactive, ref, watch } from 'vue' @@ -111,8 +112,10 @@ const segments = computed(() => { const anchor = compact ? (props.block.anker_compact || '') : (props.block.anchor || '') if (anchor.trim()) out.push(seg('', anchor)) for (const sub of subs) { + const rank = SUB_RANK[sub.level] || 1 + if (rank > props.stufe) continue // Stufen-Filter (wie die Standardansicht) const body = compact ? (sub.compact || sub.md) : (sub.md || sub.compact) - if (body && body.trim()) out.push(seg(sub.level, body)) + if (body && body.trim()) out.push(seg(sub.level, body)) // jede Stufe A/F/E/V markiert (Filter bleibt) } return out }) diff --git a/frontend/src/components/TopicDetail.vue b/frontend/src/components/TopicDetail.vue index 75ea75a..ee242c6 100644 --- a/frontend/src/components/TopicDetail.vue +++ b/frontend/src/components/TopicDetail.vue @@ -2,7 +2,7 @@ import { computed, reactive, ref, watch, nextTick, onMounted, onUnmounted } from 'vue' import { fetchGuideContent, chatGuide, fetchBlockLearnState } from '../api.js' import { renderMarkdown } from '../markdown.js' -import { stufeFuer, schwelle, SUB_RANK, VIEW_KURZ, VIEW_FARBE, viewLevelFuer } from '../levels.js' +import { stufeFuer, schwelle, SUB_RANK, VIEW_KURZ, VIEW_FARBE } from '../levels.js' import { useChat } from '../composables/useChat.js' import BlockPanel from './BlockPanel.vue' import BlockFocus from './BlockFocus.vue' @@ -36,8 +36,9 @@ let mdObserver = null // Auto: Ansichtsstufe des Blocks folgt dem Prüfungs-Score (Erreicht + 1); Override = global fest. function viewLevelFor(title) { if (props.stufeAnsicht !== 'auto') return Number(props.stufeAnsicht) - const l = learnstate.value[title] - return viewLevelFuer(l?.good_answers || 0, l?.cap || 10) + // Auto = real freigeschaltete Stufe je Baustein (Backend `freie_level` aus dem Prüf-Score): + // Stufe A initial, die nächste Stufe erst, wenn die Prüf-Grenze erreicht ist. + return learnstate.value[title]?.freie_level || 1 } function htmlFor(s) { @@ -55,13 +56,12 @@ function htmlFor(s) { const rank = SUB_RANK[sub.level] || 1 if (rank > lvl) continue const body = renderMarkdown(compact ? (sub.compact || sub.md) : (sub.md || sub.compact)) - if (props.stufeAnsicht === 'auto' && lvl > 1 && rank === lvl) { + if (props.stufeAnsicht === 'auto' && rank > 1 && rank === lvl) { + // gerade neu freigeschaltete Stufe: kräftiger hervorheben parts.push(`