diff --git a/doc/html-styles.qdocconf b/doc/html-styles.qdocconf index 67171ab0..16a46327 100644 --- a/doc/html-styles.qdocconf +++ b/doc/html-styles.qdocconf @@ -6,7 +6,7 @@ HTML.templatedir = . HTML.stylesheets = main.css -HTML.scripts = +HTML.scripts = main.js extraimages.HTML = images/logo.png \ images/favicon.ico \ @@ -15,6 +15,7 @@ extraimages.HTML = images/logo.png \ HTML.headerstyles = \ " \n" \ + " \n" \ " \n" \ " \n" \ " \n" \ diff --git a/doc/main.css b/doc/main.css index 377aeafe..76c4bc34 100644 --- a/doc/main.css +++ b/doc/main.css @@ -514,10 +514,10 @@ table { border-spacing: 0; margin-bottom: 5px; width: 100%; } - table td { - padding: 5px 20px; - line-height: 1.5; - border: 1px solid #d3d5d6; } +table td { + padding: 5px 20px; + line-height: 1.5; + border: 1px solid #d3d5d6; } div.table { overflow: auto; @@ -570,13 +570,13 @@ div.table { -ms-flex-align: center; -webkit-align-items: center; align-items: center; } - .guh-navbar-center:only-child { - -ms-flex-wrap: wrap; - -webkit-flex-wrap: wrap; - flex-wrap: wrap; - margin-left: auto; - margin-right: auto; - position: relative; } +.guh-navbar-center:only-child { + -ms-flex-wrap: wrap; + -webkit-flex-wrap: wrap; + flex-wrap: wrap; + margin-left: auto; + margin-right: auto; + position: relative; } .guh-navbar-nav { display: -ms-flexbox; @@ -585,34 +585,17 @@ div.table { margin: 0; padding: 0; list-style: none; } - .guh-navbar-nav li { - text-overflow: ellipsis; - /* Required for text-overflow to do anything */ - white-space: nowrap; - overflow: hidden; } - .guh-navbar-nav li:after { - content: ""; - display: inline-block; - width: 100%; } - .guh-navbar-nav > li > a { - color: #676767; - font-size: 1.3rem; - display: -ms-flexbox; - display: -webkit-flex; - display: flex; - -ms-flex-pack: center; - -webkit-justify-content: center; - justify-content: center; - -ms-flex-align: center; - -webkit-align-items: center; - align-items: center; - box-sizing: border-box; - min-height: 100px; - padding: 0 15px; - text-decoration: none; } - -div.header + li { - color: #408a83; +.guh-navbar-nav li { + text-overflow: ellipsis; + /* Required for text-overflow to do anything */ + white-space: nowrap; + overflow: hidden; } +.guh-navbar-nav li:after { + content: ""; + display: inline-block; + width: 100%; } +.guh-navbar-nav > li > a { + color: #676767; font-size: 1.3rem; display: -ms-flexbox; display: -webkit-flex; @@ -625,7 +608,26 @@ div.header + li { align-items: center; box-sizing: border-box; min-height: 100px; - padding: 35px; + padding: 0 15px; + text-decoration: none; } + +div.header + li { + color: #408a83; + font-size: 1.115rem; + line-height: 1.5; + width: 23.5%; + display: -ms-flexbox; + display: -webkit-flex; + display: flex; + -ms-flex-pack: center; + -webkit-justify-content: center; + justify-content: center; + -ms-flex-align: center; + -webkit-align-items: center; + align-items: center; + box-sizing: border-box; + min-height: 100px; + padding: 25px; text-decoration: none; z-index: 10; position: fixed; @@ -635,13 +637,13 @@ div.header + li { .guh-navbar-center-left, .guh-navbar-center-right { position: absolute; top: 0; } - .guh-navbar-center-left > *, .guh-navbar-center-right > * { - display: -ms-flexbox; - display: -webkit-flex; - display: flex; - -ms-flex-align: center; - -webkit-align-items: center; - align-items: center; } +.guh-navbar-center-left > *, .guh-navbar-center-right > * { + display: -ms-flexbox; + display: -webkit-flex; + display: flex; + -ms-flex-align: center; + -webkit-align-items: center; + align-items: center; } .guh-navbar-center-left { right: 100%; } @@ -658,91 +660,101 @@ div.header + li { padding: 10rem 3.3rem 10rem; width: 100%; position: relative; } - .content:before { - content: ''; - display: table; } - .content:after { - content: ''; - display: table; - clear: both; } - .content .sidebar { - position: fixed; - top: 100px; - left: 0; - bottom: 0; - background: white; - box-sizing: border-box; - width: 23.5% !important; - padding: 40px 40px 120px 40px; - border-right: 1px #d3d5d6 solid; - overflow: auto; } - .content .sidebar h3 { - text-align: center; - padding-bottom: 15px; - border-bottom: 1px #d3d5d6 solid; } - .content .sidebar h3 a { - color: #676767; } - .content .sidebar ul { - padding-left: 0; } - .content .context { - width: 70%; - margin: 0 auto; } - .content .context .small-subtitle:before { - content: ""; - display: inline-block; - position: relative; - top: calc(-0.1 * 1em); - vertical-align: middle; - height: .9em; - margin-right: 10px; - border-left: 5px solid rgba(211, 213, 214, 0.65); } - .content table { - vertical-align: initial; } - .content ul li { - line-height: 1.5; - position: relative; - padding-left: calc(1.5em + 10px); } - .content ul li::before { - content: ""; - position: absolute; - top: 0; - left: 0; - width: 1.5em; - height: 1.5em; - background-image: url('data:image/svg+xml;utf8,'); - background-repeat: no-repeat; - background-position: 50% 50%; - float: left; } - .content a { - text-decoration: none; - color: #57baae; - position: relative; } - .content a:hover { - color: #57baae; - text-decoration: none; } - .content a:before { - content: ""; - position: absolute; - width: 100%; - height: 1px; - bottom: 0; - left: 0; - background-color: #7cc09a; - visibility: hidden; - -webkit-transform: scaleX(0); - transform: scaleX(0); - -webkit-transition: all 0.3s ease-in-out 0s; - transition: all 0.3s ease-in-out 0s; } - .content a:hover:before { - visibility: visible; - -webkit-transform: scaleX(1); - transform: scaleX(1); } +.content:before { + content: ''; + display: table; } +.content:after { + content: ''; + display: table; + clear: both; } +.content .sidebar { + position: fixed; + top: 100px; + left: 0; + bottom: 0; + background: white; + box-sizing: border-box; + width: 23.5% !important; + padding: 40px 40px 160px 40px; + border-right: 1px #d3d5d6 solid; + overflow: auto; } +.content .sidebar h3 { + text-align: center; + padding-bottom: 15px; + border-bottom: 1px #d3d5d6 solid; } +.content .sidebar h3 a { + color: #676767; } +.content .sidebar ul { + padding-left: 0; } +.content .sidebar .level2 { + font-size: 1rem; + margin-left: 1rem; + line-height: 1.5; } +.content .sidebar .level2:before { + content: "-"; + background-image: none; + text-align: right; } +.content .context { + width: 70%; + margin: 0 auto; + overflow: hidden; } +.content .context .small-subtitle:before { + content: ""; + display: inline-block; + position: relative; + top: calc(-0.1 * 1em); + vertical-align: middle; + height: .9em; + margin-right: 10px; + border-left: 5px solid rgba(211, 213, 214, 0.65); } +.content table { + vertical-align: initial; } +.content ul li { + line-height: 1.5; + position: relative; + padding-left: calc(1.5em + 10px); } +.content ul li::before { + content: ""; + position: absolute; + top: 0; + left: 0; + width: 1.5em; + height: 1.5em; + background-image: url('data:image/svg+xml;utf8,'); + background-repeat: no-repeat; + background-position: 50% 50%; + float: left; } +.content a { + text-decoration: none; + color: #57baae; + position: relative; } +.content a:hover { + color: #57baae; + text-decoration: none; } +.content a:before { + content: ""; + position: absolute; + width: 100%; + height: 1px; + bottom: 0; + left: 0; + background-color: #7cc09a; + visibility: hidden; + -webkit-transform: scaleX(0); + transform: scaleX(0); + -webkit-transition: all 0.3s ease-in-out 0s; + transition: all 0.3s ease-in-out 0s; } +.content a:hover:before { + visibility: visible; + -webkit-transform: scaleX(1); + transform: scaleX(1); } .centerAlign { text-align: center; } pre { border: 1px solid #676767; + resize: both; background: #3a4055; -moz-border-radius: 0.7em 0.7em 0.7em 0.7em; -webkit-border-radius: 0.7em 0.7em 0.7em 0.7em; @@ -751,44 +763,49 @@ pre { padding: 1em 1em 1em 1em; overflow-x: auto; color: #d3d5d6; } - pre .operator { - color: white; } - pre .type { - color: #4f9d08; } - pre .keyword { - color: #ffff55; } +pre .operator { + color: white; } +pre .type { + color: #4f9d08; } +pre .keyword { + color: #ffff55; } +pre .string { + color: #aaaaaa; } +pre .number { + color: #ff55ff; } span.type { color: #408a83; } h2, h3.fn { position: relative; } - h2:after, h3.fn:after { - position: absolute; - content: ''; - height: 1px; - bottom: -10px; - margin: 0 auto 0 0; - left: 0; - right: 0; - width: 20%; - background: #d3d5d6; } +h2:after, h3.fn:after { + position: absolute; + content: ''; + height: 1px; + bottom: -10px; + margin: 0 auto 0 0; + left: 0; + right: 0; + width: 20%; + background: #d3d5d6; } div.footer { position: absolute; + border-top: 1px solid #dbdbdb; bottom: 0; left: 0; width: 100%; z-index: 5; text-align: center; background: #efefef; - padding: 60px; } - div.footer p { - padding: 0; - margin: 0; } + padding: 60px 0; } +div.footer acronym[title] { + text-decoration: none; } +div.footer p { + padding: 0; + margin: 0; } @media screen and (max-width: 1440px) { .content .context { - width: 50%; } } - -/*# sourceMappingURL=main.css.map */ + width: 50%; } } \ No newline at end of file diff --git a/doc/main.js b/doc/main.js new file mode 100644 index 00000000..e5668ba5 --- /dev/null +++ b/doc/main.js @@ -0,0 +1,262 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * * + * Copyright (C) 2017 Georgi Yatsev * + * * + * Permission is hereby granted, free of charge, to any person obtaining a copy * + * of this software and associated documentation files (the "Software"), to deal * + * in the Software without restriction, including without limitation the rights * + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included in all * + * copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * + * SOFTWARE. * + * * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +(function (root, factory) { + if (typeof define === "function" && define.amd) { + define([], factory()) + } else if (typeof module === "object" && module.exports) { + module.exports = factory() + } else { + (function install() { + if (document && document.body) { + root.zenscroll = factory() + } else { + setTimeout(install, 9) + } + })() + } +}(this, function () { + "use strict" + + + var isNativeSmoothScrollEnabledOn = function (elem) { + return ("getComputedStyle" in window) && + window.getComputedStyle(elem)["scroll-behavior"] === "smooth" + } + + + if (typeof window === "undefined" || !("document" in window)) { + return {} + } + + + var makeScroller = function (container, defaultDuration, edgeOffset) { + + defaultDuration = defaultDuration || 999 //ms + if (!edgeOffset && edgeOffset !== 0) { + edgeOffset = 9 //px + } + + var scrollTimeoutId + var setScrollTimeoutId = function (newValue) { + scrollTimeoutId = newValue + } + + + var stopScroll = function () { + clearTimeout(scrollTimeoutId) + setScrollTimeoutId(0) + } + + var getTopWithEdgeOffset = function (elem) { + return Math.max(0, container.getTopOf(elem) - edgeOffset) + } + + var scrollToY = function (targetY, duration, onDone) { + stopScroll() + if (duration === 0 || (duration && duration < 0) || isNativeSmoothScrollEnabledOn(container.body)) { + container.toY(targetY) + if (onDone) { + onDone() + } + } else { + var startY = container.getY() + var distance = Math.max(0, targetY) - startY + var startTime = new Date().getTime() + duration = duration || Math.min(Math.abs(distance), defaultDuration); + (function loopScroll() { + setScrollTimeoutId(setTimeout(function () { + // Calculate percentage: + var p = Math.min(1, (new Date().getTime() - startTime) / duration) + // Calculate the absolute vertical position: + var y = Math.max(0, Math.floor(startY + distance*(p < 0.5 ? 2*p*p : p*(4 - p*2)-1))) + container.toY(y) + if (p < 1 && (container.getHeight() + y) < container.body.scrollHeight) { + loopScroll() + } else { + setTimeout(stopScroll, 99) // with cooldown time + if (onDone) { + onDone() + } + } + }, 9)) + })() + } + } + + var scrollToElem = function (elem, duration, onDone) { + scrollToY(getTopWithEdgeOffset(elem), duration, onDone) + } + + var scrollIntoView = function (elem, duration, onDone) { + var elemHeight = elem.getBoundingClientRect().height + var elemBottom = container.getTopOf(elem) + elemHeight + var containerHeight = container.getHeight() + var y = container.getY() + var containerBottom = y + containerHeight + if (getTopWithEdgeOffset(elem) < y || (elemHeight + edgeOffset) > containerHeight) { + // Element is clipped at top or is higher than screen. + scrollToElem(elem, duration, onDone) + } else if ((elemBottom + edgeOffset) > containerBottom) { + // Element is clipped at the bottom. + scrollToY(elemBottom - containerHeight + edgeOffset, duration, onDone) + } else if (onDone) { + onDone() + } + } + + var scrollToCenterOf = function (elem, duration, offset, onDone) { + scrollToY(Math.max(0, container.getTopOf(elem) - container.getHeight()/2 + (offset || elem.getBoundingClientRect().height/2)), duration, onDone) + } + + var setup = function (newDefaultDuration, newEdgeOffset) { + if (newDefaultDuration === 0 || newDefaultDuration) { + defaultDuration = newDefaultDuration + } + if (newEdgeOffset === 0 || newEdgeOffset) { + edgeOffset = newEdgeOffset + } + return { + defaultDuration: defaultDuration, + edgeOffset: edgeOffset + } + } + + return { + setup: setup, + to: scrollToElem, + toY: scrollToY, + intoView: scrollIntoView, + center: scrollToCenterOf, + stop: stopScroll, + moving: function () { return !!scrollTimeoutId }, + getY: container.getY, + getTopOf: container.getTopOf + } + + } + + + var docElem = document.documentElement + var getDocY = function () { return window.scrollY || docElem.scrollTop } + + var zenscroll = makeScroller({ + body: document.scrollingElement || document.body, + toY: function (y) { window.scrollTo(0, y) }, + getY: getDocY, + getHeight: function () { return window.innerHeight || docElem.clientHeight }, + getTopOf: function (elem) { return elem.getBoundingClientRect().top + getDocY() - docElem.offsetTop } + }) + + zenscroll.createScroller = function (scrollContainer, defaultDuration, edgeOffset) { + return makeScroller({ + body: scrollContainer, + toY: function (y) { scrollContainer.scrollTop = y }, + getY: function () { return scrollContainer.scrollTop }, + getHeight: function () { return Math.min(scrollContainer.clientHeight, window.innerHeight || docElem.clientHeight) }, + getTopOf: function (elem) { return elem.offsetTop } + }, defaultDuration, edgeOffset) + } + + if ("addEventListener" in window && !window.noZensmooth && !isNativeSmoothScrollEnabledOn(document.body)) { + + + var isScrollRestorationSupported = "scrollRestoration" in history + + if (isScrollRestorationSupported) { + history.scrollRestoration = "auto" + } + + window.addEventListener("load", function () { + + if (isScrollRestorationSupported) { + setTimeout(function () { history.scrollRestoration = "manual" }, 9) + window.addEventListener("popstate", function (event) { + if (event.state && "zenscrollY" in event.state) { + zenscroll.toY(event.state.zenscrollY) + } + }, false) + } + + if (window.location.hash) { + setTimeout(function () { + var edgeOffset = zenscroll.setup().edgeOffset + if (edgeOffset) { + var targetElem = document.getElementById(window.location.href.split("#")[1]) + if (targetElem) { + var targetY = Math.max(0, zenscroll.getTopOf(targetElem) - edgeOffset) + var diff = zenscroll.getY() - targetY + if (0 <= diff && diff < 9 ) { + window.scrollTo(0, targetY) + } + } + } + }, 9) + } + + }, false) + + var RE_noZensmooth = new RegExp("(^|\\s)noZensmooth(\\s|$)") + window.addEventListener("click", function (event) { + var anchor = event.target + while (anchor && anchor.tagName !== "A") { + anchor = anchor.parentNode + } + if (!anchor || event.which !== 1 || event.shiftKey || event.metaKey || event.ctrlKey || event.altKey) { + return + } + if (isScrollRestorationSupported) { + try { + history.replaceState({ zenscrollY: zenscroll.getY() }, "") + } catch (e) { + } + } + var href = anchor.getAttribute("href") || "" + if (href.indexOf("#") === 0 && !RE_noZensmooth.test(anchor.className)) { + var targetY = 0 + var targetElem = document.getElementById(href.substring(1)) + if (href !== "#") { + if (!targetElem) { + return + } + targetY = zenscroll.getTopOf(targetElem) + } + event.preventDefault() + var onDone = function () { window.location = href } + var edgeOffset = zenscroll.setup().edgeOffset + if (edgeOffset) { + targetY = Math.max(0, targetY - edgeOffset) + onDone = function () { history.pushState(null, "", href) } + } + zenscroll.toY(targetY, null, onDone) + } + }, false) + + } + + + return zenscroll + + +})); \ No newline at end of file