10-ajan denetimi: 7 ceviri hatasi + 6 kod/UI bug'i duzeltildi

Ceviri (TOPLANTI JSON + TTS + timeline yeniden kuruldu):
- Blok 120, 122: kritik kopma (orijinalin %95'i cevrilmemisti) -> tam cevrildi
- Blok 59: "Wala" (yok/hayir) yanlislikla "Evet" cevrilmisti -> duzeltildi
- Blok 103, 195, 218, 249: anlam kaymasi/kopya hatalari duzeltildi

Kod/UI:
- curIndex(): repliklerarasi bosluklarda yanlislikla son index donuyordu
  (prev tusu kaydin sonuna isinliyordu) -> en yakin onceki index'e duzeltildi
- drawTL/seekTL/update: farkli duration fallback (1332 vs 1sn) -> ortak curDur()
- Zaman cizelgesine touch/dokunmatik surukleme destegi eklendi
- REC isigi/etiketi Kaan'in adindan uzaklastirildi (masa ortasina)
- Mobilde (390px) topbar/toggle/bar tasma riski azaltildi, kamera dar ekranda
  geri cekiliyor (fitCamera)
- Baslikta yanlis "09:00-31:13" sure yazisi kaldirildi
- Dockerfile/nginx.conf'un web'den servis edilmesi engellendi

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
yilsem
2026-07-04 06:16:58 +03:00
co-authored by Claude Sonnet 5
parent 29f317011f
commit 23f67afe60
6 changed files with 46 additions and 15 deletions
+37 -13
View File
@@ -39,15 +39,24 @@
font-size:15px;cursor:pointer;display:flex;align-items:center;justify-content:center}
.btn:hover{border-color:var(--accent)}
.btn.play{width:46px;height:46px;font-size:17px;background:var(--accent);border-color:var(--accent)}
#time{font-variant-numeric:tabular-nums;font-size:13px;color:var(--mut);min-width:190px}
#time{font-variant-numeric:tabular-nums;font-size:13px;color:var(--mut);min-width:120px}
#hint{font-size:11px;color:var(--mut)}
@media(max-width:640px){#subtitle{bottom:138px}#legend{display:none}#hint{display:none}}
@media(max-width:640px){
#subtitle{bottom:138px}
#hint{display:none}
#bar{flex-wrap:wrap}
#topbar h1{font-size:13px}
#topbar .sub{display:none}
.toggle button{padding:6px 10px;font-size:12px}
#legend{max-width:150px;font-size:10px;padding:7px 9px;top:56px}
#legend b{font-size:10.5px}
}
</style>
</head>
<body>
<div id="scene"></div>
<div id="topbar">
<h1>Toplantı — 3D Oda <span class="sub">· uzlaşma görüşmesi · 09:0031:13</span></h1>
<h1>Toplantı — 3D Oda <span class="sub">· uzlaşma görüşmesi (düzenlenmiş kayıt)</span></h1>
<div class="spacer"></div>
<div class="toggle" id="langToggle">
<button data-m="orig" class="on">🔊 Orijinal</button>
@@ -102,7 +111,12 @@ const scene=new THREE.Scene();
scene.background=new THREE.Color(0x0d1117);
scene.fog=new THREE.Fog(0x0d1117,16,34);
const camera=new THREE.PerspectiveCamera(48,innerWidth/innerHeight,0.1,100);
camera.position.set(0,6.2,9.6);
function fitCamera(){
const narrow=innerWidth<700;
camera.position.set(0, narrow?8.6:6.2, narrow?14.5:9.6);
camera.aspect=innerWidth/innerHeight; camera.updateProjectionMatrix();
}
fitCamera();
const renderer=new THREE.WebGLRenderer({antialias:true});
renderer.setSize(innerWidth,innerHeight); renderer.setPixelRatio(Math.min(devicePixelRatio,2));
document.getElementById('scene').appendChild(renderer.domElement);
@@ -127,8 +141,8 @@ tableTop.position.y=TABLE_H; scene.add(tableTop);
leg.position.set(p[0],TABLE_H/2,p[1]); scene.add(leg);
});
const rec=new THREE.Mesh(new THREE.BoxGeometry(0.5,0.12,0.28),new THREE.MeshStandardMaterial({color:0xd21f1f,emissive:0x330000,roughness:0.4}));
rec.position.set(-1.3,TABLE_H+0.14,1.0); scene.add(rec);
const recLbl=makeLabel("🔴 KAYIT","#ff6666",0.55); recLbl.position.set(-1.3,TABLE_H+0.55,1.0); scene.add(recLbl);
rec.position.set(0,TABLE_H+0.14,0); scene.add(rec);
const recLbl=makeLabel("🔴 KAYIT","#ff6666",0.55); recLbl.position.set(0,TABLE_H+0.55,0); scene.add(recLbl);
const SKIN=0xe8b98c, chars={};
function makeChar(role){
@@ -189,9 +203,10 @@ Object.keys(POS3D).forEach(function(r){
});
const tl=document.getElementById('tl'), tg=tl.getContext('2d');
function curDur(){ const d=A().duration, T=curTL(); return (Number.isFinite(d)&&d>0) ? d : T[T.length-1].e; }
function fitTL(){ tl.width=tl.clientWidth*devicePixelRatio; tl.height=34*devicePixelRatio; tg.setTransform(devicePixelRatio,0,0,devicePixelRatio,0,0); drawTL(); }
function drawTL(){
const T=curTL(), dur=A().duration||T[T.length-1].e, W=tl.clientWidth, H=34;
const T=curTL(), dur=curDur(), W=tl.clientWidth, H=34;
tg.clearRect(0,0,W,H);
tg.fillStyle="#21262d"; roundRect(tg,0,11,W,12,6); tg.fill();
tg.globalAlpha=0.85;
@@ -199,19 +214,28 @@ function drawTL(){
tg.globalAlpha=1;
const ph=(A().currentTime/dur)*W; tg.fillStyle="#fff"; tg.fillRect(ph-1,6,2,22); tg.beginPath(); tg.arc(ph,6,4,0,7); tg.fill();
}
function seekTL(e){ const r=tl.getBoundingClientRect(); const x=(e.clientX-r.left)/r.width; const a=A(); a.currentTime=Math.max(0,Math.min(1,x))*(a.duration||1); update(); }
function seekAtClientX(clientX){ const r=tl.getBoundingClientRect(); const x=(clientX-r.left)/r.width; const a=A(); a.currentTime=Math.max(0,Math.min(1,x))*curDur(); update(); }
let drag=false;
tl.addEventListener('mousedown',function(e){drag=true;seekTL(e);});
addEventListener('mousemove',function(e){if(drag)seekTL(e);});
tl.addEventListener('mousedown',function(e){drag=true;seekAtClientX(e.clientX);});
addEventListener('mousemove',function(e){if(drag)seekAtClientX(e.clientX);});
addEventListener('mouseup',function(){drag=false;});
tl.addEventListener('touchstart',function(e){drag=true;seekAtClientX(e.touches[0].clientX);e.preventDefault();},{passive:false});
addEventListener('touchmove',function(e){if(drag){seekAtClientX(e.touches[0].clientX);e.preventDefault();}},{passive:false});
addEventListener('touchend',function(){drag=false;});
function curIndex(){ const t=A().currentTime, T=curTL(); for(let i=0;i<T.length;i++){ if(t>=T[i].t&&t<T[i].e) return i; } return t<T[0].t?-1:T.length-1; }
function curIndex(){
const t=A().currentTime, T=curTL();
if(t<T[0].t) return -1;
let ans=0;
for(let i=0;i<T.length;i++){ if(T[i].t<=t) ans=i; else break; }
return ans;
}
let lastRole=null;
function highlight(role){ if(role===lastRole)return; lastRole=role; for(const r in chars){ const on=(r===role); chars[r].active=on; chars[r].ring.visible=on; chars[r].bulb.visible=on; chars[r].halo.visible=on; if(!on)chars[r].blight.intensity=0; } }
const fmt=function(s){s=Math.max(0,s|0);return String(s/60|0).padStart(2,'0')+':'+String(s%60).padStart(2,'0');};
const sub=document.getElementById('subtitle'),sW=document.getElementById('subWho'),sO=document.getElementById('subOrig'),sT=document.getElementById('subTr');
function update(){
const a=A(), T=curTL(), dur=a.duration||T[T.length-1].e;
const a=A(), T=curTL(), dur=curDur();
document.getElementById('time').textContent=fmt(a.currentTime)+' / '+fmt(dur);
const i=curIndex();
if(i>=0){ const b=T[i]; highlight(b.rol);
@@ -263,7 +287,7 @@ function loop(){
controls.update(); renderer.render(scene,camera);
}
loop();
addEventListener('resize',function(){ camera.aspect=innerWidth/innerHeight; camera.updateProjectionMatrix(); renderer.setSize(innerWidth,innerHeight); fitTL(); });
addEventListener('resize',function(){ fitCamera(); renderer.setSize(innerWidth,innerHeight); fitTL(); });
fitTL();
</script>
</body>