From 2931022ec079344fa7adbf77a62c22754297e004 Mon Sep 17 00:00:00 2001 From: Minghe Huang Date: Mon, 18 May 2026 20:25:06 -0700 Subject: [PATCH 1/2] fix(slides): support touch swipe navigation on mobile Adds swipe left/right to advance/rewind slides. Skips swipes that start inside horizontally scrollable elements (pre, arch-flow) so in-block scrolling still works. Vertical-dominant gestures are ignored to avoid hijacking page scroll. --- .../index.html | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/public/presentations/coordinated-access-control-with-policy/index.html b/public/presentations/coordinated-access-control-with-policy/index.html index 6848c57..b9259ca 100644 --- a/public/presentations/coordinated-access-control-with-policy/index.html +++ b/public/presentations/coordinated-access-control-with-policy/index.html @@ -1571,6 +1571,32 @@

Keyboard shortcuts

} }); +// Touch swipe navigation (mobile) +let tStartX = 0, tStartY = 0, tStartTarget = null; +document.addEventListener('touchstart', (e) => { + const t = e.changedTouches[0]; + tStartX = t.screenX; + tStartY = t.screenY; + tStartTarget = e.target; +}, { passive: true }); +document.addEventListener('touchend', (e) => { + const t = e.changedTouches[0]; + const dx = t.screenX - tStartX; + const dy = t.screenY - tStartY; + if (Math.abs(dx) < 60) return; + if (Math.abs(dy) > Math.abs(dx) * 0.7) return; + // skip if swipe started inside a horizontally scrollable element + let el = tStartTarget; + while (el && el !== document.body) { + if (el.scrollWidth > el.clientWidth) { + const cs = getComputedStyle(el); + if (cs.overflowX === 'auto' || cs.overflowX === 'scroll') return; + } + el = el.parentElement; + } + if (dx < 0) next(); else prev(); +}, { passive: true }); + const saved = localStorage.getItem('deck-theme'); if (saved) { document.body.dataset.theme = saved; From 630f6af04e077e08df14edd1ea867f4d5efdb016 Mon Sep 17 00:00:00 2001 From: Minghe Huang Date: Mon, 18 May 2026 21:23:34 -0700 Subject: [PATCH 2/2] docs(slides): sync speaker notes + slide 6 layout from canonical source - Slide 5 closing line tightened - Slide 6: promote Schema/Policy engine/Router lines to the big-text block and drop the redundant muted paragraph --- .../coordinated-access-control-with-policy/index.html | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/public/presentations/coordinated-access-control-with-policy/index.html b/public/presentations/coordinated-access-control-with-policy/index.html index b9259ca..2c0f5cc 100644 --- a/public/presentations/coordinated-access-control-with-policy/index.html +++ b/public/presentations/coordinated-access-control-with-policy/index.html @@ -1199,7 +1199,7 @@

Every claim was real. No single place to enforce them.

-
+
The Cost ¶ 05

The coordination cost, by the numbers.

@@ -1212,15 +1212,14 @@

The coordination cost, by the numbers.

-
+
The Insight ¶ 06
- What if the schema declares the contract,
- but the router evaluates
- every team's policies at one place? + Schema = the coordination contract.
+ Policy engine = where teams author their concerns independently.
+ Router = the unified enforcer.
-

Schema = the coordination contract.
Policy engine = where teams author their concerns independently.
Router = the unified enforcer.