diff options
-rw-r--r-- | layouts/partials/footer.html | 1 | ||||
-rw-r--r-- | layouts/partials/google_analytics.html | 16 | ||||
-rw-r--r-- | layouts/partials/head.html | 7 | ||||
-rw-r--r-- | layouts/partials/prev_next_post.html | 2 | ||||
-rw-r--r-- | layouts/partials/sidemenu.html | 2 | ||||
-rw-r--r-- | layouts/partials/social.html | 5 | ||||
-rw-r--r-- | static/css/blackburn.css | 12 | ||||
-rw-r--r-- | static/js/menus.js | 172 |
8 files changed, 203 insertions, 14 deletions
diff --git a/layouts/partials/footer.html b/layouts/partials/footer.html index 64f11f3..0ce4001 100644 --- a/layouts/partials/footer.html +++ b/layouts/partials/footer.html @@ -1,6 +1,7 @@ </div> </div> <script src="{{ .Site.BaseURL }}js/ui.js"></script> +<script src="{{ .Site.BaseURL }}js/menus.js"></script> {{ partial "google_analytics.html" . }} {{ partial "piwik_analytics.html" . }} diff --git a/layouts/partials/google_analytics.html b/layouts/partials/google_analytics.html index 1548a33..e3b83a9 100644 --- a/layouts/partials/google_analytics.html +++ b/layouts/partials/google_analytics.html @@ -1,12 +1,14 @@ {{ with .Site.Params.googleAnalytics }} <script> - (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ - (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), - m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) - })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); - - ga('create', '{{ . }}', 'auto'); - ga('send', 'pageview'); + // Never report traffic that originates from local testing. + if (window.location.hostname != "localhost") { + (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ + (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), + m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) + })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); + ga('create', '{{ . }}', 'auto'); + ga('send', 'pageview'); + } </script> {{ end }} diff --git a/layouts/partials/head.html b/layouts/partials/head.html index f31a14b..9e1e4ce 100644 --- a/layouts/partials/head.html +++ b/layouts/partials/head.html @@ -2,7 +2,7 @@ <meta http-equiv="content-type" content="text/html; charset=utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="description" content="{{ if .IsNode }}{{ with .Site.Params.description }}{{ . }}{{ end }}{{ else }}{{ with .Description }}{{ . }}{{ end }}{{ end }}"> - {{.Hugo.Generator}} + {{hugo.Generator}} <title>{{ if .IsHome }}{{ .Title }}{{ else }}{{ .Title }} · {{ .Site.Title }}{{ end }}</title> @@ -36,8 +36,9 @@ <script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> <!-- RSS --> - {{ if .RSSLink }} - <link rel="alternate" type="application/rss+xml" title="{{ .Site.Title }}" href="{{ .RSSLink }}" /> + {{ if .OutputFormats.Get "RSS" }} + <link rel="alternate" type="application/rss+xml" title="{{ .Site.Title }}" + href='{{ with .OutputFormats.Get "RSS" }}{{ .RelPermalink }}{{ end }}' /> {{ end }} {{ with .Site.Params.highlightjs }} diff --git a/layouts/partials/prev_next_post.html b/layouts/partials/prev_next_post.html index fb61c00..e82380b 100644 --- a/layouts/partials/prev_next_post.html +++ b/layouts/partials/prev_next_post.html @@ -1,4 +1,4 @@ -{{ if or (.Prev) (.Next) }} +{{ if or (.NextPage) (.PrevPage) }} <div class="prev-next-post pure-g"> <div class="pure-u-1-24" style="text-align: left;"> {{ if .PrevInSection }} diff --git a/layouts/partials/sidemenu.html b/layouts/partials/sidemenu.html index 87fa03c..4ed0801 100644 --- a/layouts/partials/sidemenu.html +++ b/layouts/partials/sidemenu.html @@ -16,7 +16,7 @@ <ul class="pure-menu-children"> {{ range .Children }} <li class="pure-menu-item"> - <a href="{{ .URL }}">{{ .Name }}</a> + <a class="pure-menu-link" href="{{ .URL }}">{{ .Name }}</a> </li> {{ end }} </ul> diff --git a/layouts/partials/social.html b/layouts/partials/social.html index 33e438d..e57bcba 100644 --- a/layouts/partials/social.html +++ b/layouts/partials/social.html @@ -1,9 +1,10 @@ <div class="pure-menu social"> <ul class="pure-menu-list"> - {{ if .RSSLink }} + {{ if .OutputFormats.Get "RSS" }} <li class="pure-menu-item"> - <a class="pure-menu-link" href="{{ .RSSLink }}"><i class="fa fa-rss fa-fw"></i>RSS</a> + <a class="pure-menu-link" href='{{ with .OutputFormats.Get "RSS" }}{{ .RelPermalink }}{{ end }}'><i + class="fa fa-rss fa-fw"></i>RSS</a> </li> {{ end }} diff --git a/static/css/blackburn.css b/static/css/blackburn.css index c591985..0ddd380 100644 --- a/static/css/blackburn.css +++ b/static/css/blackburn.css @@ -47,6 +47,14 @@ article > footer { overflow: hidden; } +#menu { + overflow-y: visible; +} + +#menu a { + padding: 0.6em; +} + #menu .brand { font-family: Raleway; font-weight: bold; @@ -62,6 +70,10 @@ article > footer { font-size: 0.9em; } +#menu .pure-menu ul.pure-menu-children { + border-top: none; +} + i { display: inline-block; margin-right: 0.2em; diff --git a/static/js/menus.js b/static/js/menus.js new file mode 100644 index 0000000..3172361 --- /dev/null +++ b/static/js/menus.js @@ -0,0 +1,172 @@ +(function (window, document) { + 'use strict'; + + // Enable drop-down menus in Pure + // Inspired by YUI3 gallery-simple-menu by Julien LeComte + // [https://github.com/yui/yui3-gallery/blob/master/src/gallery-simple-menu/js/simple-menu.js] + + function PureDropdown(dropdownParent) { + + var PREFIX = 'pure-', + ACTIVE_CLASS_NAME = PREFIX + 'menu-active', + ARIA_ROLE = 'role', + ARIA_HIDDEN = 'aria-hidden', + MENU_OPEN = 0, + MENU_CLOSED = 1, + MENU_PARENT_CLASS_NAME = 'pure-menu-has-children', + MENU_ACTIVE_SELECTOR = '.pure-menu-active', + MENU_LINK_SELECTOR = '.pure-menu-link', + MENU_SELECTOR = '.pure-menu-children', + DISMISS_EVENT = (window.hasOwnProperty && + window.hasOwnProperty('ontouchstart')) ? + 'touchstart' : 'mousedown', + + ARROW_KEYS_ENABLED = true, + + ddm = this; // drop down menu + + this._state = MENU_CLOSED; + + this.show = function () { + if (this._state !== MENU_OPEN) { + this._dropdownParent.classList.add(ACTIVE_CLASS_NAME); + this._menu.setAttribute(ARIA_HIDDEN, false); + this._state = MENU_OPEN; + } + }; + + this.hide = function () { + if (this._state !== MENU_CLOSED) { + this._dropdownParent.classList.remove(ACTIVE_CLASS_NAME); + this._menu.setAttribute(ARIA_HIDDEN, true); + this._link.focus(); + this._state = MENU_CLOSED; + } + }; + + this.toggle = function () { + this[this._state === MENU_CLOSED ? 'show' : 'hide'](); + }; + + this.halt = function (e) { + e.stopPropagation(); + e.preventDefault(); + }; + + this._dropdownParent = dropdownParent; + this._link = this._dropdownParent.querySelector(MENU_LINK_SELECTOR); + this._menu = this._dropdownParent.querySelector(MENU_SELECTOR); + this._firstMenuLink = this._menu.querySelector(MENU_LINK_SELECTOR); + + // Set ARIA attributes + this._link.setAttribute('aria-haspopup', 'true'); + this._menu.setAttribute(ARIA_ROLE, 'menu'); + this._menu.setAttribute('aria-labelledby', this._link.getAttribute('id')); + this._menu.setAttribute('aria-hidden', 'true'); + [].forEach.call( + this._menu.querySelectorAll('li'), + function(el){ + el.setAttribute(ARIA_ROLE, 'presentation'); + } + ); + [].forEach.call( + this._menu.querySelectorAll('a'), + function(el){ + el.setAttribute(ARIA_ROLE, 'menuitem'); + } + ); + + // Toggle on click + this._link.addEventListener('click', function (e) { + e.stopPropagation(); + e.preventDefault(); + ddm.toggle(); + }); + + // Keyboard navigation + document.addEventListener('keydown', function (e) { + var currentLink, + previousSibling, + nextSibling, + previousLink, + nextLink; + + // if the menu isn't active, ignore + if (ddm._state !== MENU_OPEN) { + return; + } + + // if the menu is the parent of an open, active submenu, ignore + if (ddm._menu.querySelector(MENU_ACTIVE_SELECTOR)) { + return; + } + + currentLink = ddm._menu.querySelector(':focus'); + + // Dismiss an open menu on ESC + if (e.keyCode === 27) { + /* Esc */ + ddm.halt(e); + ddm.hide(); + } + // Go to the next link on down arrow + else if (ARROW_KEYS_ENABLED && e.keyCode === 40) { + /* Down arrow */ + ddm.halt(e); + // get the nextSibling (an LI) of the current link's LI + nextSibling = (currentLink) ? currentLink.parentNode.nextSibling : null; + // if the nextSibling is a text node (not an element), go to the next one + while (nextSibling && nextSibling.nodeType !== 1) { + nextSibling = nextSibling.nextSibling; + } + nextLink = (nextSibling) ? nextSibling.querySelector('.pure-menu-link') : null; + // if there is no currently focused link, focus the first one + if (!currentLink) { + ddm._menu.querySelector('.pure-menu-link').focus(); + } + else if (nextLink) { + nextLink.focus(); + } + } + // Go to the previous link on up arrow + else if (ARROW_KEYS_ENABLED && e.keyCode === 38) { + /* Up arrow */ + ddm.halt(e); + // get the currently focused link + previousSibling = (currentLink) ? currentLink.parentNode.previousSibling : null; + while (previousSibling && previousSibling.nodeType !== 1) { + previousSibling = previousSibling.previousSibling; + } + previousLink = (previousSibling) ? previousSibling.querySelector('.pure-menu-link') : null; + // if there is no currently focused link, focus the last link + if (!currentLink) { + ddm._menu.querySelector('.pure-menu-item:last-child .pure-menu-link').focus(); + } + // else if there is a previous item, go to the previous item + else if (previousLink) { + previousLink.focus(); + } + } + }); + + // Dismiss an open menu on outside event + document.addEventListener(DISMISS_EVENT, function (e) { + var target = e.target; + if (target !== ddm._link && !ddm._menu.contains(target)) { + ddm.hide(); + ddm._link.blur(); + } + }); + + } + + function initDropdowns() { + var dropdownParents = document.querySelectorAll('.pure-menu-has-children'); + for (var i = 0; i < dropdownParents.length; i++) { + var ddm = new PureDropdown(dropdownParents[i]); + } + } + + initDropdowns(); + +}(this, this.document));
\ No newline at end of file |