diff options
author | Mario Vavti <mario@mariovavti.com> | 2016-12-15 12:25:59 +0100 |
---|---|---|
committer | Mario Vavti <mario@mariovavti.com> | 2016-12-15 12:25:59 +0100 |
commit | 273ab304b9fd3703a230f8af753226368146cac1 (patch) | |
tree | 2494f048035c60631354d72149e2881395b7a39f | |
parent | 2a2a4b96c70bbbb32367f4f56a4f4e176bbb80d5 (diff) | |
download | volse-hubzilla-273ab304b9fd3703a230f8af753226368146cac1.tar.gz volse-hubzilla-273ab304b9fd3703a230f8af753226368146cac1.tar.bz2 volse-hubzilla-273ab304b9fd3703a230f8af753226368146cac1.zip |
reworked doco navigation
-rw-r--r-- | doc/toc.html | 525 | ||||
-rw-r--r-- | view/tpl/help.tpl | 9 |
2 files changed, 246 insertions, 288 deletions
diff --git a/doc/toc.html b/doc/toc.html index 0d342d25a..7fad42b36 100644 --- a/doc/toc.html +++ b/doc/toc.html @@ -15,10 +15,6 @@ #region_1 .widget ul ul { list-style-type: none; } - - .toc-content { - background-color: white; - } .toc-content li, #doco-top-toc li { @@ -99,293 +95,272 @@ </div> <script> -// Sticky Plugin v1.0.4 for jQuery -// ============= -// Author: Anthony Garand -// Improvements by German M. Bravo (Kronuz) and Ruud Kamphuis (ruudk) -// Improvements by Leonardo C. Daronco (daronco) -// Created: 02/14/2011 -// Date: 07/20/2015 -// Website: http://stickyjs.com/ -// Description: Makes an element on the page stick on the screen as you scroll -// It will only set the 'top' and 'position' of your element, you -// might need to adjust the width in some cases. +// Generated by CoffeeScript 1.10.0 -(function (factory) { - if (typeof define === 'function' && define.amd) { - // AMD. Register as an anonymous module. - define(['jquery'], factory); - } else if (typeof module === 'object' && module.exports) { - // Node/CommonJS - module.exports = factory(require('jquery')); - } else { - // Browser globals - factory(jQuery); - } -}(function ($) { - var slice = Array.prototype.slice; // save ref to original slice() - var splice = Array.prototype.splice; // save ref to original slice() +/** +@license Sticky-kit v1.1.3 | MIT | Leaf Corcoran 2015 | http://leafo.net + */ - var defaults = { - topSpacing: 0, - bottomSpacing: 0, - className: 'is-sticky', - wrapperClassName: 'sticky-wrapper', - center: false, - getWidthFrom: '', - widthFromWrapper: true, // works only when .getWidthFrom is empty - responsiveWidth: false, - zIndex: 'auto' - }, - $window = $(window), - $document = $(document), - sticked = [], - windowHeight = $window.height(), - scroller = function() { - var scrollTop = $window.scrollTop(), - documentHeight = $document.height(), - dwh = documentHeight - windowHeight, - extra = (scrollTop > dwh) ? dwh - scrollTop : 0; +(function() { + var $, win; - for (var i = 0, l = sticked.length; i < l; i++) { - var s = sticked[i], - elementTop = s.stickyWrapper.offset().top, - etse = elementTop - s.topSpacing - extra; + $ = window.jQuery; - //update height in case of dynamic content - s.stickyWrapper.css('height', s.stickyElement.outerHeight()); + win = $(window); - if (scrollTop <= etse) { - if (s.currentTop !== null) { - s.stickyElement - .css({ - 'width': '', - 'position': '', - 'top': '', - 'z-index': '' - }); - s.stickyElement.parent().removeClass(s.className); - s.stickyElement.trigger('sticky-end', [s]); - s.currentTop = null; - } + $.fn.stick_in_parent = function(opts) { + var doc, elm, enable_bottoming, fn, i, inner_scrolling, len, manual_spacer, offset_top, outer_width, parent_selector, recalc_every, sticky_class; + if (opts == null) { + opts = {}; + } + sticky_class = opts.sticky_class, inner_scrolling = opts.inner_scrolling, recalc_every = opts.recalc_every, parent_selector = opts.parent, offset_top = opts.offset_top, manual_spacer = opts.spacer, enable_bottoming = opts.bottoming; + if (offset_top == null) { + offset_top = 0; + } + if (parent_selector == null) { + parent_selector = void 0; + } + if (inner_scrolling == null) { + inner_scrolling = true; + } + if (sticky_class == null) { + sticky_class = "is_stuck"; + } + doc = $(document); + if (enable_bottoming == null) { + enable_bottoming = true; + } + outer_width = function(el) { + var _el, computed, w; + if (window.getComputedStyle) { + _el = el[0]; + computed = window.getComputedStyle(el[0]); + w = parseFloat(computed.getPropertyValue("width")) + parseFloat(computed.getPropertyValue("margin-left")) + parseFloat(computed.getPropertyValue("margin-right")); + if (computed.getPropertyValue("box-sizing") !== "border-box") { + w += parseFloat(computed.getPropertyValue("border-left-width")) + parseFloat(computed.getPropertyValue("border-right-width")) + parseFloat(computed.getPropertyValue("padding-left")) + parseFloat(computed.getPropertyValue("padding-right")); } - else { - var newTop = documentHeight - s.stickyElement.outerHeight() - - s.topSpacing - s.bottomSpacing - scrollTop - extra; - if (newTop < 0) { - newTop = newTop + s.topSpacing; - } else { - newTop = s.topSpacing; - } - if (s.currentTop !== newTop) { - var newWidth; - if (s.getWidthFrom) { - newWidth = $(s.getWidthFrom).width() || null; - } else if (s.widthFromWrapper) { - newWidth = s.stickyWrapper.width(); - } - if (newWidth == null) { - newWidth = s.stickyElement.width(); - } - s.stickyElement - .css('width', newWidth) - .css('position', 'fixed') - .css('top', newTop) - .css('z-index', s.zIndex); - - s.stickyElement.parent().addClass(s.className); - - if (s.currentTop === null) { - s.stickyElement.trigger('sticky-start', [s]); - } else { - // sticky is started but it have to be repositioned - s.stickyElement.trigger('sticky-update', [s]); - } - - if (s.currentTop === s.topSpacing && s.currentTop > newTop || s.currentTop === null && newTop < s.topSpacing) { - // just reached bottom || just started to stick but bottom is already reached - s.stickyElement.trigger('sticky-bottom-reached', [s]); - } else if(s.currentTop !== null && newTop === s.topSpacing && s.currentTop < newTop) { - // sticky is started && sticked at topSpacing && overflowing from top just finished - s.stickyElement.trigger('sticky-bottom-unreached', [s]); - } - - s.currentTop = newTop; - } - - // Check if sticky has reached end of container and stop sticking - var stickyWrapperContainer = s.stickyWrapper.parent(); - var unstick = (s.stickyElement.offset().top + s.stickyElement.outerHeight() >= stickyWrapperContainer.offset().top + stickyWrapperContainer.outerHeight()) && (s.stickyElement.offset().top <= s.topSpacing); - - if( unstick ) { - s.stickyElement - .css('position', 'absolute') - .css('top', '') - .css('bottom', 0) - .css('z-index', ''); - } else { - s.stickyElement - .css('position', 'fixed') - .css('top', newTop) - .css('bottom', '') - .css('z-index', s.zIndex); + return w; + } else { + return el.outerWidth(true); + } + }; + fn = function(elm, padding_bottom, parent_top, parent_height, top, height, el_float, detached) { + var bottomed, detach, fixed, last_pos, last_scroll_height, offset, parent, recalc, recalc_and_tick, recalc_counter, spacer, tick; + if (elm.data("sticky_kit")) { + return; + } + elm.data("sticky_kit", true); + last_scroll_height = doc.height(); + parent = elm.parent(); + if (parent_selector != null) { + parent = parent.closest(parent_selector); + } + if (!parent.length) { + throw "failed to find stick parent"; + } + fixed = false; + bottomed = false; + spacer = manual_spacer != null ? manual_spacer && elm.closest(manual_spacer) : $("<div />"); + if (spacer) { + spacer.css('position', elm.css('position')); + } + recalc = function() { + var border_top, padding_top, restore; + if (detached) { + return; + } + last_scroll_height = doc.height(); + border_top = parseInt(parent.css("border-top-width"), 10); + padding_top = parseInt(parent.css("padding-top"), 10); + padding_bottom = parseInt(parent.css("padding-bottom"), 10); + parent_top = parent.offset().top + border_top + padding_top; + parent_height = parent.height(); + if (fixed) { + fixed = false; + bottomed = false; + if (manual_spacer == null) { + elm.insertAfter(spacer); + spacer.detach(); } + elm.css({ + position: "", + top: "", + width: "", + bottom: "" + }).removeClass(sticky_class); + restore = true; } - } - }, - resizer = function() { - windowHeight = $window.height(); - - for (var i = 0, l = sticked.length; i < l; i++) { - var s = sticked[i]; - var newWidth = null; - if (s.getWidthFrom) { - if (s.responsiveWidth) { - newWidth = $(s.getWidthFrom).width(); - } - } else if(s.widthFromWrapper) { - newWidth = s.stickyWrapper.width(); + top = elm.offset().top - (parseInt(elm.css("margin-top"), 10) || 0) - offset_top; + height = elm.outerHeight(true); + el_float = elm.css("float"); + if (spacer) { + spacer.css({ + width: outer_width(elm), + height: height, + display: elm.css("display"), + "vertical-align": elm.css("vertical-align"), + "float": el_float + }); } - if (newWidth != null) { - s.stickyElement.css('width', newWidth); + if (restore) { + return tick(); } + }; + recalc(); + if (height === parent_height) { + return; } - }, - methods = { - init: function(options) { - return this.each(function() { - var o = $.extend({}, defaults, options); - var stickyElement = $(this); - - var stickyId = stickyElement.attr('id'); - var wrapperId = stickyId ? stickyId + '-' + defaults.wrapperClassName : defaults.wrapperClassName; - var wrapper = $('<div></div>') - .attr('id', wrapperId) - .addClass(o.wrapperClassName); - - stickyElement.wrapAll(function() { - if ($(this).parent("#" + wrapperId).length == 0) { - return wrapper; + last_pos = void 0; + offset = offset_top; + recalc_counter = recalc_every; + tick = function() { + var css, delta, recalced, scroll, will_bottom, win_height; + if (detached) { + return; + } + recalced = false; + if (recalc_counter != null) { + recalc_counter -= 1; + if (recalc_counter <= 0) { + recalc_counter = recalc_every; + recalc(); + recalced = true; + } + } + if (!recalced && doc.height() !== last_scroll_height) { + recalc(); + recalced = true; + } + scroll = win.scrollTop(); + if (last_pos != null) { + delta = scroll - last_pos; + } + last_pos = scroll; + if (fixed) { + if (enable_bottoming) { + will_bottom = scroll + height + offset > parent_height + parent_top; + if (bottomed && !will_bottom) { + bottomed = false; + elm.css({ + position: "fixed", + bottom: "", + top: offset + }).trigger("sticky_kit:unbottom"); } -}); - - var stickyWrapper = stickyElement.parent(); - - if (o.center) { - stickyWrapper.css({width:stickyElement.outerWidth(),marginLeft:"auto",marginRight:"auto"}); } - - if (stickyElement.css("float") === "right") { - stickyElement.css({"float":"none"}).parent().css({"float":"right"}); + if (scroll < top) { + fixed = false; + offset = offset_top; + if (manual_spacer == null) { + if (el_float === "left" || el_float === "right") { + elm.insertAfter(spacer); + } + spacer.detach(); + } + css = { + position: "", + width: "", + top: "" + }; + elm.css(css).removeClass(sticky_class).trigger("sticky_kit:unstick"); } - - o.stickyElement = stickyElement; - o.stickyWrapper = stickyWrapper; - o.currentTop = null; - - sticked.push(o); - - methods.setWrapperHeight(this); - methods.setupChangeListeners(this); - }); - }, - - setWrapperHeight: function(stickyElement) { - var element = $(stickyElement); - var stickyWrapper = element.parent(); - if (stickyWrapper) { - stickyWrapper.css('height', element.outerHeight()); - } - }, - - setupChangeListeners: function(stickyElement) { - if (window.MutationObserver) { - var mutationObserver = new window.MutationObserver(function(mutations) { - if (mutations[0].addedNodes.length || mutations[0].removedNodes.length) { - methods.setWrapperHeight(stickyElement); + if (inner_scrolling) { + win_height = win.height(); + if (height + offset_top > win_height) { + if (!bottomed) { + offset -= delta; + offset = Math.max(win_height - height, offset); + offset = Math.min(offset_top, offset); + if (fixed) { + elm.css({ + top: offset + "px" + }); + } + } } - }); - mutationObserver.observe(stickyElement, {subtree: true, childList: true}); + } } else { - if (window.addEventListener) { - stickyElement.addEventListener('DOMNodeInserted', function() { - methods.setWrapperHeight(stickyElement); - }, false); - stickyElement.addEventListener('DOMNodeRemoved', function() { - methods.setWrapperHeight(stickyElement); - }, false); - } else if (window.attachEvent) { - stickyElement.attachEvent('onDOMNodeInserted', function() { - methods.setWrapperHeight(stickyElement); - }); - stickyElement.attachEvent('onDOMNodeRemoved', function() { - methods.setWrapperHeight(stickyElement); - }); + if (scroll > top) { + fixed = true; + css = { + position: "fixed", + top: offset + }; + css.width = elm.css("box-sizing") === "border-box" ? elm.outerWidth() + "px" : elm.width() + "px"; + elm.css(css).addClass(sticky_class); + if (manual_spacer == null) { + elm.after(spacer); + if (el_float === "left" || el_float === "right") { + spacer.append(elm); + } + } + elm.trigger("sticky_kit:stick"); } } - }, - update: scroller, - unstick: function(options) { - return this.each(function() { - var that = this; - var unstickyElement = $(that); - - var removeIdx = -1; - var i = sticked.length; - while (i-- > 0) { - if (sticked[i].stickyElement.get(0) === that) { - splice.call(sticked,i,1); - removeIdx = i; - } + if (fixed && enable_bottoming) { + if (will_bottom == null) { + will_bottom = scroll + height + offset > parent_height + parent_top; } - if(removeIdx !== -1) { - unstickyElement.unwrap(); - unstickyElement - .css({ - 'width': '', - 'position': '', - 'top': '', - 'float': '', - 'z-index': '' - }) - ; + if (!bottomed && will_bottom) { + bottomed = true; + if (parent.css("position") === "static") { + parent.css({ + position: "relative" + }); + } + return elm.css({ + position: "absolute", + bottom: padding_bottom, + top: "auto" + }).trigger("sticky_kit:bottom"); } + } + }; + recalc_and_tick = function() { + recalc(); + return tick(); + }; + detach = function() { + detached = true; + win.off("touchmove", tick); + win.off("scroll", tick); + win.off("resize", recalc_and_tick); + $(document.body).off("sticky_kit:recalc", recalc_and_tick); + elm.off("sticky_kit:detach", detach); + elm.removeData("sticky_kit"); + elm.css({ + position: "", + bottom: "", + top: "", + width: "" }); - } + parent.position("position", ""); + if (fixed) { + if (manual_spacer == null) { + if (el_float === "left" || el_float === "right") { + elm.insertAfter(spacer); + } + spacer.remove(); + } + return elm.removeClass(sticky_class); + } + }; + win.on("touchmove", tick); + win.on("scroll", tick); + win.on("resize", recalc_and_tick); + $(document.body).on("sticky_kit:recalc", recalc_and_tick); + elm.on("sticky_kit:detach", detach); + return setTimeout(tick, 0); }; - - // should be more efficient than using $window.scroll(scroller) and $window.resize(resizer): - if (window.addEventListener) { - window.addEventListener('scroll', scroller, false); - window.addEventListener('resize', resizer, false); - } else if (window.attachEvent) { - window.attachEvent('onscroll', scroller); - window.attachEvent('onresize', resizer); - } - - $.fn.sticky = function(method) { - if (methods[method]) { - return methods[method].apply(this, slice.call(arguments, 1)); - } else if (typeof method === 'object' || !method ) { - return methods.init.apply( this, arguments ); - } else { - $.error('Method ' + method + ' does not exist on jQuery.sticky'); + for (i = 0, len = this.length; i < len; i++) { + elm = this[i]; + fn($(elm)); } + return this; }; - $.fn.unstick = function(method) { - if (methods[method]) { - return methods[method].apply(this, slice.call(arguments, 1)); - } else if (typeof method === 'object' || !method ) { - return methods.unstick.apply( this, arguments ); - } else { - $.error('Method ' + method + ' does not exist on jQuery.sticky'); - } - }; - $(function() { - setTimeout(scroller, 0); - }); -})); +}).call(this); + </script> @@ -393,7 +368,6 @@ // Generate the table of contents in the side nav menu (see view/tpl/help.tpl) $(document).ready(function () { - $(".panel-collapse.in").find('a').each(function(){ window.console.log($(this).attr('href')); var url = document.createElement('a'); @@ -407,21 +381,14 @@ tocUl.removeClass(); // Classes are automatically added to <ul> elements by something else tocUl.toc({content: "#doco-content", headings: "h1"}); tocUl.addClass('toc-content sub-menu'); - tocUl.attr('id', 'doco-side-toc'); - if( $(window).width() > 768) { - tocUl.sticky({topSpacing:$('nav').outerHeight(true), zIndex: 1000}); - } + tocUl.attr('id', 'doco-side-toc'); + } }); - $( window ).resize(function() { - if($(window).width() < 768 ) { - $( "#doco-side-toc" ).unstick(); - } else { - $( "#doco-side-toc" ).sticky({topSpacing:$('nav').outerHeight(true), zIndex: 1000}); - } - }); - + $(".widget").stick_in_parent({ + offset_top: $('nav').outerHeight(true) + }); }); </script> diff --git a/view/tpl/help.tpl b/view/tpl/help.tpl index 1c5d05738..8eb53417a 100644 --- a/view/tpl/help.tpl +++ b/view/tpl/help.tpl @@ -16,16 +16,7 @@ // Generate the table of contents in the side nav menu (see view/tpl/help.tpl) $(document).ready(function () { - $('#doco-top-toc').toc({content: "#doco-content", headings: "h1,h2,h3,h4"}); - $('.navbar-header').append('<button id="doco-return-to-top-btn">'); //.find('button'); - var goTopBtn = $('#doco-return-to-top-btn'); - goTopBtn.append('<i>').find('i').addClass('fa fa-arrow-circle-up'); - //goTopBtn.attr('id', 'doco-return-to-top-btn'); - goTopBtn.attr('type', 'button'); - goTopBtn.attr('data-toggle', 'offcanvas'); - goTopBtn.addClass('navbar-toggle'); - goTopBtn.click(function() { $(window).scrollTop(0); }); }); function docoTocToggle() { |