diff --git a/01_3D-Druck/blender/__pycache__/raci-board.cpython-312.pyc b/01_3D-Druck/blender/__pycache__/raci-board.cpython-312.pyc index e774245..2a722f7 100644 Binary files a/01_3D-Druck/blender/__pycache__/raci-board.cpython-312.pyc and b/01_3D-Druck/blender/__pycache__/raci-board.cpython-312.pyc differ diff --git a/01_3D-Druck/blender/raci-board.py b/01_3D-Druck/blender/raci-board.py index 27811be..140da0b 100644 --- a/01_3D-Druck/blender/raci-board.py +++ b/01_3D-Druck/blender/raci-board.py @@ -138,13 +138,16 @@ base.data.materials.clear(); base.data.materials.append(mat) # ----------------------------- Vorschau-Render ----------------------------- try: sc = bpy.context.scene + # Meshy-tauglich: heller, neutraler Hintergrund + gleichmaessiges Licht try: bg = next((n for n in sc.world.node_tree.nodes if n.type == 'BACKGROUND'), None) - if bg: bg.inputs[1].default_value = 1.2 + if bg: + bg.inputs[0].default_value = (0.92, 0.92, 0.92, 1) + bg.inputs[1].default_value = 1.6 except Exception: pass - bpy.ops.object.light_add(type='SUN', location=(140, -180, 260)); bpy.context.object.data.energy = 3.5 + bpy.ops.object.light_add(type='SUN', location=(140, -180, 260)); bpy.context.object.data.energy = 2.2 bpy.ops.object.light_add(type='AREA', location=(-140, -60, 180)) - bpy.context.object.data.energy = 6000; bpy.context.object.data.size = 280 + bpy.context.object.data.energy = 9000; bpy.context.object.data.size = 320 bpy.ops.object.empty_add(location=(0, 0, 5)); tgt = bpy.context.object bpy.ops.object.camera_add(location=(235, -295, 270)); cam = bpy.context.object cam.data.lens = 50 diff --git a/04_Tablet-Quiz/app/index.html b/04_Tablet-Quiz/app/index.html index 961e874..86b9edd 100644 --- a/04_Tablet-Quiz/app/index.html +++ b/04_Tablet-Quiz/app/index.html @@ -275,6 +275,8 @@ .slcDonut.clickable .donutSeg{cursor:pointer;transition:opacity .12s} .slcDonut.clickable .donutSeg:hover{opacity:.82} .slcDonut .donutSeg.bad{stroke:var(--bad);stroke-width:4} + .akteItem.flash{animation:akteFlash 1.6s ease-out} + @keyframes akteFlash{0%,55%{background:#fff3bf}100%{background:transparent}} .slcCap{font-size:11px;color:var(--muted);margin-top:4px;text-align:center} @media(max-width:680px){.classifyTop{grid-template-columns:1fr}.classifyCard{max-width:300px;margin:0 auto}.classifyMain{margin-top:6px}} .choice{text-align:left;padding:12px 14px;border:1px solid var(--line);border-radius:10px;background:#fff;cursor:pointer;font-size:15px;font-weight:600} @@ -1106,7 +1108,7 @@ function defaultState(){ classifyDone:false, classifyWrong:null, freigabeDone:false, freigabeWrong:null, entryDone:false, entryWrong:null, - bonusReveal:false, bonusDone:{}, servicesDone:{}, + bonusReveal:false, bonusDone:{}, servicesDone:{}, akteFlash:null, index:0, stage:"discuss", quizIndex:0, actStep:0, actReveal:false, actDone:false, arteWrong:null, picks:{}, done:{}, akte:{}, @@ -1173,7 +1175,7 @@ function renderAkte(){ html += `

${PHASEN[ph].label}

`; group.forEach(a=>{ const ok = !!have[a]; - html += `
+ html += `
${a} ${ARTEFAKTE[a].name}${ARTEFAKTE[a].live?' ยท lebend':''} ${ok?'โœ“':'โ—‹'} @@ -1558,6 +1560,7 @@ function enterStation(idx){ S.stage = STATIONEN[idx].typ==="gate" ? "gate" : "act"; S.gatePick = null; S.quizIndex = 0; S.actStep = 0; S.actReveal = false; S.actDone = false; S.arteWrong = null; + S.akteFlash = null; document.body.classList.remove("akteOpen"); } function gateGoto(st, i){ S.done[st.id] = true; @@ -1811,13 +1814,16 @@ function wire(st){ const b = id => $("#"+id); if(b("actReveal")) b("actReveal").onclick = ()=>{ S.actReveal=true; save(); draw(); }; if(b("actNext")) b("actNext").onclick = ()=>{ S.actStep=(S.actStep||0)+1; S.actReveal=false; save(); draw(); }; - if(b("actToDone")) b("actToDone").onclick = ()=>{ S.actDone=true; save(); draw(); }; + if(b("actToDone")) b("actToDone").onclick = ()=>{ S.actDone=true; S.akteFlash=null; document.body.classList.remove("akteOpen"); save(); draw(); }; // Artefakt-Choice $("#panel").querySelectorAll(".arteChoice[data-a]").forEach(el=>{ - el.onclick = ()=>{ const a = el.dataset.a; - if(a === STATION_ARTEFAKT[st.id]){ S.arteWrong=null; addArtefakt(a); S.actReveal=true; } + el.onclick = ()=>{ const a = el.dataset.a; let correct=false; + if(a === STATION_ARTEFAKT[st.id]){ S.arteWrong=null; addArtefakt(a); S.akteFlash=a; S.actReveal=true; correct=true; } else { S.arteWrong = a; } - save(); draw(); }; + save(); draw(); + // Akte-Seitenleiste oeffnen, damit man sieht, dass das Artefakt nun drin ist + if(correct){ document.body.classList.remove("navOpen","rollenOpen"); document.body.classList.add("akteOpen"); } + }; }); if(b("actBack")) b("actBack").onclick = ()=>{ if(S.actDone){ S.actDone=false; } diff --git a/04_Tablet-Quiz/app/sw.js b/04_Tablet-Quiz/app/sw.js index 5dfcc9d..98a0e1c 100644 --- a/04_Tablet-Quiz/app/sw.js +++ b/04_Tablet-Quiz/app/sw.js @@ -1,5 +1,5 @@ /* Service Worker โ€” SLC-Workshop Companion (App-Shell, offline-first) */ -const CACHE = "slc-companion-v25"; +const CACHE = "slc-companion-v26"; const SHELL = ["./", "index.html", "manifest.webmanifest", "icon.svg"]; // Action-Card-Grafiken (cards/s-c.png) fuer Offline vorab cachen (alle 24). const CARDS = [];