diff --git a/src/pages/serving-robot-one-less-staff.astro b/src/pages/serving-robot-one-less-staff.astro index ec5b9ce..0158afa 100644 --- a/src/pages/serving-robot-one-less-staff.astro +++ b/src/pages/serving-robot-one-less-staff.astro @@ -151,12 +151,28 @@ const MENU = [
細い通路の入口で、ロボットどうしが鉢合わせ79→0回
レジのまわりでロボットが止まる112→31回
+
丸テーブルの間で、ロボットが動けなくなる8→0回
同じ店舗を、真上・正面・横・斜めの4つの視点で同時に見る。左上の枠(キッチンのモニター)に、ロボットとスタッフがいま何をしているか、止まった回数が出ます。
+ +
+
+
+ +

直す前丸テーブルの間 1.1m

+
+
+ +

直した後右の丸テーブルを1.0m右へ/間 2.1m

+
+
+
昔のファミレスの間取りをもとにした19卓の店舗。同じ客・同じ注文・同じ時刻で2回走らせ、違うのは右の丸テーブルの位置だけです(ロボット2台・真上から・12倍速)。右下は、走らせ始めてからの経過時間です。
+
@@ -326,10 +342,26 @@ const MENU = [ document.addEventListener('visibilitychange', function(){ if (document.hidden) { clearTimeout(timer); vids(scs[si], false); } else show(si); }); } var loops = document.querySelectorAll('.srl video.loop'); - if (still) { loops.forEach(function(v){ v.controls = true; }); } + if (still) { loops.forEach(function(v){ v.controls = true; }); document.querySelectorAll('#baPair video').forEach(function(v){ v.controls = true; }); } else if ('IntersectionObserver' in window) { var io = new IntersectionObserver(function(es){ es.forEach(function(e){ var v = e.target; if (e.isIntersecting) { v.play().catch(function(){}); } else { v.pause(); } }); }, { threshold: .35 }); loops.forEach(function(v){ io.observe(v); }); + // 直す前・直した後の2本は、見えたら頭から同時に流し、どちらかが終わったら2本とも頭に戻す + var ba = document.getElementById('baPair'); + if (ba) { + var bv = [].slice.call(ba.querySelectorAll('video')); + // 2本とも再生できる状態になってから頭をそろえて流す(片方の読み込みが遅いと、先に流れた方とずれるため) + var ready = function(){ return bv.every(function(v){ return v.readyState >= 3; }); }; + var restart = function(){ + if (!ready()) { bv.forEach(function(v){ v.addEventListener('canplay', function once(){ v.removeEventListener('canplay', once); if (ready()) restart(); }); }); return; } + bv.forEach(function(v){ try { v.currentTime = 0; v.play().catch(function(){}); } catch(e){} }); + }; + bv.forEach(function(v){ v.addEventListener('ended', restart); }); + // 流れている間も、右を左の時刻に合わせ直す(0.15秒以上ずれたら) + bv[0].addEventListener('timeupdate', function(){ var d = bv[1].currentTime - bv[0].currentTime; if (!bv[1].paused && Math.abs(d) > .15 && !bv[0].ended) { try { bv[1].currentTime = bv[0].currentTime; } catch(e){} } }); + var seen = false; + new IntersectionObserver(function(es){ es.forEach(function(e){ if (e.isIntersecting) { if (!seen) { seen = true; bv.forEach(function(v){ v.preload = 'auto'; }); restart(); } else { bv.forEach(function(v){ v.play().catch(function(){}); }); } } else { bv.forEach(function(v){ v.pause(); }); } }); }, { threshold: .35 }).observe(ba); + } } // ---- 02 ①:店が回る最少のスタッフ ---- @@ -530,6 +562,14 @@ const MENU = [ .srl .srow em.same{background:#f0f0f0;color:var(--muted)} .srl .srow em.cut{background:var(--ink);color:#fff} .srl .srow em.plus{background:transparent;color:var(--muted);border:1px solid var(--rule)} +.srl .ba{grid-column:1/-1;order:3;display:grid;gap:12px;margin:0} +.srl .ba-pair{display:grid;grid-template-columns:1fr 1fr;gap:16px} +.srl .ba-v{display:grid;gap:10px;min-width:0} +.srl .ba video{display:block;width:100%;max-width:100%;height:auto;aspect-ratio:992/864;background:#e8e2d6;border-radius:var(--r-m)} +.srl .ba-k{margin:0;display:flex;align-items:baseline;flex-wrap:wrap;gap:10px;font-size:.84rem;font-weight:700} +.srl .ba-tag{display:inline-block;padding:3px 10px;border-radius:4px;font-size:.8rem;background:#f0f0f0;color:var(--muted)} +.srl .ba-tag.after{background:var(--ink);color:#fff} +@media (max-width:640px){.srl .ba-pair{grid-template-columns:1fr}} .srl .clip{display:grid;gap:10px} .srl .clip-4{max-width:480px;justify-self:center;width:100%} .srl .clip-4 video{aspect-ratio:694/720!important}