PageSourceSearch

https://northword.github.io/js/src/post-details.js?v=6.5.0

js northword.github.io collected 2026-10-03 09:41:55 UTC 3,424 bytes, 104 lines download raw bytes

1/* global NexT, CONFIG */
2
3$(document).ready(function() {
4
5  function initScrollSpy() {
6    var tocSelector = '.post-toc';
7    var $tocElement = $(tocSelector);
8    var activeCurrentSelector = '.active-current';
9
10    function removeCurrentActiveClass() {
11      $(tocSelector + ' ' + activeCurrentSelector)
12        .removeClass(activeCurrentSelector.substring(1));
13    }
14
15    $tocElement
16      .on('activate.bs.scrollspy', function() {
17        var $currentActiveElement = $(tocSelector + ' .active').last();
18
19        removeCurrentActiveClass();
20        $currentActiveElement.addClass('active-current');
21
22        // Scrolling to center active TOC element if TOC content is taller then viewport.
23        $tocElement.scrollTop($currentActiveElement.offset().top - $tocElement.offset().top + $tocElement.scrollTop() - ($tocElement.height() / 2));
24      })
25      .on('clear.bs.scrollspy', removeCurrentActiveClass);
26
27    $('body').scrollspy({ target: tocSelector });
28  }
29
30  initScrollSpy();
31});
32
33$(document).ready(function() {
34  var html = $('html');
35  var TAB_ANIMATE_DURATION = 200;
36  var hasVelocity = $.isFunction(html.velocity);
37
38  $('.sidebar-nav li').on('click', function() {
39    var item = $(this);
40    var activeTabClassName = 'sidebar-nav-active';
41    var activePanelClassName = 'sidebar-panel-active';
42    if (item.hasClass(activeTabClassName)) {
43      return;
44    }
45
46    var currentTarget = $('.' + activePanelClassName);
47    var target = $('.' + item.data('target'));
48
49    hasVelocity
50      ? currentTarget.velocity('transition.slideUpOut', TAB_ANIMATE_DURATION, function() {
51        target
52          .velocity('stop')
53          .velocity('transition.slideDownIn', TAB_ANIMATE_DURATION)
54          .addClass(activePanelClassName);
55      })
56      : currentTarget.animate({ opacity: 0 }, TAB_ANIMATE_DURATION, function() {
57        currentTarget.hide();
58        target
59          .stop()
60          .css({'opacity': 0, 'display': 'block'})
61          .animate({ opacity: 1 }, TAB_ANIMATE_DURATION, function() {
62            currentTarget.removeClass(activePanelClassName);
63            target.addClass(activePanelClassName);
64          });
65      });
66
67    item.siblings().removeClass(activeTabClassName);
68    item.addClass(activeTabClassName);
69  });
70
71  // TOC item animation navigate & prevent #item selector in adress bar.
72  $('.post-toc a').on('click', function(e) {
73    e.preventDefault();
74    var targetSelector = NexT.utils.escapeSelector(this.getAttribute('href'));
75    var offset = $(targetSelector).offset().top;
76
77    hasVelocity
78      ? html.velocity('stop').velocity('scroll', {
79        offset  : offset + 'px',
80        mobileHA: false
81      })
82      : $('html, body').stop().animate({
83        scrollTop: offset
84      }, 500);
85  });
86
87  // Expand sidebar on post detail page by default, when post has a toc.
88  var $tocContent = $('.post-toc-content');
89  var display = CONFIG.page.sidebar;
90  if (typeof display !== 'boolean') {
91    // There's no definition sidebar in the page front-matter
92    var isSidebarCouldDisplay = CONFIG.sidebar.display === 'post'
93     || CONFIG.sidebar.display === 'always';
94    var hasTOC = $tocContent.length > 0 && $tocContent.html().trim().length > 0;
95    display = isSidebarCouldDisplay && hasTOC;
96  }
97  if (display) {
98    CONFIG.motion.enable
99      ? NexT.motion.middleWares.sidebar = function() {
100        NexT.utils.displaySidebar();
101      }
102      : NexT.utils.displaySidebar();
103  }
104});

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.