diff --git a/04_Tablet-Quiz/app/index.html b/04_Tablet-Quiz/app/index.html index 1659664..664683b 100644 --- a/04_Tablet-Quiz/app/index.html +++ b/04_Tablet-Quiz/app/index.html @@ -173,8 +173,9 @@ .pfad b { display:block; } /* ---- Minimal Run-Screens ---- */ - .sHead{display:flex;align-items:center;gap:10px} - .sHead .sId{color:var(--muted);font-size:13px;font-variant-numeric:tabular-nums} + .sHead{display:flex;align-items:center;gap:12px;flex-wrap:wrap} + .sHead .phaseChip{font-size:15px;padding:8px 18px;letter-spacing:.8px} + .sHead .sId{color:var(--ink);font-size:18px;font-weight:800;font-variant-numeric:tabular-nums} .sTitle{font-size:22px;font-weight:700;line-height:1.25;margin:10px 0 4px} .caseLine{color:var(--muted);font-size:13px;margin:0 0 22px} .lead{font-size:16px;margin:0 0 16px} @@ -182,6 +183,13 @@ .todo li{margin:8px 0} .crit{margin:8px 0 0;padding-left:20px;color:var(--muted)} .crit li{margin:4px 0} + .critHead{font-size:13px;font-weight:700;color:var(--muted);text-transform:uppercase;letter-spacing:.5px;margin:16px 0 8px} + .gateCrit{display:flex;flex-direction:column;gap:8px;margin:0 0 16px} + .critItem{display:flex;align-items:flex-start;gap:10px;text-align:left;padding:11px 14px;border:1px solid var(--line);border-radius:10px;background:var(--soft);color:var(--ink);cursor:pointer;font-size:14px;line-height:1.45;animation:critIn .22s ease} + .critItem:hover{border-color:#c9d2dd} + .critItem.checked{border-color:rgba(31,157,87,.4);background:var(--okBg)} + .critItem .critBox{font-size:17px;flex:none;line-height:1.25} + @keyframes critIn{from{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:none}} details.det{margin:8px 0 4px;border-top:1px solid var(--line);padding-top:12px} details.det>summary{cursor:pointer;color:var(--muted);font-size:14px;font-weight:600;list-style:none} details.det>summary::-webkit-details-marker{display:none} @@ -613,8 +621,8 @@ const STATIONEN = [ expl:"Early Life Support = erhöhte Betreuung direkt nach Go-Live (siehe op_01)."} ]}, { id:"tr_01", phase:"transition", typ:"gate", gateNr:1, - name:"Gate 1: Entwicklung oder Konfiguration?", - beschreibung:"Entry-Gate der Transition: Entscheidung, ob die Service-Komponenten entwickelt oder nur konfiguriert werden. Erfordert SOR-Approval (Budget- und Ressourcenimplikationen).", + name:"Gate 1: Darf es in die Transition?", + beschreibung:"Entry-Gate der Transition: Die SOR entscheidet zuerst, ob das Vorhaben überhaupt in die Transition darf — und wenn ja, ob die Service-Komponenten neu entwickelt oder nur konfiguriert werden. Erfordert SOR-Approval (Budget- und Ressourcenimplikationen).", umfasst:["Aufwandsschätzung (Build vs. Configure)","Technische Risiken","Budget-Abgleich","ggf. Lieferanten-Einbindung","SOR-Vorlage für Freigabe"], artefakt:"Gate-Entscheidung + SOR-Vorlage", pfade:[ @@ -1135,7 +1143,7 @@ function defaultState(){ freigabeDone:false, freigabeWrong:null, entryDone:false, entryWrong:null, bonusReveal:false, bonusDone:{}, servicesDone:{}, akteFlash:null, - index:0, stage:"discuss", quizIndex:0, + index:0, stage:"discuss", quizIndex:0, gateDeciderDone:false, gateCrit:0, actStep:0, actReveal:false, actDone:false, arteWrong:null, picks:{}, done:{}, akte:{}, loopback:null, revisit:{}, endReason:null, endGate:null }; @@ -1495,7 +1503,7 @@ function renderBonusPick(){ const done = S.bonusDone && S.bonusDone[ci]; return ``; }).join(""); @@ -1512,7 +1520,7 @@ function renderBonusPick(){ `; $("#panel").querySelectorAll(".bonusCard").forEach(el=>{ el.onclick=()=>{ S.change=+el.dataset.c; S.mode="bonus"; - S.classifyDone=true; S.classifyWrong=null; // Typ ist auf der Karte ausgewiesen → nur Begründung, kein Quiz + S.classifyDone=false; S.classifyWrong=null; // Change-Art ist auf der Karte verdeckt → Gruppe bestimmt sie selbst (Quiz) S.freigabeDone=false; S.freigabeWrong=null; S.entryDone=false; S.entryWrong=null; S.bonusReveal=false; S.view="classify"; save(); draw(); }; @@ -1584,7 +1592,7 @@ function enterStation(idx){ } S.index = idx; S.stage = STATIONEN[idx].typ==="gate" ? "gate" : "act"; - S.gatePick = null; S.quizIndex = 0; + S.gatePick = null; S.quizIndex = 0; S.gateDeciderDone = false; S.gateCrit = 0; S.actStep = 0; S.actReveal = false; S.actDone = false; S.arteWrong = null; S.akteFlash = null; document.body.classList.remove("akteOpen"); } @@ -1773,7 +1781,28 @@ function renderActivity(st){ /* Gate — Entscheidung nach Kriterien */ function renderGate(st){ const keeper = (st.raci.find(([r,c])=>c==="A")||[])[0]; - const pruef = (st.pruef||[]).map(([n,d])=>`
Die SOR ist ein Gremium (SPM · Betrieb · Support-Manager · Service Owner …), das am Gate-Puck zusammenkommt — keine Einzelfigur.
` : ``; + const revisitNote = (S.revisit && S.revisit[st.id]) + ? `Entscheidet: ${roleLabel(keeper)}
+ ${sorNote} +${st.beschreibung}
+Alle Kriterien geprüft. Geforderte Artefakte in der Akte (siehe oben)? Pflicht-Figuren am Gate-Puck?
`:``}` : ``; + return ` ${revisitNote}Entscheidet: ${roleLabel(keeper)}
${reqLine} -${st.beschreibung}
-Geforderte Artefakte in der Akte (siehe oben)? Pflicht-Figuren am Gate-Puck?
-