diff --git a/public/presentations/coordinated-access-control-with-policy/index.html b/public/presentations/coordinated-access-control-with-policy/index.html
index 6848c57..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.
@@ -1571,6 +1570,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;