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:
co-authored by
Claude Sonnet 5
parent
29f317011f
commit
23f67afe60
@@ -8,3 +8,4 @@ tts/
|
|||||||
.playwright-mcp/
|
.playwright-mcp/
|
||||||
*.md
|
*.md
|
||||||
*.log
|
*.log
|
||||||
|
Dockerfile
|
||||||
|
|||||||
+37
-13
@@ -39,15 +39,24 @@
|
|||||||
font-size:15px;cursor:pointer;display:flex;align-items:center;justify-content:center}
|
font-size:15px;cursor:pointer;display:flex;align-items:center;justify-content:center}
|
||||||
.btn:hover{border-color:var(--accent)}
|
.btn:hover{border-color:var(--accent)}
|
||||||
.btn.play{width:46px;height:46px;font-size:17px;background:var(--accent);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)}
|
#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>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="scene"></div>
|
<div id="scene"></div>
|
||||||
<div id="topbar">
|
<div id="topbar">
|
||||||
<h1>Toplantı — 3D Oda <span class="sub">· uzlaşma görüşmesi · 09:00–31: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="spacer"></div>
|
||||||
<div class="toggle" id="langToggle">
|
<div class="toggle" id="langToggle">
|
||||||
<button data-m="orig" class="on">🔊 Orijinal</button>
|
<button data-m="orig" class="on">🔊 Orijinal</button>
|
||||||
@@ -102,7 +111,12 @@ const scene=new THREE.Scene();
|
|||||||
scene.background=new THREE.Color(0x0d1117);
|
scene.background=new THREE.Color(0x0d1117);
|
||||||
scene.fog=new THREE.Fog(0x0d1117,16,34);
|
scene.fog=new THREE.Fog(0x0d1117,16,34);
|
||||||
const camera=new THREE.PerspectiveCamera(48,innerWidth/innerHeight,0.1,100);
|
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});
|
const renderer=new THREE.WebGLRenderer({antialias:true});
|
||||||
renderer.setSize(innerWidth,innerHeight); renderer.setPixelRatio(Math.min(devicePixelRatio,2));
|
renderer.setSize(innerWidth,innerHeight); renderer.setPixelRatio(Math.min(devicePixelRatio,2));
|
||||||
document.getElementById('scene').appendChild(renderer.domElement);
|
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);
|
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}));
|
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);
|
rec.position.set(0,TABLE_H+0.14,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);
|
const recLbl=makeLabel("🔴 KAYIT","#ff6666",0.55); recLbl.position.set(0,TABLE_H+0.55,0); scene.add(recLbl);
|
||||||
|
|
||||||
const SKIN=0xe8b98c, chars={};
|
const SKIN=0xe8b98c, chars={};
|
||||||
function makeChar(role){
|
function makeChar(role){
|
||||||
@@ -189,9 +203,10 @@ Object.keys(POS3D).forEach(function(r){
|
|||||||
});
|
});
|
||||||
|
|
||||||
const tl=document.getElementById('tl'), tg=tl.getContext('2d');
|
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 fitTL(){ tl.width=tl.clientWidth*devicePixelRatio; tl.height=34*devicePixelRatio; tg.setTransform(devicePixelRatio,0,0,devicePixelRatio,0,0); drawTL(); }
|
||||||
function 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.clearRect(0,0,W,H);
|
||||||
tg.fillStyle="#21262d"; roundRect(tg,0,11,W,12,6); tg.fill();
|
tg.fillStyle="#21262d"; roundRect(tg,0,11,W,12,6); tg.fill();
|
||||||
tg.globalAlpha=0.85;
|
tg.globalAlpha=0.85;
|
||||||
@@ -199,19 +214,28 @@ function drawTL(){
|
|||||||
tg.globalAlpha=1;
|
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();
|
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;
|
let drag=false;
|
||||||
tl.addEventListener('mousedown',function(e){drag=true;seekTL(e);});
|
tl.addEventListener('mousedown',function(e){drag=true;seekAtClientX(e.clientX);});
|
||||||
addEventListener('mousemove',function(e){if(drag)seekTL(e);});
|
addEventListener('mousemove',function(e){if(drag)seekAtClientX(e.clientX);});
|
||||||
addEventListener('mouseup',function(){drag=false;});
|
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;
|
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; } }
|
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 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');
|
const sub=document.getElementById('subtitle'),sW=document.getElementById('subWho'),sO=document.getElementById('subOrig'),sT=document.getElementById('subTr');
|
||||||
function update(){
|
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);
|
document.getElementById('time').textContent=fmt(a.currentTime)+' / '+fmt(dur);
|
||||||
const i=curIndex();
|
const i=curIndex();
|
||||||
if(i>=0){ const b=T[i]; highlight(b.rol);
|
if(i>=0){ const b=T[i]; highlight(b.rol);
|
||||||
@@ -263,7 +287,7 @@ function loop(){
|
|||||||
controls.update(); renderer.render(scene,camera);
|
controls.update(); renderer.render(scene,camera);
|
||||||
}
|
}
|
||||||
loop();
|
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();
|
fitTL();
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
|
|||||||
@@ -4,6 +4,12 @@ server {
|
|||||||
root /usr/share/nginx/html;
|
root /usr/share/nginx/html;
|
||||||
index index.html;
|
index index.html;
|
||||||
|
|
||||||
|
# Dagitim yapilandirma dosyalari disariya sizmasin
|
||||||
|
location ~* ^/(Dockerfile|nginx\.conf|\.dockerignore|\.gitignore)$ {
|
||||||
|
deny all;
|
||||||
|
return 404;
|
||||||
|
}
|
||||||
|
|
||||||
# Tek sayfa; her yol index.html'e düşsün
|
# Tek sayfa; her yol index.html'e düşsün
|
||||||
location / {
|
location / {
|
||||||
try_files $uri $uri/ /index.html;
|
try_files $uri $uri/ /index.html;
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user