Skip to content

Commit

Permalink
Allow navigation using left and right arrow keys
Browse files Browse the repository at this point in the history
  • Loading branch information
SamLau95 committed Aug 11, 2018
1 parent b305e6a commit 60838bd
Show file tree
Hide file tree
Showing 4 changed files with 102 additions and 81 deletions.
80 changes: 2 additions & 78 deletions _includes/head.html
Original file line number Diff line number Diff line change
Expand Up @@ -56,83 +56,7 @@
<!-- Include Turbolinks to make page loads fast -->
<!-- https://github.com/turbolinks/turbolinks -->
<script src="{{ site.js_url }}/turbolinks.js"></script>
<script>
// Run MathJax when Turbolinks navigates to a page
document.addEventListener("turbolinks:load", () => {
if (window.MathJax)
MathJax.Hub.Queue(["Typeset", MathJax.Hub]);
})

const togglerId = 'js-sidebar-toggle';
const textbookId = 'js-textbook';
const togglerActiveClass = 'is-active';
const textbookActiveClass = 'js-show-sidebar';

const getToggler = () => document.getElementById(togglerId);
const getTextbook = () => document.getElementById(textbookId);

/**
* Toggles sidebar and menu icon
*/
const toggleSidebar = () => {
const toggler = getToggler();
const textbook = getTextbook();

if (textbook.classList.contains(textbookActiveClass)) {
textbook.classList.remove(textbookActiveClass);
toggler.classList.remove(togglerActiveClass);
} else {
textbook.classList.add(textbookActiveClass);
toggler.classList.add(togglerActiveClass);
}
}

/**
* Auto-close sidebar on smaller screens after page load.
*
* Having the sidebar be open by default then closing it on page load for
* small screens gives the illusion that the sidebar closes in response
* to selecting a page in the sidebar. However, it does cause a bit of jank
* on the first page load.
*
* Since we don't want to persist state in between page navigation, this is
* the best we can do while optimizing for larger screens where most
* viewers will read the textbook.
*
* Keep the variable below in sync with the tablet breakpoint value in
* _sass/inuitcss/tools/_tools.mq.scss
*
*/
const autoCloseSidebarBreakpoint = 740;

// Set up event listener for sidebar toggle button
document.addEventListener("turbolinks:load", () => {
getToggler().addEventListener('click', toggleSidebar);

// This assumes that the sidebar is open by default
if (window.innerWidth < autoCloseSidebarBreakpoint)
toggleSidebar()
})

/**
* Preserve sidebar scroll when navigating between pages
*/
let sidebarScrollTop = 0;
const getSidebar = () => document.getElementById('js-sidebar');

document.addEventListener("turbolinks:before-visit", () => {
sidebarScrollTop = getSidebar().scrollTop;
})

document.addEventListener("turbolinks:load", () => {
getSidebar().scrollTop = sidebarScrollTop;
})

/**
* Focus textbook page by default so that user can scroll with spacebar
*/
document.addEventListener("turbolinks:load", () => {
document.querySelector('.c-textbook__page').focus();
})
</script>
<!-- Load custom website scripts -->
<script src="{{ site.js_url }}/scripts.js"></script>
</head>
4 changes: 2 additions & 2 deletions _includes/page-nav.html
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
<nav class="c-page__nav">
{% if page.prev_page %}
<a class="c-page__nav__prev" href="{{ page.prev_page }}">
<a id="js-page__nav__prev" class="c-page__nav__prev" href="{{ page.prev_page }}">
<span class="u-margin-right-tiny"></span> Previous
</a>
{% endif %}

{% if page.next_page %}
<a class="c-page__nav__next" href="{{ page.next_page }}">
<a id="js-page__nav__next" class="c-page__nav__next" href="{{ page.next_page }}">
Next <span class="u-margin-right-tiny"></span>
</a>
{% endif %}
Expand Down
2 changes: 1 addition & 1 deletion _includes/sidebar.html
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@
<a class="c-sidebar__entry {{ active_class }}"
href="{{ section.url }}"
>
{% unless section.not_numbered %}
{% unless chapter.not_numbered or section.not_numbered %}
{{ chapter_num }}.{{ section_num }}
{% assign section_num = section_num | plus: 1 %}
{% endunless %}
Expand Down
97 changes: 97 additions & 0 deletions assets/js/scripts.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
/**
* Site-wide JS
*/

// Run MathJax when Turbolinks navigates to a page
document.addEventListener('turbolinks:load', () => {
if (window.MathJax) MathJax.Hub.Queue(['Typeset', MathJax.Hub])
})

const togglerId = 'js-sidebar-toggle'
const textbookId = 'js-textbook'
const togglerActiveClass = 'is-active'
const textbookActiveClass = 'js-show-sidebar'

const getToggler = () => document.getElementById(togglerId)
const getTextbook = () => document.getElementById(textbookId)

/**
* Toggles sidebar and menu icon
*/
const toggleSidebar = () => {
const toggler = getToggler()
const textbook = getTextbook()

if (textbook.classList.contains(textbookActiveClass)) {
textbook.classList.remove(textbookActiveClass)
toggler.classList.remove(togglerActiveClass)
} else {
textbook.classList.add(textbookActiveClass)
toggler.classList.add(togglerActiveClass)
}
}

/**
* Auto-close sidebar on smaller screens after page load.
*
* Having the sidebar be open by default then closing it on page load for
* small screens gives the illusion that the sidebar closes in response
* to selecting a page in the sidebar. However, it does cause a bit of jank
* on the first page load.
*
* Since we don't want to persist state in between page navigation, this is
* the best we can do while optimizing for larger screens where most
* viewers will read the textbook.
*
* Keep the variable below in sync with the tablet breakpoint value in
* _sass/inuitcss/tools/_tools.mq.scss
*
*/
const autoCloseSidebarBreakpoint = 740

// Set up event listener for sidebar toggle button
document.addEventListener('turbolinks:load', () => {
getToggler().addEventListener('click', toggleSidebar)

// This assumes that the sidebar is open by default
if (window.innerWidth < autoCloseSidebarBreakpoint) toggleSidebar()
})

/**
* Preserve sidebar scroll when navigating between pages
*/
let sidebarScrollTop = 0
const getSidebar = () => document.getElementById('js-sidebar')

document.addEventListener('turbolinks:before-visit', () => {
sidebarScrollTop = getSidebar().scrollTop
})

document.addEventListener('turbolinks:load', () => {
getSidebar().scrollTop = sidebarScrollTop
})

/**
* Focus textbook page by default so that user can scroll with spacebar
*/
document.addEventListener('turbolinks:load', () => {
document.querySelector('.c-textbook__page').focus()
})

/**
* Use left and right arrow keys to navigate forward and backwards.
*/
const LEFT_ARROW_KEYCODE = 37
const RIGHT_ARROW_KEYCODE = 39

const getPrevUrl = () => document.getElementById('js-page__nav__prev').href
const getNextUrl = () => document.getElementById('js-page__nav__next').href
document.addEventListener('keydown', event => {
const keycode = event.which

if (keycode === LEFT_ARROW_KEYCODE) {
Turbolinks.visit(getPrevUrl())
} else if (keycode === RIGHT_ARROW_KEYCODE) {
Turbolinks.visit(getNextUrl())
}
})

0 comments on commit 60838bd

Please sign in to comment.