Initial port
[editorial.git] / assets / main / js / main.js
index fe372ee18743778425e159437497bbd45bb8f45c..494b9ccd04799e1c5ca76af383a419fb9aaf6ebc 100644 (file)
@@ -1,5 +1,5 @@
 /*\r
-       Massively by HTML5 UP\r
+       Editorial by HTML5 UP\r
        html5up.net | @ajlkn\r
        Free for personal and commercial use under the CCA 3.0 license (html5up.net/license)\r
 */\r
 (function($) {\r
 \r
        var     $window = $(window),\r
-               $body = $('body'),\r
-               $wrapper = $('#wrapper'),\r
-               $header = $('#header'),\r
-               $nav = $('#nav'),\r
-               $main = $('#main'),\r
-               $navPanelToggle, $navPanel, $navPanelInner;\r
+               $head = $('head'),\r
+               $body = $('body');\r
 \r
        // Breakpoints.\r
                breakpoints({\r
-                       default:   ['1681px',   null       ],\r
-                       xlarge:    ['1281px',   '1680px'   ],\r
-                       large:     ['981px',    '1280px'   ],\r
-                       medium:    ['737px',    '980px'    ],\r
-                       small:     ['481px',    '736px'    ],\r
-                       xsmall:    ['361px',    '480px'    ],\r
-                       xxsmall:   [null,       '360px'    ]\r
+                       xlarge:   [ '1281px',  '1680px' ],\r
+                       large:    [ '981px',   '1280px' ],\r
+                       medium:   [ '737px',   '980px'  ],\r
+                       small:    [ '481px',   '736px'  ],\r
+                       xsmall:   [ '361px',   '480px'  ],\r
+                       xxsmall:  [ null,      '360px'  ],\r
+                       'xlarge-to-max':    '(min-width: 1681px)',\r
+                       'small-to-xlarge':  '(min-width: 481px) and (max-width: 1680px)'\r
                });\r
 \r
-       /**\r
-        * Applies parallax scrolling to an element's background image.\r
-        * @return {jQuery} jQuery object.\r
-        */\r
-       $.fn._parallax = function(intensity) {\r
+       // Stops animations/transitions until the page has ...\r
 \r
-               var     $window = $(window),\r
-                       $this = $(this);\r
+               // ... loaded.\r
+                       $window.on('load', function() {\r
+                               window.setTimeout(function() {\r
+                                       $body.removeClass('is-preload');\r
+                               }, 100);\r
+                       });\r
 \r
-               if (this.length == 0 || intensity === 0)\r
-                       return $this;\r
+               // ... stopped resizing.\r
+                       var resizeTimeout;\r
 \r
-               if (this.length > 1) {\r
+                       $window.on('resize', function() {\r
 \r
-                       for (var i=0; i < this.length; i++)\r
-                               $(this[i])._parallax(intensity);\r
+                               // Mark as resizing.\r
+                                       $body.addClass('is-resizing');\r
 \r
-                       return $this;\r
+                               // Unmark after delay.\r
+                                       clearTimeout(resizeTimeout);\r
 \r
-               }\r
+                                       resizeTimeout = setTimeout(function() {\r
+                                               $body.removeClass('is-resizing');\r
+                                       }, 100);\r
 \r
-               if (!intensity)\r
-                       intensity = 0.25;\r
+                       });\r
 \r
-               $this.each(function() {\r
+       // Fixes.\r
 \r
-                       var $t = $(this),\r
-                               $bg = $('<div class="bg"></div>').appendTo($t),\r
-                               on, off;\r
+               // Object fit images.\r
+                       if (!browser.canUse('object-fit')\r
+                       ||      browser.name == 'safari')\r
+                               $('.image.object').each(function() {\r
 \r
-                       on = function() {\r
+                                       var $this = $(this),\r
+                                               $img = $this.children('img');\r
 \r
-                               $bg\r
-                                       .removeClass('fixed')\r
-                                       .css('transform', 'matrix(1,0,0,1,0,0)');\r
+                                       // Hide original image.\r
+                                               $img.css('opacity', '0');\r
 \r
-                               $window\r
-                                       .on('scroll._parallax', function() {\r
+                                       // Set background.\r
+                                               $this\r
+                                                       .css('background-image', 'url("' + $img.attr('src') + '")')\r
+                                                       .css('background-size', $img.css('object-fit') ? $img.css('object-fit') : 'cover')\r
+                                                       .css('background-position', $img.css('object-position') ? $img.css('object-position') : 'center');\r
 \r
-                                               var pos = parseInt($window.scrollTop()) - parseInt($t.position().top);\r
+                               });\r
 \r
-                                               $bg.css('transform', 'matrix(1,0,0,1,0,' + (pos * intensity) + ')');\r
+       // Sidebar.\r
+               var $sidebar = $('#sidebar'),\r
+                       $sidebar_inner = $sidebar.children('.inner');\r
 \r
-                                       });\r
+               // Inactive by default on <= large.\r
+                       breakpoints.on('<=large', function() {\r
+                               $sidebar.addClass('inactive');\r
+                       });\r
 \r
-                       };\r
+                       breakpoints.on('>large', function() {\r
+                               $sidebar.removeClass('inactive');\r
+                       });\r
 \r
-                       off = function() {\r
+               // Hack: Workaround for Chrome/Android scrollbar position bug.\r
+                       if (browser.os == 'android'\r
+                       &&      browser.name == 'chrome')\r
+                               $('<style>#sidebar .inner::-webkit-scrollbar { display: none; }</style>')\r
+                                       .appendTo($head);\r
 \r
-                               $bg\r
-                                       .addClass('fixed')\r
-                                       .css('transform', 'none');\r
+               // Toggle.\r
+                       $('<a href="#sidebar" class="toggle">Toggle</a>')\r
+                               .appendTo($sidebar)\r
+                               .on('click', function(event) {\r
 \r
-                               $window\r
-                                       .off('scroll._parallax');\r
+                                       // Prevent default.\r
+                                               event.preventDefault();\r
+                                               event.stopPropagation();\r
 \r
-                       };\r
+                                       // Toggle.\r
+                                               $sidebar.toggleClass('inactive');\r
 \r
-                       // Disable parallax on ..\r
-                               if (browser.name == 'ie'                        // IE\r
-                               ||      browser.name == 'edge'                  // Edge\r
-                               ||      window.devicePixelRatio > 1             // Retina/HiDPI (= poor performance)\r
-                               ||      browser.mobile)                                 // Mobile devices\r
-                                       off();\r
+                               });\r
 \r
-                       // Enable everywhere else.\r
-                               else {\r
+               // Events.\r
 \r
-                                       breakpoints.on('>large', on);\r
-                                       breakpoints.on('<=large', off);\r
+                       // Link clicks.\r
+                               $sidebar.on('click', 'a', function(event) {\r
 \r
-                               }\r
+                                       // >large? Bail.\r
+                                               if (breakpoints.active('>large'))\r
+                                                       return;\r
 \r
-               });\r
+                                       // Vars.\r
+                                               var $a = $(this),\r
+                                                       href = $a.attr('href'),\r
+                                                       target = $a.attr('target');\r
 \r
-               $window\r
-                       .off('load._parallax resize._parallax')\r
-                       .on('load._parallax resize._parallax', function() {\r
-                               $window.trigger('scroll');\r
-                       });\r
+                                       // Prevent default.\r
+                                               event.preventDefault();\r
+                                               event.stopPropagation();\r
 \r
-               return $(this);\r
+                                       // Check URL.\r
+                                               if (!href || href == '#' || href == '')\r
+                                                       return;\r
 \r
-       };\r
+                                       // Hide sidebar.\r
+                                               $sidebar.addClass('inactive');\r
 \r
-       // Play initial animations on page load.\r
-               $window.on('load', function() {\r
-                       window.setTimeout(function() {\r
-                               $body.removeClass('is-preload');\r
-                       }, 100);\r
-               });\r
+                                       // Redirect to href.\r
+                                               setTimeout(function() {\r
 \r
-       // Scrolly.\r
-               $('.scrolly').scrolly();\r
+                                                       if (target == '_blank')\r
+                                                               window.open(href);\r
+                                                       else\r
+                                                               window.location.href = href;\r
 \r
-       // Background.\r
-               $wrapper._parallax(0.925);\r
+                                               }, 500);\r
 \r
-       // Nav Panel.\r
+                               });\r
+\r
+                       // Prevent certain events inside the panel from bubbling.\r
+                               $sidebar.on('click touchend touchstart touchmove', function(event) {\r
+\r
+                                       // >large? Bail.\r
+                                               if (breakpoints.active('>large'))\r
+                                                       return;\r
+\r
+                                       // Prevent propagation.\r
+                                               event.stopPropagation();\r
 \r
-               // Toggle.\r
-                       $navPanelToggle = $(\r
-                               '<a href="#navPanel" id="navPanelToggle">Menu</a>'\r
-                       )\r
-                               .appendTo($wrapper);\r
-\r
-                       // Change toggle styling once we've scrolled past the header.\r
-                               $header.scrollex({\r
-                                       bottom: '5vh',\r
-                                       enter: function() {\r
-                                               $navPanelToggle.removeClass('alt');\r
-                                       },\r
-                                       leave: function() {\r
-                                               $navPanelToggle.addClass('alt');\r
-                                       }\r
                                });\r
 \r
-               // Panel.\r
-                       $navPanel = $(\r
-                               '<div id="navPanel">' +\r
-                                       '<nav>' +\r
-                                       '</nav>' +\r
-                                       '<a href="#navPanel" class="close"></a>' +\r
-                               '</div>'\r
-                       )\r
-                               .appendTo($body)\r
-                               .panel({\r
-                                       delay: 500,\r
-                                       hideOnClick: true,\r
-                                       hideOnSwipe: true,\r
-                                       resetScroll: true,\r
-                                       resetForms: true,\r
-                                       side: 'right',\r
-                                       target: $body,\r
-                                       visibleClass: 'is-navPanel-visible'\r
+                       // Hide panel on body click/tap.\r
+                               $body.on('click touchend', function(event) {\r
+\r
+                                       // >large? Bail.\r
+                                               if (breakpoints.active('>large'))\r
+                                                       return;\r
+\r
+                                       // Deactivate.\r
+                                               $sidebar.addClass('inactive');\r
+\r
                                });\r
 \r
-                       // Get inner.\r
-                               $navPanelInner = $navPanel.children('nav');\r
+               // Scroll lock.\r
+               // Note: If you do anything to change the height of the sidebar's content, be sure to\r
+               // trigger 'resize.sidebar-lock' on $window so stuff doesn't get out of sync.\r
 \r
-                       // Move nav content on breakpoint change.\r
-                               var $navContent = $nav.children();\r
+                       $window.on('load.sidebar-lock', function() {\r
 \r
-                               breakpoints.on('>medium', function() {\r
+                               var sh, wh, st;\r
 \r
-                                       // NavPanel -> Nav.\r
-                                               $navContent.appendTo($nav);\r
+                               // Reset scroll position to 0 if it's 1.\r
+                                       if ($window.scrollTop() == 1)\r
+                                               $window.scrollTop(0);\r
 \r
-                                       // Flip icon classes.\r
-                                               $nav.find('.icons, .icon')\r
-                                                       .removeClass('alt');\r
+                               $window\r
+                                       .on('scroll.sidebar-lock', function() {\r
 \r
-                               });\r
+                                               var x, y;\r
 \r
-                               breakpoints.on('<=medium', function() {\r
+                                               // <=large? Bail.\r
+                                                       if (breakpoints.active('<=large')) {\r
 \r
-                                       // Nav -> NavPanel.\r
-                                               $navContent.appendTo($navPanelInner);\r
+                                                               $sidebar_inner\r
+                                                                       .data('locked', 0)\r
+                                                                       .css('position', '')\r
+                                                                       .css('top', '');\r
 \r
-                                       // Flip icon classes.\r
-                                               $navPanelInner.find('.icons, .icon')\r
-                                                       .addClass('alt');\r
+                                                               return;\r
 \r
-                               });\r
+                                                       }\r
 \r
-                       // Hack: Disable transitions on WP.\r
-                               if (browser.os == 'wp'\r
-                               &&      browser.osVersion < 10)\r
-                                       $navPanel\r
-                                               .css('transition', 'none');\r
+                                               // Calculate positions.\r
+                                                       x = Math.max(sh - wh, 0);\r
+                                                       y = Math.max(0, $window.scrollTop() - x);\r
 \r
-       // Intro.\r
-               var $intro = $('#intro');\r
+                                               // Lock/unlock.\r
+                                                       if ($sidebar_inner.data('locked') == 1) {\r
 \r
-               if ($intro.length > 0) {\r
+                                                               if (y <= 0)\r
+                                                                       $sidebar_inner\r
+                                                                               .data('locked', 0)\r
+                                                                               .css('position', '')\r
+                                                                               .css('top', '');\r
+                                                               else\r
+                                                                       $sidebar_inner\r
+                                                                               .css('top', -1 * x);\r
 \r
-                       // Hack: Fix flex min-height on IE.\r
-                               if (browser.name == 'ie') {\r
-                                       $window.on('resize.ie-intro-fix', function() {\r
+                                                       }\r
+                                                       else {\r
 \r
-                                               var h = $intro.height();\r
+                                                               if (y > 0)\r
+                                                                       $sidebar_inner\r
+                                                                               .data('locked', 1)\r
+                                                                               .css('position', 'fixed')\r
+                                                                               .css('top', -1 * x);\r
 \r
-                                               if (h > $window.height())\r
-                                                       $intro.css('height', 'auto');\r
-                                               else\r
-                                                       $intro.css('height', h);\r
+                                                       }\r
 \r
-                                       }).trigger('resize.ie-intro-fix');\r
-                               }\r
+                                       })\r
+                                       .on('resize.sidebar-lock', function() {\r
 \r
-                       // Hide intro on scroll (> small).\r
-                               breakpoints.on('>small', function() {\r
+                                               // Calculate heights.\r
+                                                       wh = $window.height();\r
+                                                       sh = $sidebar_inner.outerHeight() + 30;\r
 \r
-                                       $main.unscrollex();\r
+                                               // Trigger scroll.\r
+                                                       $window.trigger('scroll.sidebar-lock');\r
 \r
-                                       $main.scrollex({\r
-                                               mode: 'bottom',\r
-                                               top: '25vh',\r
-                                               bottom: '-50vh',\r
-                                               enter: function() {\r
-                                                       $intro.addClass('hidden');\r
-                                               },\r
-                                               leave: function() {\r
-                                                       $intro.removeClass('hidden');\r
-                                               }\r
-                                       });\r
+                                       })\r
+                                       .trigger('resize.sidebar-lock');\r
 \r
                                });\r
 \r
-                       // Hide intro on scroll (<= small).\r
-                               breakpoints.on('<=small', function() {\r
+       // Menu.\r
+               var $menu = $('#menu'),\r
+                       $menu_openers = $menu.children('ul').find('.opener');\r
 \r
-                                       $main.unscrollex();\r
+               // Openers.\r
+                       $menu_openers.each(function() {\r
 \r
-                                       $main.scrollex({\r
-                                               mode: 'middle',\r
-                                               top: '15vh',\r
-                                               bottom: '-15vh',\r
-                                               enter: function() {\r
-                                                       $intro.addClass('hidden');\r
-                                               },\r
-                                               leave: function() {\r
-                                                       $intro.removeClass('hidden');\r
-                                               }\r
-                                       });\r
+                               var $this = $(this);\r
 \r
-                       });\r
+                               $this.on('click', function(event) {\r
+\r
+                                       // Prevent default.\r
+                                               event.preventDefault();\r
+\r
+                                       // Toggle.\r
+                                               $menu_openers.not($this).removeClass('active');\r
+                                               $this.toggleClass('active');\r
+\r
+                                       // Trigger resize (sidebar lock).\r
+                                               $window.triggerHandler('resize.sidebar-lock');\r
 \r
-               }\r
+                               });\r
+\r
+                       });\r
 \r
 })(jQuery);
\ No newline at end of file