mirror of
git://f0xx.org/ac/ac-platform-web
synced 2026-07-29 05:58:02 +03:00
84 lines
2.2 KiB
JavaScript
84 lines
2.2 KiB
JavaScript
/**
|
|
* Collapsible left nav: click toggle + horizontal drag on handle (open on drag right).
|
|
*/
|
|
(function () {
|
|
'use strict';
|
|
|
|
var DRAG_THRESHOLD_PX = 20;
|
|
|
|
function setOpen(nav, handle, open) {
|
|
nav.classList.toggle('open', open);
|
|
if (handle) {
|
|
handle.setAttribute('aria-expanded', open ? 'true' : 'false');
|
|
}
|
|
}
|
|
|
|
function bindNavShell(paneId, handleId) {
|
|
var nav = document.getElementById(paneId);
|
|
var handle = document.getElementById(handleId);
|
|
if (!nav || !handle) return;
|
|
|
|
setOpen(nav, handle, nav.classList.contains('open'));
|
|
|
|
var drag = null;
|
|
var suppressClick = false;
|
|
|
|
handle.addEventListener('click', function (ev) {
|
|
if (suppressClick) {
|
|
suppressClick = false;
|
|
ev.preventDefault();
|
|
return;
|
|
}
|
|
setOpen(nav, handle, !nav.classList.contains('open'));
|
|
});
|
|
|
|
handle.addEventListener('pointerdown', function (ev) {
|
|
if (ev.button !== 0) return;
|
|
drag = { x: ev.clientX, moved: false };
|
|
handle.setPointerCapture(ev.pointerId);
|
|
handle.classList.add('is-dragging');
|
|
ev.preventDefault();
|
|
});
|
|
|
|
handle.addEventListener('pointermove', function (ev) {
|
|
if (!drag || !handle.hasPointerCapture(ev.pointerId)) return;
|
|
var dx = ev.clientX - drag.x;
|
|
if (Math.abs(dx) < 4) return;
|
|
drag.moved = true;
|
|
if (dx > DRAG_THRESHOLD_PX) {
|
|
setOpen(nav, handle, true);
|
|
drag.x = ev.clientX;
|
|
} else if (dx < -DRAG_THRESHOLD_PX) {
|
|
setOpen(nav, handle, false);
|
|
drag.x = ev.clientX;
|
|
}
|
|
});
|
|
|
|
function endDrag(ev) {
|
|
if (!drag) return;
|
|
if (drag.moved) suppressClick = true;
|
|
drag = null;
|
|
handle.classList.remove('is-dragging');
|
|
if (handle.hasPointerCapture(ev.pointerId)) {
|
|
handle.releasePointerCapture(ev.pointerId);
|
|
}
|
|
}
|
|
|
|
handle.addEventListener('pointerup', endDrag);
|
|
handle.addEventListener('pointercancel', endDrag);
|
|
}
|
|
|
|
window.initNavShell = bindNavShell;
|
|
|
|
function autoInit() {
|
|
bindNavShell('nav-pane', 'nav-handle');
|
|
bindNavShell('landing-nav-pane', 'landing-nav-handle');
|
|
}
|
|
|
|
if (document.readyState === 'loading') {
|
|
document.addEventListener('DOMContentLoaded', autoInit);
|
|
} else {
|
|
autoInit();
|
|
}
|
|
})();
|