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;