diff --git a/04_Tablet-Quiz/app/index.html b/04_Tablet-Quiz/app/index.html index cc49586..1f6c982 100644 --- a/04_Tablet-Quiz/app/index.html +++ b/04_Tablet-Quiz/app/index.html @@ -151,6 +151,13 @@ .aufBox ul li{margin:3px 0} .roleChips{display:flex;flex-wrap:wrap;gap:6px} .roleChip{background:#eef0f3;border-radius:999px;padding:3px 11px;font-size:13px} + /* Aufgaben-Kasten (Anweisung hervorgehoben) */ + .frageBox{background:#f7f9fc;border:1px solid var(--line);border-left:4px solid var(--accent);border-radius:12px;padding:14px 18px;margin:6px 0;font-size:16px;line-height:1.55} + .frageBox .frageLabel{font-size:11px;text-transform:uppercase;letter-spacing:.7px;color:var(--muted);font-weight:700;margin-bottom:5px} + /* Phasen-Abschluss-Feedback */ + .phaseDone{margin:16px 0 4px;padding:16px 18px;border-radius:12px;background:#fffdf5;border:1px solid var(--line);border-left:4px solid var(--accent)} + .phaseDone .pdTitle{font-weight:800;font-size:18px;margin-bottom:6px} + .phaseDone p{color:var(--ink)} .actions { display:flex; gap:10px; align-items:center; margin-top:24px; flex-wrap:wrap; } .actions .spacer { flex:1; } @@ -1104,6 +1111,14 @@ function gateGoto(st, i){ } save(); draw(); } +/* Zielstation einer Gate-Entscheidung (für Phasenwechsel-Feedback). -1 = Ende/Ablehnung. */ +function gateTargetIndex(st, i){ + const t = (GATE_FLOW[st.id] || [])[i] || "next"; + if(t==="end") return -1; + if(t==="next") return Math.min(S.index+1, STATIONEN.length-1); + const j = STATIONEN.findIndex(s=>s.id===t); + return j>=0 ? j : Math.min(S.index+1, STATIONEN.length-1); +} function raciTable(st){ const rows = st.raci.map(([r,c])=>`${roleLabel(r)}${c}`).join(""); @@ -1143,16 +1158,16 @@ function renderRun(){ function activitySteps(st){ return [ { label:"Diskussion", - frage:`

Diskutiert gemeinsam: Was fällt alles unter „${st.name}"? Was stellt ihr euch darunter vor? Nennt Beispiele.

`, + frage:`Diskutiert gemeinsam: Was fällt alles unter „${st.name}"? Was stellt ihr euch darunter vor? Nennt Beispiele.`, auf:`

${st.beschreibung}

Das fällt darunter

` }, { label:"Beteiligte Rollen", - frage:`

Welche Rollen sind an dieser Aktivität beteiligt? Stellt ihre Figuren auf die Mulden des Station-Pucks.

`, + frage:`Welche Rollen sind an dieser Aktivität beteiligt? Stellt ihre Figuren auf die Mulden des Station-Pucks.`, auf:`

Beteiligte Rollen

${st.raci.map(([r])=>`${roleLabel(r)}`).join("")}
` }, { label:"RACI", - frage:`

Klärt die RACI: Wer ist R, A, C, I? Sortiert die Figuren ins Aktiv-Feld (R·A·C·I).

`, + frage:`Klärt die RACI: Wer ist R, A, C, I? Sortiert die Figuren ins Aktiv-Feld (R·A·C·I).`, auf:`

RACI

${raciTable(st)}` }, { label:"Artefakt", - frage:`

Welche Artefaktkarte entsteht hier und gehört in die Service-Akte?

`, + frage:`Welche Artefaktkarte entsteht hier und gehört in die Service-Akte?`, auf:`

Artefakt

${st.artefakt}

` } ]; } @@ -1161,8 +1176,25 @@ function renderActivity(st){ const i = Math.min(S.actStep||0, steps.length-1); const step = steps[i]; const isLast = i === steps.length-1; - let html = `
Schritt ${i+1}/${steps.length} · ${step.label}
${step.frage}`; + const phaseColor = PHASEN[st.phase].color; + const next = STATIONEN[S.index+1]; + const lastOverall = S.index >= STATIONEN.length-1; + const phaseEnd = isLast && S.actReveal && next && next.phase !== st.phase; + + let html = `
Schritt ${i+1}/${steps.length} · ${step.label}
+
+
Aufgabe ${i+1}
+ ${step.frage} +
`; if(S.actReveal) html += `
${step.auf}
`; + if(phaseEnd){ + const nextColor = PHASEN[next.phase].color; + html += `
+
🎉 Phase abgeschlossen
+

Gratulation — ihr habt die Phase ${PHASEN[st.phase].label} zu Ende gespielt!

+

Weiter geht's mit der Phase ${PHASEN[next.phase].label}.

+
`; + } let actions = `
`; if(S.actReveal || i>0) actions += ``; @@ -1171,9 +1203,9 @@ function renderActivity(st){ actions += `
`; if(!S.actReveal) actions += ``; else if(!isLast) actions += ``; - else actions += S.index < STATIONEN.length-1 - ? `` - : ``; + else if(lastOverall) actions += ``; + else if(phaseEnd) actions += ``; + else actions += ``; actions += `
`; return html + actions; } @@ -1207,17 +1239,31 @@ function renderGateDone(st){ const keeper = (st.raci.find(([r,c])=>c==="A")||[])[0]; const sorNote = (keeper==="sor") ? `

Reicht die Ressourcen-/Entscheidungshoheit der SOR nicht (zusätzliche Mittel nötig), wird der Change zum Demand → über DPM ans Mission Board.

` : ``; + const tIdx = gateTargetIndex(st, i); + const target = tIdx>=0 ? STATIONEN[tIdx] : null; + const phaseEnd = target && target.phase !== st.phase; + let feedback = `

Legt den passenden Entscheidungs-Chip ans Gate.

`; + let nextLabel = `Weiter →`; + if(phaseEnd){ + const curColor = PHASEN[st.phase].color, nextColor = PHASEN[target.phase].color; + nextLabel = `→ Weiter zur Phase ${PHASEN[target.phase].label}`; + feedback += `
+
🎉 Phase abgeschlossen
+

Gratulation — ihr habt die Phase ${PHASEN[st.phase].label} zu Ende gespielt!

+

Weiter geht's mit der Phase ${PHASEN[target.phase].label}.

+
`; + } return `
Entscheidung getroffen

${pf[0]}

${pf[1]}

${sorNote} -

Legt den passenden Entscheidungs-Chip ans Gate.

+ ${feedback}
- +
`; }