115 lines
3.6 KiB
JavaScript
115 lines
3.6 KiB
JavaScript
/* global NexT, CONFIG, Velocity */
|
|
|
|
NexT.boot = {};
|
|
|
|
NexT.boot.registerEvents = function() {
|
|
|
|
NexT.utils.registerScrollPercent();
|
|
NexT.utils.registerCanIUseTag();
|
|
|
|
// Mobile top menu bar.
|
|
document.querySelector('.site-nav-toggle .toggle').addEventListener('click', () => {
|
|
event.currentTarget.classList.toggle('toggle-close');
|
|
var siteNav = document.querySelector('.site-nav');
|
|
var animateAction = siteNav.classList.contains('site-nav-on') ? 'slideUp' : 'slideDown';
|
|
|
|
if (typeof Velocity === 'function') {
|
|
Velocity(siteNav, animateAction, {
|
|
duration: 200,
|
|
complete: function() {
|
|
siteNav.classList.toggle('site-nav-on');
|
|
}
|
|
});
|
|
} else {
|
|
siteNav.classList.toggle('site-nav-on');
|
|
}
|
|
});
|
|
|
|
var TAB_ANIMATE_DURATION = 200;
|
|
document.querySelectorAll('.sidebar-nav li').forEach((element, index) => {
|
|
element.addEventListener('click', event => {
|
|
var item = event.currentTarget;
|
|
var activeTabClassName = 'sidebar-nav-active';
|
|
var activePanelClassName = 'sidebar-panel-active';
|
|
if (item.classList.contains(activeTabClassName)) return;
|
|
|
|
var targets = document.querySelectorAll('.sidebar-panel');
|
|
var target = targets[index];
|
|
var currentTarget = targets[1 - index];
|
|
window.anime({
|
|
targets : currentTarget,
|
|
duration: TAB_ANIMATE_DURATION,
|
|
easing : 'linear',
|
|
opacity : 0,
|
|
complete: () => {
|
|
// Prevent adding TOC to Overview if Overview was selected when close & open sidebar.
|
|
currentTarget.classList.remove(activePanelClassName);
|
|
target.style.opacity = 0;
|
|
target.classList.add(activePanelClassName);
|
|
window.anime({
|
|
targets : target,
|
|
duration: TAB_ANIMATE_DURATION,
|
|
easing : 'linear',
|
|
opacity : 1
|
|
});
|
|
}
|
|
});
|
|
|
|
[...item.parentNode.children].forEach(element => {
|
|
element.classList.remove(activeTabClassName);
|
|
});
|
|
item.classList.add(activeTabClassName);
|
|
});
|
|
});
|
|
|
|
window.addEventListener('resize', NexT.utils.initSidebarDimension);
|
|
|
|
window.addEventListener('hashchange', () => {
|
|
var tHash = location.hash;
|
|
if (tHash !== '' && !tHash.match(/%\S{2}/)) {
|
|
var target = document.querySelector(`.tabs ul.nav-tabs li a[href="${tHash}"]`);
|
|
target && target.click();
|
|
}
|
|
});
|
|
};
|
|
|
|
NexT.boot.refresh = function() {
|
|
|
|
/**
|
|
* Register JS handlers by condition option.
|
|
* Need to add config option in Front-End at 'layout/_partials/head.swig' file.
|
|
*/
|
|
CONFIG.fancybox && NexT.utils.wrapImageWithFancyBox();
|
|
CONFIG.mediumzoom && window.mediumZoom('.post-body :not(a) > img, .post-body > img');
|
|
CONFIG.lazyload && window.lozad('.post-body img').observe();
|
|
CONFIG.pangu && window.pangu.spacingPage();
|
|
|
|
CONFIG.exturl && NexT.utils.registerExtURL();
|
|
CONFIG.copycode.enable && NexT.utils.registerCopyCode();
|
|
NexT.utils.registerTabsTag();
|
|
NexT.utils.registerActiveMenuItem();
|
|
NexT.utils.registerSidebarTOC();
|
|
NexT.utils.wrapTableWithBox();
|
|
NexT.utils.registerVideoIframe();
|
|
};
|
|
|
|
NexT.boot.motion = function() {
|
|
// Define Motion Sequence & Bootstrap Motion.
|
|
if (CONFIG.motion.enable) {
|
|
NexT.motion.integrator
|
|
.add(NexT.motion.middleWares.logo)
|
|
.add(NexT.motion.middleWares.menu)
|
|
.add(NexT.motion.middleWares.postList)
|
|
.add(NexT.motion.middleWares.sidebar)
|
|
.bootstrap();
|
|
} else {
|
|
NexT.utils.updateSidebarPosition();
|
|
}
|
|
};
|
|
|
|
window.addEventListener('DOMContentLoaded', () => {
|
|
NexT.boot.registerEvents();
|
|
NexT.boot.refresh();
|
|
NexT.boot.motion();
|
|
});
|