+================================================== */
+/*3 Corp Colors*/
+.bg-primary {
+ background-color: #44d; }
+
+.bg-secondary {
+ background-color: #67d; }
+
+.bg-light {
+ background-color: #f7f9fb; }
+
+.bg-black {
+ background-color: #111; }
+
+.bg-black-blue {
+ background-color: #123; }
+
+.bg-blue {
+ background-color: #346; }
+
+.bg-brown {
+ background-color: #f9f8f2; }
+
+.bg-gray {
+ background-color: #d5d9e2; }
+
+.bg-green {
+ background-color: #077; }
+
+.bg-purple {
+ background-color: #62b; }
+
+.bg-red {
+ background-color: #c23; }
+
+.bg-white {
+ background-color: #fff; }
+
+.bg-facebook {
+ background-color: #3b5998; }
+
+[class*='bg-'] .bg-white {
+ color: #333;
+ text-shadow: none; }
+
+/* BG Apple Keynote*/
+.bg-apple {
+ background: -webkit-gradient(linear, left top, left bottom, from(#000), color-stop(50%, #1a2028), to(#293845));
+ background: linear-gradient(to bottom, #000 0%, #1a2028 50%, #293845 100%); }
+
+/*Font Color*/
+.bg-trans-dark,
+.bg-trans-gradient,
+.bg-primary,
+.bg-secondary,
+.bg-blue,
+.bg-green,
+.bg-purple,
+.bg-red,
+.bg-facebook,
+.bg-apple,
+[class*='bg-black'],
+[class*='bg-gradient-'] {
+ color: #fff;
+ text-shadow: 0 1px 0 #013; }
+
+.bg-light p {
+ color: #456; }
+
+.bg-brown p {
+ color: #666; }
+
+/*Transparent/Opacity*/
+.bg-trans-dark {
+ background: rgba(0, 0, 0, 0.8); }
+
+.bg-trans-light {
+ background: rgba(0, 0, 0, 0.2); }
+
+/*Covers/Longforms...*/
+.bg-trans-gradient {
+ background: -webkit-gradient(linear, left bottom, left top, from(rgba(0, 0, 0, 0.8)), to(transparent));
+ background: linear-gradient(to top, rgba(0, 0, 0, 0.8) 0%, transparent 100%); }
+
+/*Horizontal Gradient*/
+.bg-gradient-h {
+ background: linear-gradient(134deg, #32b 0, #62b 100%); }
+
+/*Vertical Gradient*/
+.bg-gradient-v {
+ background: -webkit-gradient(linear, left bottom, left top, from(#62b), to(#32b));
+ background: linear-gradient(to top, #62b 0%, #32b 100%); }
+
+/*Radial Gradient*/
+.bg-gradient-r {
+ background: radial-gradient(ellipse at center, #62b 0%, #32b 100%); }
+
+/*White Gradient (vertical)*/
+.bg-gradient-white {
+ background: -webkit-gradient(linear, left top, left bottom, color-stop(0, #f2f4f6), to(#fff));
+ background: linear-gradient(180deg, #f2f4f6 0, #fff 100%);
+ color: #333;
+ text-shadow: none; }
+
+/*Gray Gradient (horizontal)*/
+.bg-gradient-gray {
+ background: -webkit-gradient(linear, left top, right top, color-stop(0, #f7f9fb), to(#dee2e6));
+ background: linear-gradient(90deg, #f7f9fb 0, #dee2e6 100%);
+ color: #333;
+ text-shadow: none; }
+
+/*Border/Frame*/
+.frame {
+ border: 0.8rem solid #fff; }
+
+[class*='background'].frame {
+ border-width: .2rem; }
+
+/*Layer/Box Shadow*/
+.shadow,
+.pre {
+ position: relative; }
+
+.shadow:before,
+.shadow:after {
+ -webkit-box-shadow: 0 16px 24px rgba(0, 20, 80, 0.3);
+ box-shadow: 0 16px 24px rgba(0, 20, 80, 0.3); }
+
+/*============================
+TYPOGRAPHY
+============================== */
+/* -- Horizontal separator -- */
+.text-separator:before {
+ background-color: rgba(170, 0, 0, 0.8); }
+
+/* -- Pull Quote (Right/Left) -- */
+[class*='text-pull-'] {
+ border-top: 4px solid rgba(0, 0, 0, 0.5); }
+
+img[class*='text-pull-'],
+figure[class*='text-pull-'] {
+ border-top: 0; }
+
+/* -- Context -- */
+[class*='bg-'] .text-context:before {
+ background-color: #fff; }
+
+.text-context:before,
+.bg-white .text-context:before {
+ background-color: rgba(0, 20, 80, 0.2); }
+
+/* -- Text shadow -- */
+.text-shadow {
+ text-shadow: 0 0 40px rgba(0, 0, 0, 0.5); }
+
+/* -- time, ampersands, prepositions (for, of...), symbols...
+[class*='card-'] time,
+h1 span {
+ color: #abd;
+}
+
+/* -- comment -- */
+.code-comment {
+ color: rgba(70, 170, 130, 0.9);
+ text-shadow: none; }
+
+/*=========================================
+Header/Nav
+=========================================== */
+header[role='banner'] {
+ background-color: #fff; }
+
+.logo a {
+ color: inherit; }
+
+nav[role='navigation'] li.active a {
+ background-color: #555;
+ color: #fff; }
+
+nav[role='navigation'] li a {
+ background-color: rgba(50, 50, 50, 0.9);
+ color: #fff; }
+ nav[role='navigation'] li a:hover {
+ background-color: rgba(50, 50, 50, 0.7); }
+
+nav li.twitter a:hover {
+ background-color: #1da1f3; }
+
+nav li.facebook a:hover {
+ background-color: #3b5998; }
+
+nav li.linkedin a:hover {
+ background-color: #1683bb; }
+
+nav li.dribbble a:hover {
+ background-color: #ea4c89; }
+
+nav li.github a:hover {
+ background-color: #60b044; }
+
+nav li.email a:hover {
+ background-color: #dd4b39; }
+
+/*===================================================
+.flexblock li hover/active
+===================================================== */
+.flexblock li.active a,
+.metrics li:hover,
+.specs li:hover,
+.reasons li:hover {
+ background-color: rgba(0, 20, 80, 0.03); }
+
+/*=========================================
+Features & Clients List
+=========================================== */
+.features li,
+.clients li {
+ background-color: rgba(255, 255, 255, 0.9); }
+
+[class*='bg-'] .features li,
+[class*='bg-'] .clients li {
+ background-color: rgba(255, 255, 255, 0.1); }
+
+.features li:hover,
+.clients li:hover {
+ -webkit-box-shadow: 0 8px 16px rgba(0, 20, 80, 0.02), 0 4px 16px rgba(0, 0, 0, 0.08);
+ box-shadow: 0 8px 16px rgba(0, 20, 80, 0.02), 0 4px 16px rgba(0, 0, 0, 0.08); }
+
+/*============================
+.flexblock with border
+============================== */
+.border {
+ border-bottom: 1px solid rgba(0, 20, 80, 0.1);
+ border-right: 1px solid rgba(0, 20, 80, 0.1); }
+
+.border li {
+ border-left: 1px solid rgba(0, 20, 80, 0.1);
+ border-top: 1px solid rgba(0, 20, 80, 0.1); }
+
+.flexblock.border li li {
+ border: 0; }
+
+/*===========================================
+flexblock.steps
+============================================= */
+.steps li:nth-child(1) {
+ background-color: #e8eef7; }
+
+.steps li:nth-child(2) {
+ background-color: #dde5f3; }
+
+.steps li:nth-child(3) {
+ background-color: #cdd8ec; }
+
+.steps li:nth-child(4) {
+ background-color: #bbcdec; }
+
+.process {
+ border-bottom: 15px solid transparent;
+ border-top: 15px solid transparent; }
+
+.steps li:hover,
+.steps.blink li:hover > a {
+ background-color: #b8cef7; }
+
+@media (min-width: 1024px) {
+ .process.step-2 {
+ border-left-color: #e8eef7; }
+ .process.step-3 {
+ border-left-color: #dde5f3; }
+ .process.step-4 {
+ border-left-color: #cdd8ec; }
+ .steps li:hover + li [class*='step-'] {
+ border-left-color: #b8cef7; } }
+
+/*=========================================================
+Items: You can use for settings, drag&drop, close/delete...
+=========================================================== */
+.specs li:after {
+ background: -webkit-gradient(linear, left top, right top, from(rgba(0, 20, 80, 0)), color-stop(50%, rgba(0, 20, 80, 0.2)), to(rgba(0, 20, 80, 0)));
+ background: linear-gradient(to right, rgba(0, 20, 80, 0) 0%, rgba(0, 20, 80, 0.2) 50%, rgba(0, 20, 80, 0) 100%); }
+
+.specs li:last-child:after {
+ background: none; }
+
+/*=========================================================
+Why/Steps/Motivation/Reasons - Decimal/Numbers
+=========================================================== */
+.reasons li:after {
+ background: -webkit-gradient(linear, left top, right top, from(rgba(0, 20, 80, 0)), color-stop(50%, rgba(0, 20, 80, 0.2)), to(rgba(0, 20, 80, 0)));
+ background: linear-gradient(to right, rgba(0, 20, 80, 0) 0%, rgba(0, 20, 80, 0.2) 50%, rgba(0, 20, 80, 0) 100%); }
+
+.reasons li:last-child:after {
+ background: none; }
+
+/*=========================================
+Overlays
+=========================================== */
+.overlay {
+ background-color: rgba(0, 0, 0, 0.2); }
+
+li:hover .overlay {
+ background-color: rgba(0, 0, 0, 0.1); }
+
+.overlay,
+.overlay a {
+ color: #fff;
+ text-shadow: 0 1px 0 #111; }
+
+/*=========================================
+Gallery li+.overlay+image
+=========================================== */
+.gallery li {
+ background-color: rgba(0, 20, 80, 0.06);
+ -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2), 0 4px 8px rgba(0, 0, 0, 0.03);
+ box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2), 0 4px 8px rgba(0, 0, 0, 0.03); }
+
+.gallery li figcaption {
+ background-color: #fff; }
+
+.flexblock.gallery li:hover {
+ -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2), 0 4px 8px rgba(0, 0, 0, 0.08);
+ box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2), 0 4px 8px rgba(0, 0, 0, 0.08); }
+
+.gallery li footer {
+ border-top: 1px solid rgba(0, 20, 80, 0.1); }
+
+.gallery li a {
+ color: #333;
+ text-shadow: none; }
+
+.flesblock.gallery li a footer {
+ color: #aaa; }
+
+/*Arrow */
+.gallery li figcaption:before {
+ border: 0.8rem solid #000;
+ border-color: transparent transparent #fff #fff; }
+
+/*=========================================
+Plans / Pricing
+=========================================== */
+.plans > li div,
+.flexblock.plans li:hover div {
+ background-color: #fff; }
+
+.plans > li:hover,
+.plans > li:nth-child(2) {
+ -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1), 0 8px 16px rgba(0, 0, 0, 0.1);
+ box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1), 0 8px 16px rgba(0, 0, 0, 0.1); }
+
+.plans:hover li:nth-child(2):not(:hover) {
+ -webkit-box-shadow: none;
+ box-shadow: none; }
+
+.plans li h2 {
+ background-color: rgba(0, 20, 80, 0.5);
+ color: #fff; }
+
+.plans ul li {
+ border-bottom: 1px solid rgba(0, 20, 80, 0.1); }
+ .plans ul li:last-child {
+ border-bottom: 0; }
+
+.plans > li > a {
+ color: #333;
+ text-shadow: none; }
+
+/*============================
+Activity/CV/Timeline/News
+============================== */
+.activity li {
+ border-top: 0.1rem solid rgba(0, 20, 80, 0.1); }
+
+.activity li:hover {
+ background-color: rgba(0, 20, 80, 0.02); }
+
+/*=========================================
+Resume/Work/CV/Portfolio
+=========================================== */
+.work-label,
+.work li a {
+ border-bottom: 1px solid rgba(0, 20, 80, 0.1); }
+
+.work li:nth-child(odd) > a {
+ background-color: rgba(0, 20, 80, 0.03); }
+
+.work li a:hover {
+ background-color: rgba(0, 20, 80, 0.04); }
+
+/*===========================================
+Clients / Services / Logos...
+============================================= */
+.clients.border figcaption {
+ border-top: 1px solid rgba(0, 20, 80, 0.1); }
+
+/*====================
+LOGOS
+====================== */
+/* --- Images (black logo/image) --- */
+img.blacklogo {
+ background: none;
+ -webkit-filter: grayscale(100%) brightness(10%) contrast(100%);
+ filter: grayscale(100%) brightness(10%) contrast(100%); }
+
+/* --- Images (gray logo/image) --- */
+img.graylogo {
+ -webkit-filter: grayscale(100%) brightness(10%) contrast(10%);
+ filter: grayscale(100%) brightness(10%) contrast(10%); }
+
+/* --- Images (white Logo/Image) --- */
+img.whitelogo {
+ -webkit-filter: brightness(0) invert(1);
+ filter: brightness(0) invert(1); }
+
+/* --- Logo/Images Hover --- */
+li:hover img.blacklogo,
+li:hover img.graylogo,
+img.blacklogo:hover,
+img.graylogo:hover {
+ background: none;
+ -webkit-filter: grayscale(0%);
+ filter: grayscale(0%);
+ -webkit-transition: all .6s ease;
+ transition: all .6s ease; }
+
+/*=========================================================
+Cards
+=========================================================== */
+[class*='card-'] > a {
+ color: inherit; }
+
+/* --- card ul specs --- */
+.description > li {
+ border-bottom: 1px solid rgba(0, 20, 80, 0.1); }
+
+.description > li:last-child {
+ border-bottom: 0; }
+
+/*== Figure Background === */
+[class*='card-'][class*='bg-'] figure {
+ background-color: rgba(0, 20, 80, 0.06); }
+
+/*== Ficaption Cards === */
+[class*='card'] figcaption,
+[class*='card'] figcaption a {
+ background: -webkit-gradient(linear, left top, left bottom, from(transparent), to(rgba(0, 0, 0, 0.2)));
+ background: linear-gradient(to bottom, transparent 0%, rgba(0, 0, 0, 0.2) 100%);
+ color: #fff; }
+
+/*===CTA (Call to Action - Numbers, Price, Promo...) ===== */
+@media (min-width: 768px) {
+ .cta .benefit {
+ -o-border-image: linear-gradient(90deg, transparent, rgba(0, 0, 0, 0.4) 50%, transparent) 1 100%;
+ border-image: -webkit-gradient(linear, left top, right top, from(transparent), color-stop(50%, rgba(0, 0, 0, 0.4)), to(transparent)) 1 100%;
+ border-image: linear-gradient(90deg, transparent, rgba(0, 0, 0, 0.4) 50%, transparent) 1 100%;
+ border-left-width: 1px;
+ border-style: solid; } }
+
+/*=========================================
+Tables
+=========================================== */
+table td,
+th,
+thead {
+ border: 1px solid rgba(0, 0, 0, 0.5); }
+
+thead {
+ background-color: rgba(0, 0, 0, 0.3); }
+
+tr:nth-child(even) > td {
+ background: rgba(0, 0, 0, 0.1); }
+
+tr > td {
+ border-top: 1px solid rgba(0, 0, 0, 0.5); }
+
+td:hover,
+tr:nth-child(even) > td:hover {
+ background-color: rgba(255, 255, 255, 0.5); }
+
+/*============================
+Browser (Screenshots)
+============================== */
+.browser {
+ border: 1px solid rgba(0, 20, 80, 0.1); }
+
+.browser:hover {
+ -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1), 0 8px 16px rgba(0, 0, 0, 0.1);
+ box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1), 0 8px 16px rgba(0, 0, 0, 0.1); }
+
+/*=== Topbar === */
+.browser:before {
+ background-color: rgba(0, 20, 80, 0.1);
+ border-bottom: 1px solid rgba(0, 20, 80, 0.2);
+ color: rgba(255, 255, 255, 0.9); }
+
+.browser:hover:before {
+ background-color: rgba(0, 20, 80, 0.12);
+ color: #fff; }
+
+/*=========================================
+Forms
+=========================================== */
+input,
+textarea {
+ background-color: #fafbfc; }
+
+input:focus,
+textarea:focus {
+ background-color: #fff;
+ -webkit-box-shadow: 0 0 5px #51cbee;
+ box-shadow: 0 0 5px #51cbee; }
+
+input:focus::-moz-placeholder {
+ color: #ddd; }
+
+input:focus::-webkit-input-placeholder {
+ color: #ddd; }
+
+a.button,
+[class*='badge-'],
+button[type='submit'],
+input {
+ -webkit-box-shadow: 0 10px 16px -8px rgba(0, 20, 80, 0.3);
+ box-shadow: 0 10px 16px -8px rgba(0, 20, 80, 0.3); }
+
+button,
+input,
+select,
+textarea,
+button[type='submit'],
+input[type='submit'],
+.button,
+.button:hover,
+button[type='submit']:hover,
+input[type='submit']:hover {
+ border: 1px solid #44d; }
+
+button[type='submit'],
+input[type='submit'],
+.button,
+.button:hover,
+button[type='submit']:hover,
+input[type='submit']:hover {
+ background-color: #44d;
+ color: #fff;
+ text-shadow: 0 1px 0 #123; }
+
+.button:active,
+button[type='submit']:active,
+input[type='submit']:active {
+ background-color: #17d; }
+
+.ghost,
+.ghost:hover {
+ background: none;
+ color: inherit;
+ text-shadow: none; }
+
+.bg-primary select,
+.bg-primary textarea,
+.bg-primary .button,
+.bg-primary button,
+.bg-primary button:hover,
+.bg-primary input,
+[class*='bg-gradient-'] .button,
+[class*='bg-'] a.button.ghost {
+ border-color: #fff; }
+
+[class*='bg-'] a.button {
+ color: #fff; }
+
+.bg-white a.button.ghost,
+.bg-gradient-white a.button.ghost {
+ border: 1px solid #44d;
+ color: #333; }
+
+:disabled,
+button:disabled:hover {
+ background-color: #eee;
+ border-color: #eee;
+ color: #ccc; }
+
+fieldset {
+ background-color: rgba(0, 20, 80, 0.2);
+ border: 1px solid #44d; }
+
+legend {
+ background-color: rgba(0, 0, 0, 0.6);
+ color: #fff; }
+
+/* Inputs/Buttons - hover */
+input:hover,
+select:hover {
+ -webkit-box-shadow: 0 0 8px rgba(0, 0, 0, 0.3);
+ box-shadow: 0 0 8px rgba(0, 0, 0, 0.3); }
+
+/* App Store Badges */
+[class*='badge-'] {
+ background-color: #000;
+ border: 1px solid #345; }
+
+form .flexblock li:hover {
+ background-color: rgba(0, 0, 0, 0.05); }
+
+/*============================
+Table of Contents
+============================== */
+.toc,
+.toc ol > li:before,
+.chapter {
+ background-color: #f7f9fb; }
+
+.toc li .toc-page:before {
+ border-bottom: 1px dotted rgba(0, 0, 0, 0.9); }
+
+/*============================
+Slides (Counter/Arrows)
+============================== */
+#counter,
+#navigation a {
+ color: #abc; }
+
+#webslides:hover #navigation a:hover {
+ background-color: rgba(0, 10, 40, 0.8);
+ color: #fff; }
+
+/*============================
+Footer
+============================== */
+footer[role='contentinfo'] {
+ background-color: #fff; }
+
+/*============================
+Slides Index
+============================== */
+#webslides-zoomed {
+ background: rgba(0, 10, 40, 0.8); }
+
+#webslides-zoomed .column > .wrap-zoom {
+ background-color: #f7f9fb;
+ -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2), 0 4px 8px rgba(0, 0, 0, 0.04);
+ box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2), 0 4px 8px rgba(0, 0, 0, 0.04);
+ color: #333; }
+ #webslides-zoomed .column > .wrap-zoom:hover {
+ -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2), 0 4px 8px rgba(0, 0, 0, 0.08);
+ box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2), 0 4px 8px rgba(0, 0, 0, 0.08); }
+ #webslides-zoomed .column > .wrap-zoom.current {
+ border: 0.6rem solid rgba(0, 20, 255, 0.2); }
+
+.text-slide-number {
+ color: #abc; }
diff --git a/static/fonts/HKGrotesk_2466/.DS_Store b/static/fonts/HKGrotesk_2466/.DS_Store
new file mode 100644
index 0000000..c5f9947
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/.DS_Store differ
diff --git a/static/fonts/HKGrotesk_2466/License/HKGrotesk-OFL.txt b/static/fonts/HKGrotesk_2466/License/HKGrotesk-OFL.txt
new file mode 100644
index 0000000..2cee1b7
--- /dev/null
+++ b/static/fonts/HKGrotesk_2466/License/HKGrotesk-OFL.txt
@@ -0,0 +1,93 @@
+Copyright (c) 2020 Alfredo Marco Pradil (https://hanken.co/)
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+http://scripts.sil.org/OFL
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/static/fonts/HKGrotesk_2466/OTF/HKGrotesk-Black.otf b/static/fonts/HKGrotesk_2466/OTF/HKGrotesk-Black.otf
new file mode 100644
index 0000000..ef72d01
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/OTF/HKGrotesk-Black.otf differ
diff --git a/static/fonts/HKGrotesk_2466/OTF/HKGrotesk-BlackItalic.otf b/static/fonts/HKGrotesk_2466/OTF/HKGrotesk-BlackItalic.otf
new file mode 100644
index 0000000..f9c7fc0
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/OTF/HKGrotesk-BlackItalic.otf differ
diff --git a/static/fonts/HKGrotesk_2466/OTF/HKGrotesk-Bold.otf b/static/fonts/HKGrotesk_2466/OTF/HKGrotesk-Bold.otf
new file mode 100644
index 0000000..656f450
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/OTF/HKGrotesk-Bold.otf differ
diff --git a/static/fonts/HKGrotesk_2466/OTF/HKGrotesk-BoldItalic.otf b/static/fonts/HKGrotesk_2466/OTF/HKGrotesk-BoldItalic.otf
new file mode 100644
index 0000000..ebad3a0
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/OTF/HKGrotesk-BoldItalic.otf differ
diff --git a/static/fonts/HKGrotesk_2466/OTF/HKGrotesk-ExtraBold.otf b/static/fonts/HKGrotesk_2466/OTF/HKGrotesk-ExtraBold.otf
new file mode 100644
index 0000000..d76fc7c
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/OTF/HKGrotesk-ExtraBold.otf differ
diff --git a/static/fonts/HKGrotesk_2466/OTF/HKGrotesk-ExtraBoldItalic.otf b/static/fonts/HKGrotesk_2466/OTF/HKGrotesk-ExtraBoldItalic.otf
new file mode 100644
index 0000000..f4f3821
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/OTF/HKGrotesk-ExtraBoldItalic.otf differ
diff --git a/static/fonts/HKGrotesk_2466/OTF/HKGrotesk-ExtraLight.otf b/static/fonts/HKGrotesk_2466/OTF/HKGrotesk-ExtraLight.otf
new file mode 100644
index 0000000..bfad88b
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/OTF/HKGrotesk-ExtraLight.otf differ
diff --git a/static/fonts/HKGrotesk_2466/OTF/HKGrotesk-ExtraLightItalic.otf b/static/fonts/HKGrotesk_2466/OTF/HKGrotesk-ExtraLightItalic.otf
new file mode 100644
index 0000000..61e33a7
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/OTF/HKGrotesk-ExtraLightItalic.otf differ
diff --git a/static/fonts/HKGrotesk_2466/OTF/HKGrotesk-Italic.otf b/static/fonts/HKGrotesk_2466/OTF/HKGrotesk-Italic.otf
new file mode 100644
index 0000000..7e2f4b2
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/OTF/HKGrotesk-Italic.otf differ
diff --git a/static/fonts/HKGrotesk_2466/OTF/HKGrotesk-Light.otf b/static/fonts/HKGrotesk_2466/OTF/HKGrotesk-Light.otf
new file mode 100644
index 0000000..bee304e
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/OTF/HKGrotesk-Light.otf differ
diff --git a/static/fonts/HKGrotesk_2466/OTF/HKGrotesk-LightItalic.otf b/static/fonts/HKGrotesk_2466/OTF/HKGrotesk-LightItalic.otf
new file mode 100644
index 0000000..e056e60
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/OTF/HKGrotesk-LightItalic.otf differ
diff --git a/static/fonts/HKGrotesk_2466/OTF/HKGrotesk-Medium.otf b/static/fonts/HKGrotesk_2466/OTF/HKGrotesk-Medium.otf
new file mode 100644
index 0000000..39b2471
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/OTF/HKGrotesk-Medium.otf differ
diff --git a/static/fonts/HKGrotesk_2466/OTF/HKGrotesk-MediumItalic.otf b/static/fonts/HKGrotesk_2466/OTF/HKGrotesk-MediumItalic.otf
new file mode 100644
index 0000000..317d588
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/OTF/HKGrotesk-MediumItalic.otf differ
diff --git a/static/fonts/HKGrotesk_2466/OTF/HKGrotesk-Regular.otf b/static/fonts/HKGrotesk_2466/OTF/HKGrotesk-Regular.otf
new file mode 100644
index 0000000..d583f5c
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/OTF/HKGrotesk-Regular.otf differ
diff --git a/static/fonts/HKGrotesk_2466/OTF/HKGrotesk-SemiBold.otf b/static/fonts/HKGrotesk_2466/OTF/HKGrotesk-SemiBold.otf
new file mode 100644
index 0000000..b5de19f
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/OTF/HKGrotesk-SemiBold.otf differ
diff --git a/static/fonts/HKGrotesk_2466/OTF/HKGrotesk-SemiBoldItalic.otf b/static/fonts/HKGrotesk_2466/OTF/HKGrotesk-SemiBoldItalic.otf
new file mode 100644
index 0000000..32d091f
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/OTF/HKGrotesk-SemiBoldItalic.otf differ
diff --git a/static/fonts/HKGrotesk_2466/OTF/HKGrotesk-Thin.otf b/static/fonts/HKGrotesk_2466/OTF/HKGrotesk-Thin.otf
new file mode 100644
index 0000000..36afac4
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/OTF/HKGrotesk-Thin.otf differ
diff --git a/static/fonts/HKGrotesk_2466/OTF/HKGrotesk-ThinItalic.otf b/static/fonts/HKGrotesk_2466/OTF/HKGrotesk-ThinItalic.otf
new file mode 100644
index 0000000..d33a087
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/OTF/HKGrotesk-ThinItalic.otf differ
diff --git a/static/fonts/HKGrotesk_2466/TTF/HKGrotesk-Black.ttf b/static/fonts/HKGrotesk_2466/TTF/HKGrotesk-Black.ttf
new file mode 100644
index 0000000..aef863e
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/TTF/HKGrotesk-Black.ttf differ
diff --git a/static/fonts/HKGrotesk_2466/TTF/HKGrotesk-BlackItalic.ttf b/static/fonts/HKGrotesk_2466/TTF/HKGrotesk-BlackItalic.ttf
new file mode 100644
index 0000000..99ba6aa
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/TTF/HKGrotesk-BlackItalic.ttf differ
diff --git a/static/fonts/HKGrotesk_2466/TTF/HKGrotesk-Bold.ttf b/static/fonts/HKGrotesk_2466/TTF/HKGrotesk-Bold.ttf
new file mode 100644
index 0000000..68c6459
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/TTF/HKGrotesk-Bold.ttf differ
diff --git a/static/fonts/HKGrotesk_2466/TTF/HKGrotesk-BoldItalic.ttf b/static/fonts/HKGrotesk_2466/TTF/HKGrotesk-BoldItalic.ttf
new file mode 100644
index 0000000..25cd5fc
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/TTF/HKGrotesk-BoldItalic.ttf differ
diff --git a/static/fonts/HKGrotesk_2466/TTF/HKGrotesk-ExtraBold.ttf b/static/fonts/HKGrotesk_2466/TTF/HKGrotesk-ExtraBold.ttf
new file mode 100644
index 0000000..5c1f1a5
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/TTF/HKGrotesk-ExtraBold.ttf differ
diff --git a/static/fonts/HKGrotesk_2466/TTF/HKGrotesk-ExtraBoldItalic.ttf b/static/fonts/HKGrotesk_2466/TTF/HKGrotesk-ExtraBoldItalic.ttf
new file mode 100644
index 0000000..8a81234
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/TTF/HKGrotesk-ExtraBoldItalic.ttf differ
diff --git a/static/fonts/HKGrotesk_2466/TTF/HKGrotesk-ExtraLight.ttf b/static/fonts/HKGrotesk_2466/TTF/HKGrotesk-ExtraLight.ttf
new file mode 100644
index 0000000..d9a0405
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/TTF/HKGrotesk-ExtraLight.ttf differ
diff --git a/static/fonts/HKGrotesk_2466/TTF/HKGrotesk-ExtraLightItalic.ttf b/static/fonts/HKGrotesk_2466/TTF/HKGrotesk-ExtraLightItalic.ttf
new file mode 100644
index 0000000..cbeb184
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/TTF/HKGrotesk-ExtraLightItalic.ttf differ
diff --git a/static/fonts/HKGrotesk_2466/TTF/HKGrotesk-Italic.ttf b/static/fonts/HKGrotesk_2466/TTF/HKGrotesk-Italic.ttf
new file mode 100644
index 0000000..7706ed8
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/TTF/HKGrotesk-Italic.ttf differ
diff --git a/static/fonts/HKGrotesk_2466/TTF/HKGrotesk-Light.ttf b/static/fonts/HKGrotesk_2466/TTF/HKGrotesk-Light.ttf
new file mode 100644
index 0000000..c0f2a5d
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/TTF/HKGrotesk-Light.ttf differ
diff --git a/static/fonts/HKGrotesk_2466/TTF/HKGrotesk-LightItalic.ttf b/static/fonts/HKGrotesk_2466/TTF/HKGrotesk-LightItalic.ttf
new file mode 100644
index 0000000..126c0ba
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/TTF/HKGrotesk-LightItalic.ttf differ
diff --git a/static/fonts/HKGrotesk_2466/TTF/HKGrotesk-Medium.ttf b/static/fonts/HKGrotesk_2466/TTF/HKGrotesk-Medium.ttf
new file mode 100644
index 0000000..2b4f84a
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/TTF/HKGrotesk-Medium.ttf differ
diff --git a/static/fonts/HKGrotesk_2466/TTF/HKGrotesk-MediumItalic.ttf b/static/fonts/HKGrotesk_2466/TTF/HKGrotesk-MediumItalic.ttf
new file mode 100644
index 0000000..ef883f4
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/TTF/HKGrotesk-MediumItalic.ttf differ
diff --git a/static/fonts/HKGrotesk_2466/TTF/HKGrotesk-Regular.ttf b/static/fonts/HKGrotesk_2466/TTF/HKGrotesk-Regular.ttf
new file mode 100644
index 0000000..bdb709c
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/TTF/HKGrotesk-Regular.ttf differ
diff --git a/static/fonts/HKGrotesk_2466/TTF/HKGrotesk-SemiBold.ttf b/static/fonts/HKGrotesk_2466/TTF/HKGrotesk-SemiBold.ttf
new file mode 100644
index 0000000..1e6331b
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/TTF/HKGrotesk-SemiBold.ttf differ
diff --git a/static/fonts/HKGrotesk_2466/TTF/HKGrotesk-SemiBoldItalic.ttf b/static/fonts/HKGrotesk_2466/TTF/HKGrotesk-SemiBoldItalic.ttf
new file mode 100644
index 0000000..bba8762
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/TTF/HKGrotesk-SemiBoldItalic.ttf differ
diff --git a/static/fonts/HKGrotesk_2466/TTF/HKGrotesk-Thin.ttf b/static/fonts/HKGrotesk_2466/TTF/HKGrotesk-Thin.ttf
new file mode 100644
index 0000000..b2a67b4
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/TTF/HKGrotesk-Thin.ttf differ
diff --git a/static/fonts/HKGrotesk_2466/TTF/HKGrotesk-ThinItalic.ttf b/static/fonts/HKGrotesk_2466/TTF/HKGrotesk-ThinItalic.ttf
new file mode 100644
index 0000000..6fdc49e
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/TTF/HKGrotesk-ThinItalic.ttf differ
diff --git a/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-Black.eot b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-Black.eot
new file mode 100644
index 0000000..1c9d60a
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-Black.eot differ
diff --git a/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-Black.woff b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-Black.woff
new file mode 100644
index 0000000..9be5ab8
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-Black.woff differ
diff --git a/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-Black.woff2 b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-Black.woff2
new file mode 100644
index 0000000..7e9a973
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-Black.woff2 differ
diff --git a/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-BlackItalic.eot b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-BlackItalic.eot
new file mode 100644
index 0000000..db1780d
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-BlackItalic.eot differ
diff --git a/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-BlackItalic.woff b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-BlackItalic.woff
new file mode 100644
index 0000000..f2b6e11
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-BlackItalic.woff differ
diff --git a/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-BlackItalic.woff2 b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-BlackItalic.woff2
new file mode 100644
index 0000000..176f9fb
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-BlackItalic.woff2 differ
diff --git a/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-Bold.eot b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-Bold.eot
new file mode 100644
index 0000000..d31cd77
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-Bold.eot differ
diff --git a/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-Bold.woff b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-Bold.woff
new file mode 100644
index 0000000..2e6e8ca
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-Bold.woff differ
diff --git a/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-Bold.woff2 b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-Bold.woff2
new file mode 100644
index 0000000..ebb671d
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-Bold.woff2 differ
diff --git a/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-BoldItalic.eot b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-BoldItalic.eot
new file mode 100644
index 0000000..84150df
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-BoldItalic.eot differ
diff --git a/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-BoldItalic.woff b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-BoldItalic.woff
new file mode 100644
index 0000000..d6d9f71
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-BoldItalic.woff differ
diff --git a/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-BoldItalic.woff2 b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-BoldItalic.woff2
new file mode 100644
index 0000000..ad360ea
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-BoldItalic.woff2 differ
diff --git a/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-ExtraBold.eot b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-ExtraBold.eot
new file mode 100644
index 0000000..2d1abbd
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-ExtraBold.eot differ
diff --git a/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-ExtraBold.woff b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-ExtraBold.woff
new file mode 100644
index 0000000..7ca68ec
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-ExtraBold.woff differ
diff --git a/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-ExtraBold.woff2 b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-ExtraBold.woff2
new file mode 100644
index 0000000..d9987a9
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-ExtraBold.woff2 differ
diff --git a/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-ExtraBoldItalic.eot b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-ExtraBoldItalic.eot
new file mode 100644
index 0000000..7d7dd8b
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-ExtraBoldItalic.eot differ
diff --git a/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-ExtraBoldItalic.woff b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-ExtraBoldItalic.woff
new file mode 100644
index 0000000..b83b616
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-ExtraBoldItalic.woff differ
diff --git a/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-ExtraBoldItalic.woff2 b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-ExtraBoldItalic.woff2
new file mode 100644
index 0000000..0e51ed6
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-ExtraBoldItalic.woff2 differ
diff --git a/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-ExtraLight.eot b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-ExtraLight.eot
new file mode 100644
index 0000000..895aff1
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-ExtraLight.eot differ
diff --git a/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-ExtraLight.woff b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-ExtraLight.woff
new file mode 100644
index 0000000..632d333
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-ExtraLight.woff differ
diff --git a/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-ExtraLight.woff2 b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-ExtraLight.woff2
new file mode 100644
index 0000000..b3e1917
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-ExtraLight.woff2 differ
diff --git a/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-ExtraLightItalic.eot b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-ExtraLightItalic.eot
new file mode 100644
index 0000000..a3bcb09
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-ExtraLightItalic.eot differ
diff --git a/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-ExtraLightItalic.woff b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-ExtraLightItalic.woff
new file mode 100644
index 0000000..777bb7e
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-ExtraLightItalic.woff differ
diff --git a/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-ExtraLightItalic.woff2 b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-ExtraLightItalic.woff2
new file mode 100644
index 0000000..2a80861
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-ExtraLightItalic.woff2 differ
diff --git a/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-Italic.eot b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-Italic.eot
new file mode 100644
index 0000000..368c2e5
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-Italic.eot differ
diff --git a/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-Italic.woff b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-Italic.woff
new file mode 100644
index 0000000..1b78bf0
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-Italic.woff differ
diff --git a/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-Italic.woff2 b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-Italic.woff2
new file mode 100644
index 0000000..3026983
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-Italic.woff2 differ
diff --git a/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-Light.eot b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-Light.eot
new file mode 100644
index 0000000..23a91a7
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-Light.eot differ
diff --git a/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-Light.woff b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-Light.woff
new file mode 100644
index 0000000..400165a
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-Light.woff differ
diff --git a/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-Light.woff2 b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-Light.woff2
new file mode 100644
index 0000000..12b737c
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-Light.woff2 differ
diff --git a/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-LightItalic.eot b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-LightItalic.eot
new file mode 100644
index 0000000..12a2020
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-LightItalic.eot differ
diff --git a/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-LightItalic.woff b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-LightItalic.woff
new file mode 100644
index 0000000..eaca837
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-LightItalic.woff differ
diff --git a/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-LightItalic.woff2 b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-LightItalic.woff2
new file mode 100644
index 0000000..75966c0
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-LightItalic.woff2 differ
diff --git a/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-Medium.eot b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-Medium.eot
new file mode 100644
index 0000000..8cbc2c9
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-Medium.eot differ
diff --git a/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-Medium.woff b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-Medium.woff
new file mode 100644
index 0000000..6dc271a
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-Medium.woff differ
diff --git a/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-Medium.woff2 b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-Medium.woff2
new file mode 100644
index 0000000..20cab47
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-Medium.woff2 differ
diff --git a/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-MediumItalic.eot b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-MediumItalic.eot
new file mode 100644
index 0000000..6277d58
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-MediumItalic.eot differ
diff --git a/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-MediumItalic.woff b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-MediumItalic.woff
new file mode 100644
index 0000000..09ed325
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-MediumItalic.woff differ
diff --git a/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-MediumItalic.woff2 b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-MediumItalic.woff2
new file mode 100644
index 0000000..3d742d3
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-MediumItalic.woff2 differ
diff --git a/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-Regular.eot b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-Regular.eot
new file mode 100644
index 0000000..bfb3785
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-Regular.eot differ
diff --git a/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-Regular.woff b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-Regular.woff
new file mode 100644
index 0000000..3ad8382
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-Regular.woff differ
diff --git a/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-Regular.woff2 b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-Regular.woff2
new file mode 100644
index 0000000..a9216f1
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-Regular.woff2 differ
diff --git a/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-SemiBold.eot b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-SemiBold.eot
new file mode 100644
index 0000000..1bcb447
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-SemiBold.eot differ
diff --git a/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-SemiBold.woff b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-SemiBold.woff
new file mode 100644
index 0000000..73732db
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-SemiBold.woff differ
diff --git a/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-SemiBold.woff2 b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-SemiBold.woff2
new file mode 100644
index 0000000..1e21eff
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-SemiBold.woff2 differ
diff --git a/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-SemiBoldItalic.eot b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-SemiBoldItalic.eot
new file mode 100644
index 0000000..f2d6419
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-SemiBoldItalic.eot differ
diff --git a/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-SemiBoldItalic.woff b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-SemiBoldItalic.woff
new file mode 100644
index 0000000..3378348
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-SemiBoldItalic.woff differ
diff --git a/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-SemiBoldItalic.woff2 b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-SemiBoldItalic.woff2
new file mode 100644
index 0000000..c5c5bf7
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-SemiBoldItalic.woff2 differ
diff --git a/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-Thin.eot b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-Thin.eot
new file mode 100644
index 0000000..35d0add
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-Thin.eot differ
diff --git a/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-Thin.woff b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-Thin.woff
new file mode 100644
index 0000000..7c45f26
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-Thin.woff differ
diff --git a/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-Thin.woff2 b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-Thin.woff2
new file mode 100644
index 0000000..77d73a7
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-Thin.woff2 differ
diff --git a/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-ThinItalic.eot b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-ThinItalic.eot
new file mode 100644
index 0000000..16623e6
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-ThinItalic.eot differ
diff --git a/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-ThinItalic.woff b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-ThinItalic.woff
new file mode 100644
index 0000000..60dc05d
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-ThinItalic.woff differ
diff --git a/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-ThinItalic.woff2 b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-ThinItalic.woff2
new file mode 100644
index 0000000..8e0eb6d
Binary files /dev/null and b/static/fonts/HKGrotesk_2466/WEB/HKGrotesk-ThinItalic.woff2 differ
diff --git a/static/fonts/HKGrotesk_2466/hk-grotesk.css b/static/fonts/HKGrotesk_2466/hk-grotesk.css
new file mode 100644
index 0000000..eede97a
--- /dev/null
+++ b/static/fonts/HKGrotesk_2466/hk-grotesk.css
@@ -0,0 +1,35 @@
+@font-face {
+ font-family: 'HKGroteskBold';
+ src: url('https://freibier.cc/style/fonts/HKGrotesk_2466/WEB/HKGrotesk-Bold.eot') format('eot');
+ src: url('https://freibier.cc/style/fonts/HKGrotesk_2466/WEB/HKGrotesk-Bold.woff') format('woff');
+ src: url('https://freibier.cc/style/fonts/HKGrotesk_2466/WEB/HKGrotesk-Bold.woff2') format('woff2');
+ font-weight: bold;
+ font-style: normal;
+ }
+
+@font-face {
+ font-family: 'HKGroteskBoldItalic';
+ src: url('https://freibier.cc/style/fonts/HKGrotesk_2466/WEB/HKGrotesk-BoldItalic.eot') format('eot');
+ src: url('https://freibier.cc/style/fonts/HKGrotesk_2466/WEB/HKGrotesk-BoldItalic.woff') format('woff');
+ src: url('https://freibier.cc/style/fonts/HKGrotesk_2466/WEB/HKGrotesk-BoldItalic.woff2') format('woff2');
+ font-weight: bold;
+ font-style: italic;
+ }
+
+@font-face {
+ font-family: 'HKGroteskItalic';
+ src: url('https://freibier.cc/style/fonts/HKGrotesk_2466/WEB/HKGrotesk-Italic.eot') format('eot');
+ src: url('https://freibier.cc/style/fonts/HKGrotesk_2466/WEB/HKGrotesk-Italic.woff') format('woff');
+ src: url('https://freibier.cc/style/fonts/HKGrotesk_2466/WEB/HKGrotesk-Italic.woff2') format('woff2');
+ font-weight: normal;
+ font-style: italic;
+ }
+
+@font-face {
+ font-family: 'HKGroteskRegular';
+ src: url('https://freibier.cc/style/fonts/HKGrotesk_2466/WEB/HKGrotesk-Regular.eot') format('eot');
+ src: url('https://freibier.cc/style/fonts/HKGrotesk_2466/WEB/HKGrotesk-Regular.woff') format('woff');
+ src: url('https://freibier.cc/style/fonts/HKGrotesk_2466/WEB/HKGrotesk-Regular.woff2') format('woff2');
+ font-weight: normal;
+ font-style: normal;
+ }
diff --git a/static/js/svg-icons.js b/static/js/svg-icons.js
new file mode 100644
index 0000000..34030b1
--- /dev/null
+++ b/static/js/svg-icons.js
@@ -0,0 +1,12 @@
+/*
+ * Thanks fontastic.me (Font Awesome 4.4 as SVG Icons).
+ * Do you want to use other icons?
+ * Go to https://fontastic.me > Create account > Select icons > Customize > Publish (SVG Sprite) > Paste .js here
+ */
+
+/*
+Important!
+/css/svg-icons.css is required.
+*/
+
+(function(a,b,c,d){function e(b,c){if(c){var d=c.getAttribute('viewBox'),e=a.createDocumentFragment(),f=c.cloneNode(true);if(d)b.setAttribute('viewBox',d);while(f.childNodes.length)e.appendChild(f.childNodes[0]);b.appendChild(e);}}function f(){var b=this,c=a.createElement('x'),d=b.s;c.innerHTML=b.responseText;b.onload=function(){d.splice(0).map(function(a){e(a[0],c.querySelector('#'+a[1].replace(/(\W)/g,'\\$1')));});};b.onload();}function g(){var a;while((a=b[0])){var e=a.parentNode,h=a.getAttribute('xlink:href').split('#')[1],i='https://file.myfontastic.com/bLfXNBF36ByeujCbT5PohZ/sprites/1477146123.svg';e.removeChild(a);var j=d[i]=d[i]||new XMLHttpRequest();if(!j.s){j.s=[];j.open('GET',i);j.onload=f;j.send();}j.s.push([e,h]);if(j.readyState===4)j.onload();}c(g);}g();})(document,document.getElementsByTagName('use'),window.requestAnimationFrame||window.setTimeout,{});
\ No newline at end of file
diff --git a/static/js/webslides.js b/static/js/webslides.js
new file mode 100644
index 0000000..540d033
--- /dev/null
+++ b/static/js/webslides.js
@@ -0,0 +1,3109 @@
+/*!
+ * Name: WebSlides
+ * Version: 1.5.0
+ * Date: 2017-09-16
+ * Description: Making HTML presentations easy
+ * URL: https://github.com/webslides/webslides#readme
+ * Credits: @jlantunez, @LuisSacristan, @Belelros
+ */
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "/static/js/";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 5);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__custom_event__ = __webpack_require__(9);
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+
+
+var transitionEvent = '';
+var animationEvent = '';
+
+/**
+ * Static class for DOM helper.
+ */
+
+var DOM = function () {
+ function DOM() {
+ _classCallCheck(this, DOM);
+ }
+
+ _createClass(DOM, null, [{
+ key: 'createNode',
+
+ /**
+ * Creates a node with optional parameters.
+ * @param {string} tag The name of the tag of the needed element.
+ * @param {string} id The desired id for the element. It defaults to an
+ * empty string.
+ * @param {string} text The desired text to go inside of the element. It
+ * defaults to an empty string.
+ * @return {Element}
+ */
+ value: function createNode(tag) {
+ var id = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
+ var text = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
+
+ var node = document.createElement(tag);
+ if (id) {
+ node.id = id;
+ }
+
+ if (text) {
+ node.textContent = text;
+ }
+
+ return node;
+ }
+
+ /**
+ * Listens for an event once.
+ * @param {Element} el Element to listen to.
+ * @param {string} event Event Type.
+ * @param {Function} callback Function to execute once the event fires.
+ */
+
+ }, {
+ key: 'once',
+ value: function once(el, event, callback) {
+ var cb = function cb(e) {
+ if (e.target === el) {
+ el.removeEventListener(event, cb);
+ callback(e);
+ }
+ };
+
+ el.addEventListener(event, cb, false);
+ }
+
+ /**
+ * Gets the prefixed transitionend event.
+ * @param {?Element} optEl Element to check
+ * @return {string}
+ */
+
+ }, {
+ key: 'getTransitionEvent',
+ value: function getTransitionEvent(optEl) {
+ if (transitionEvent && !optEl) {
+ return transitionEvent;
+ }
+
+ transitionEvent = '';
+
+ var el = optEl || document.createElement('ws');
+ var transitions = {
+ 'transition': 'transitionend',
+ 'OTransition': 'oTransitionEnd',
+ 'MozTransition': 'transitionend',
+ 'WebkitTransition': 'webkitTransitionEnd'
+ };
+ var transitionNames = Object.keys(transitions);
+
+ for (var i = 0, length = transitionNames.length; i < length && !transitionEvent; i++) {
+ var transitionName = transitionNames[i];
+
+ if (typeof el.style[transitionName] !== 'undefined') {
+ transitionEvent = transitions[transitionName];
+ }
+ }
+
+ return transitionEvent;
+ }
+
+ /**
+ * Gets the prefixed animation end event.
+ * @param {?Element} optEl Element to check
+ * @return {string}
+ */
+
+ }, {
+ key: 'getAnimationEvent',
+ value: function getAnimationEvent(optEl) {
+ if (animationEvent && !optEl) {
+ return animationEvent;
+ }
+
+ animationEvent = 'animationend';
+
+ var el = optEl || document.createElement('ws');
+ var animations = {
+ 'animation': 'animationend',
+ 'OAnimation': 'oAnimationEnd',
+ 'MozAnimation': 'animationend',
+ 'WebkitAnimation': 'webkitAnimationEnd'
+ };
+ var animationNames = Object.keys(animations);
+
+ for (var i = 0, length = animationNames.length; i < length; i++) {
+ var animationName = animationNames[i];
+
+ if (typeof el.style[animationName] !== 'undefined') {
+ animationEvent = animations[animationName];
+ break;
+ }
+ }
+
+ return animationEvent;
+ }
+
+ /**
+ * Hides an element setting the display to none.
+ * @param {Element} el Element to be hidden.
+ */
+
+ }, {
+ key: 'hide',
+ value: function hide(el) {
+ el.style.display = 'none';
+ }
+
+ /**
+ * Shows an element by removing the display property. This is only intended
+ * to be used in conjunction with DOM.hide.
+ * @param {Element} el Element to be shown.
+ */
+
+ }, {
+ key: 'show',
+ value: function show(el) {
+ el.style.display = '';
+ }
+
+ /**
+ * Checks if the element is visible.
+ * @param {Element} el Element to check.
+ * @return {boolean}
+ */
+
+ }, {
+ key: 'isVisible',
+ value: function isVisible(el) {
+ return el.offsetParent !== null;
+ }
+
+ /**
+ * Fires a custom event on the given target.
+ * @param {Element} target The target of the event.
+ * @param {string} eventType The event type.
+ * @param {Object} eventInfo Optional parameter to provide additional data
+ * to the event.
+ */
+
+ }, {
+ key: 'fireEvent',
+ value: function fireEvent(target, eventType) {
+ var eventInfo = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
+
+ var event = new __WEBPACK_IMPORTED_MODULE_0__custom_event__["a" /* default */](eventType, {
+ detail: eventInfo
+ });
+
+ target.dispatchEvent(event);
+ }
+
+ /**
+ * Converts an iterable to an array.
+ * @param {*} iterable Element to convert to array
+ * @return {Array} the element casted to an array.
+ */
+
+ }, {
+ key: 'toArray',
+ value: function toArray(iterable) {
+ return [].slice.call(iterable);
+ }
+
+ /**
+ * Checks whether the document has focus on an input or contenteditable
+ * element.
+ * @return {boolean} Whether the focused element is an input or content
+ * editable.
+ */
+
+ }, {
+ key: 'isFocusableElement',
+ value: function isFocusableElement() {
+ var result = false;
+
+ if (document.activeElement) {
+ var isContentEditable = document.activeElement.contentEditable !== 'inherit' && document.activeElement.contentEditable !== undefined;
+ var isInput = ['INPUT', 'SELECT', 'OPTION', 'TEXTAREA'].indexOf(document.activeElement.tagName) > -1;
+ result = isInput || isContentEditable;
+ }
+
+ return result;
+ }
+
+ /**
+ * Gets the integer value of a style property.
+ * @param {string} prop CSS property value.
+ * @return {Number} The property without the units.
+ */
+
+ }, {
+ key: 'parseSize',
+ value: function parseSize(prop) {
+ return Number(prop.replace(/[^\d\.]/g, ''));
+ }
+
+ /**
+ * Wraps a HTML structure around an element.
+ * @param {Element} elem the element to be wrapped.
+ * @param {string} tag the new element tag.
+ * @return {Element} the new element.
+ */
+
+ }, {
+ key: 'wrap',
+ value: function wrap(elem, tag) {
+ var wrap = document.createElement(tag);
+ elem.parentElement.insertBefore(wrap, elem);
+ wrap.appendChild(elem);
+
+ return wrap;
+ }
+
+ /**
+ * Inserts and element after another element.
+ * @param {Element} elem the element to be inserted.
+ * @param {Element} target the element to be inserted after.
+ */
+
+ }, {
+ key: 'after',
+ value: function after(elem, target) {
+ var parent = target.parentNode;
+
+ if (parent.lastChild === target) {
+ parent.appendChild(elem);
+ } else {
+ parent.insertBefore(elem, target.nextSibling);
+ }
+ }
+ }]);
+
+ return DOM;
+}();
+
+/* harmony default export */ __webpack_exports__["a"] = (DOM);
+
+/***/ }),
+/* 1 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return Slide; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Events; });
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__utils_dom__ = __webpack_require__(0);
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+
+
+var CLASSES = {
+ SLIDE: 'slide',
+ CURRENT: 'current'
+};
+
+var Events = {
+ ENTER: 'dom:enter',
+ LEAVE: 'dom:leave',
+ ENABLE: 'slide:enable',
+ DISABLE: 'slide:disable'
+};
+
+/**
+ * Wrapper for the Slide section.
+ */
+
+var Slide = function () {
+ /**
+ * Bootstraps the slide by saving some data, adding a class and hiding it.
+ * @param {Element} el Section element.
+ * @param {number} i Zero based index of the slide.
+ */
+ function Slide(el, i) {
+ _classCallCheck(this, Slide);
+
+ /**
+ * @type {Element}
+ */
+ this.el = el;
+ /**
+ * The section's parent.
+ * @type {Node}
+ */
+ this.parent = el.parentNode;
+ /**
+ * @type {number}
+ */
+ this.i = i;
+
+ this.el.id = 'section-' + (i + 1);
+ this.el.classList.add(CLASSES.SLIDE);
+
+ // Hide slides by default
+ this.hide();
+ }
+
+ /**
+ * Hides the node and removes the class that makes it "active".
+ */
+
+
+ _createClass(Slide, [{
+ key: 'hide',
+ value: function hide() {
+ __WEBPACK_IMPORTED_MODULE_0__utils_dom__["a" /* default */].hide(this.el);
+ this.el.classList.remove(CLASSES.CURRENT);
+ }
+
+ /**
+ * Shows the node and adds the class that makes it "active".
+ */
+
+ }, {
+ key: 'show',
+ value: function show() {
+ __WEBPACK_IMPORTED_MODULE_0__utils_dom__["a" /* default */].show(this.el);
+ this.el.classList.add(CLASSES.CURRENT);
+ }
+
+ /**
+ * Moves the section to the bottom of the section's list.
+ * @fires Slide#dom:leave
+ * @fires Slide#dom:enter
+ */
+
+ }, {
+ key: 'moveAfterLast',
+ value: function moveAfterLast() {
+ var last = this.parent.childNodes[this.parent.childElementCount - 1];
+
+ this.fire_(Events.LEAVE);
+ this.parent.insertBefore(this.el, last.nextSibling);
+ this.fire_(Events.ENTER);
+ }
+
+ /**
+ * Moves the section to the top of the section's list.
+ * @fires Slide#dom:leave
+ * @fires Slide#dom:enter
+ */
+
+ }, {
+ key: 'moveBeforeFirst',
+ value: function moveBeforeFirst() {
+ var first = this.parent.childNodes[0];
+
+ this.fire_(Events.LEAVE);
+ this.parent.insertBefore(this.el, first);
+ this.fire_(Events.ENTER);
+ }
+
+ /**
+ * Fires an enable event.
+ * @fires Slide#slide:enable
+ */
+
+ }, {
+ key: 'enable',
+ value: function enable() {
+ this.fire_(Events.ENABLE);
+ }
+
+ /**
+ * Fires a disable event.
+ * @fires Slide#slide:disable
+ */
+
+ }, {
+ key: 'disable',
+ value: function disable() {
+ this.fire_(Events.DISABLE);
+ }
+
+ /**
+ * Fires an event passing the slide instance on the detail.
+ * @param {String} name Name of the event to fire.
+ * @private
+ */
+
+ }, {
+ key: 'fire_',
+ value: function fire_(name) {
+ __WEBPACK_IMPORTED_MODULE_0__utils_dom__["a" /* default */].fireEvent(this.el, name, {
+ slide: this
+ });
+ }
+
+ /**
+ * Checks whether an element is a valid candidate to be a slide by ensuring
+ * it's a "section" element.
+ * @param {Element} el Element to be checked.
+ * @return {boolean} Whether is candidate or not.
+ */
+
+ }], [{
+ key: 'isCandidate',
+ value: function isCandidate(el) {
+ return el.nodeType === 1 && el.tagName === 'SECTION';
+ }
+
+ /**
+ * Gets the section element from an inner element.
+ * @param {Node} el
+ * @return {{section: ?Node, i: ?number}} A map with the section and the
+ * position of the section.
+ */
+
+ }, {
+ key: 'getSectionFromEl',
+ value: function getSectionFromEl(el) {
+ var parent = el;
+ var section = null;
+ var i = null;
+
+ while (parent.parentElement && !parent.classList.contains(CLASSES.SLIDE)) {
+ parent = parent.parentElement;
+ }
+
+ if (parent.classList.contains(CLASSES.SLIDE)) {
+ section = parent;
+ i = parseInt(section.id.replace('section-', ''), 10);
+ }
+
+ return { section: section, i: i };
+ }
+ }]);
+
+ return Slide;
+}();
+
+
+
+/***/ }),
+/* 2 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+var Keys = {
+ ENTER: 13,
+ SPACE: 32,
+ RE_PAGE: 33,
+ AV_PAGE: 34,
+ END: 35,
+ HOME: 36,
+ LEFT: 37,
+ UP: 38,
+ RIGHT: 39,
+ DOWN: 40,
+ PLUS: [107, 171, 187],
+ MINUS: [109, 173, 189],
+ ESCAPE: 27,
+ F: 70
+};
+
+/* harmony default export */ __webpack_exports__["a"] = (Keys);
+
+/***/ }),
+/* 3 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+var UA = window.navigator.userAgent;
+
+/**
+ * Mobile detector helper class. Tests the User Agent to see if we're, likely,
+ * on a mobile device.
+ */
+
+var MobileDetector = function () {
+ function MobileDetector() {
+ _classCallCheck(this, MobileDetector);
+ }
+
+ _createClass(MobileDetector, null, [{
+ key: "isAndroid",
+
+ /**
+ * Whether the device is Android or not.
+ * @return {Boolean}
+ */
+ value: function isAndroid() {
+ return !!UA.match(/Android/i);
+ }
+
+ /**
+ * Whether the device is BlackBerry or not.
+ * @return {Boolean}
+ */
+
+ }, {
+ key: "isBlackBerry",
+ value: function isBlackBerry() {
+ return !!UA.match(/BlackBerry/i);
+ }
+
+ /**
+ * Whether the device is iOS or not.
+ * @return {Boolean}
+ */
+
+ }, {
+ key: "isiOS",
+ value: function isiOS() {
+ return !!UA.match(/iPad|iPhone|iPod/i);
+ }
+
+ /**
+ * Whether the device is Opera or not.
+ * @return {Boolean}
+ */
+
+ }, {
+ key: "isOpera",
+ value: function isOpera() {
+ return !!UA.match(/Opera Mini/i);
+ }
+
+ /**
+ * Whether the device is Windows or not.
+ * @return {Boolean}
+ */
+
+ }, {
+ key: "isWindows",
+ value: function isWindows() {
+ return !!UA.match(/IEMobile/i);
+ }
+
+ /**
+ * Whether the device is Windows Phone or not.
+ * @return {Boolean}
+ */
+
+ }, {
+ key: "isWindowsPhone",
+ value: function isWindowsPhone() {
+ return !!UA.match(/Windows Phone/i);
+ }
+
+ /**
+ * Whether the device is any mobile device or not.
+ * @return {Boolean}
+ */
+
+ }, {
+ key: "isAny",
+ value: function isAny() {
+ return MobileDetector.isAndroid() || MobileDetector.isBlackBerry() || MobileDetector.isiOS() || MobileDetector.isOpera() || MobileDetector.isWindows() || MobileDetector.isWindowsPhone();
+ }
+ }]);
+
+ return MobileDetector;
+}();
+
+/* harmony default export */ __webpack_exports__["a"] = (MobileDetector);
+
+/***/ }),
+/* 4 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (immutable) */ __webpack_exports__["a"] = scrollTo;
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__easing__ = __webpack_require__(20);
+
+
+var SCROLLABLE_CONTAINER = document.getElementById('webslides');
+
+/**
+ * Smoothly scrolls to a given Y position using Easing.Swing. It'll run a
+ * callback upon finishing.
+ * @param {number} y Offset of the page to scroll to.
+ * @param {number} duration Duration of the animation. 500ms by default.
+ * @param {function} cb Callback function to call upon completion.
+ * @param {HTMLElement} container The HTML element where to scroll
+ */
+function scrollTo(y) {
+ var duration = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 500;
+ var cb = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function () {};
+ var container = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
+
+ SCROLLABLE_CONTAINER = container ? container : document.getElementById('webslides');
+
+ var delta = y - SCROLLABLE_CONTAINER.scrollTop;
+ var startLocation = SCROLLABLE_CONTAINER.scrollTop;
+ var increment = 16;
+
+ if (!duration) {
+ SCROLLABLE_CONTAINER.scrollTop = y;
+ cb();
+ return;
+ }
+
+ var animateScroll = function animateScroll(elapsedTime) {
+ elapsedTime += increment;
+ var percent = Math.min(1, elapsedTime / duration);
+ var easingP = __WEBPACK_IMPORTED_MODULE_0__easing__["a" /* default */].swing(percent, elapsedTime * percent, y, delta, duration);
+
+ SCROLLABLE_CONTAINER.scrollTop = Math.floor(startLocation + easingP * delta);
+
+ if (elapsedTime < duration) {
+ setTimeout(function () {
+ return animateScroll(elapsedTime);
+ }, increment);
+ } else {
+ cb();
+ }
+ };
+
+ animateScroll(0);
+}
+
+/***/ }),
+/* 5 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__modules_webslides__ = __webpack_require__(6);
+
+__webpack_require__(21);
+
+window.WebSlides = __WEBPACK_IMPORTED_MODULE_0__modules_webslides__["a" /* default */];
+
+/***/ }),
+/* 6 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__plugins_plugins__ = __webpack_require__(7);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__slide__ = __webpack_require__(1);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__utils_dom__ = __webpack_require__(0);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__utils_scroll_to__ = __webpack_require__(4);
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+
+
+
+
+
+var CLASSES = {
+ VERTICAL: 'vertical',
+ READY: 'ws-ready',
+ DISABLED: 'disabled'
+};
+
+// Default plugins
+var PLUGINS = {
+ 'autoslide': __WEBPACK_IMPORTED_MODULE_0__plugins_plugins__["a" /* default */].AutoSlide,
+ 'clickNav': __WEBPACK_IMPORTED_MODULE_0__plugins_plugins__["a" /* default */].ClickNav,
+ 'grid': __WEBPACK_IMPORTED_MODULE_0__plugins_plugins__["a" /* default */].Grid,
+ 'hash': __WEBPACK_IMPORTED_MODULE_0__plugins_plugins__["a" /* default */].Hash,
+ 'keyboard': __WEBPACK_IMPORTED_MODULE_0__plugins_plugins__["a" /* default */].Keyboard,
+ 'nav': __WEBPACK_IMPORTED_MODULE_0__plugins_plugins__["a" /* default */].Navigation,
+ 'scroll': __WEBPACK_IMPORTED_MODULE_0__plugins_plugins__["a" /* default */].Scroll,
+ 'touch': __WEBPACK_IMPORTED_MODULE_0__plugins_plugins__["a" /* default */].Touch,
+ 'video': __WEBPACK_IMPORTED_MODULE_0__plugins_plugins__["a" /* default */].Video,
+ 'youtube': __WEBPACK_IMPORTED_MODULE_0__plugins_plugins__["a" /* default */].YouTube,
+ 'zoom': __WEBPACK_IMPORTED_MODULE_0__plugins_plugins__["a" /* default */].Zoom
+};
+
+/**
+ * WebSlides module.
+ */
+
+var WebSlides = function () {
+ /**
+ * Options for WebSlides
+ * @param {number|boolean} autoslide If a number is provided, it will allow
+ * autosliding by said amount of milliseconds.
+ * @param {boolean} changeOnClick If true, it will allow
+ * clicking on any place to change the slide.
+ * @param {boolean} loop Whether to go to first slide from last one or not.
+ * @param {number} minWheelDelta Controls the amount of needed scroll to
+ * trigger navigation.
+ * @param {boolean} navigateOnScroll Whether scroll can trigger navigation or
+ * not.
+ * @param {number} scrollWait Controls the amount of time to wait till
+ * navigation can occur again with scroll.
+ * @param {number} slideOffset Controls the amount of needed touch delta to
+ * trigger navigation.
+ * @param {boolean} showIndex Controls if the index can be shown.
+ */
+ function WebSlides() {
+ var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
+ _ref$autoslide = _ref.autoslide,
+ autoslide = _ref$autoslide === undefined ? false : _ref$autoslide,
+ _ref$changeOnClick = _ref.changeOnClick,
+ changeOnClick = _ref$changeOnClick === undefined ? false : _ref$changeOnClick,
+ _ref$loop = _ref.loop,
+ loop = _ref$loop === undefined ? true : _ref$loop,
+ _ref$minWheelDelta = _ref.minWheelDelta,
+ minWheelDelta = _ref$minWheelDelta === undefined ? 40 : _ref$minWheelDelta,
+ _ref$navigateOnScroll = _ref.navigateOnScroll,
+ navigateOnScroll = _ref$navigateOnScroll === undefined ? true : _ref$navigateOnScroll,
+ _ref$scrollWait = _ref.scrollWait,
+ scrollWait = _ref$scrollWait === undefined ? 450 : _ref$scrollWait,
+ _ref$slideOffset = _ref.slideOffset,
+ slideOffset = _ref$slideOffset === undefined ? 50 : _ref$slideOffset,
+ _ref$showIndex = _ref.showIndex,
+ showIndex = _ref$showIndex === undefined ? true : _ref$showIndex;
+
+ _classCallCheck(this, WebSlides);
+
+ /**
+ * WebSlide element.
+ * @type {Element}
+ */
+ this.el = document.getElementById('webslides');
+
+ if (!this.el) {
+ throw new Error('Couldn\'t find the webslides container!');
+ }
+
+ /**
+ * Moving flag.
+ * @type {boolean}
+ */
+ this.isMoving = false;
+ /**
+ * Slide's array.
+ * @type {?Array}
+ */
+ this.slides = null;
+ /**
+ * Current slide's index.
+ * @type {number}
+ * @private
+ */
+ this.currentSlideI_ = -1;
+ /**
+ * Current slide reference.
+ * @type {?Slide}
+ * @private
+ */
+ this.currentSlide_ = null;
+ /**
+ * Max slide index.
+ * @type {number}
+ * @private
+ */
+ this.maxSlide_ = 0;
+ /**
+ * Whether the layout is going to be vertical or horizontal.
+ * @type {boolean}
+ */
+ this.isVertical = this.el.classList.contains(CLASSES.VERTICAL);
+ /**
+ * Plugin's dictionary.
+ * @type {Object}
+ */
+ this.plugins = {};
+ /**
+ * Options dictionary.
+ * @type {Object}
+ */
+ this.options = {
+ autoslide: autoslide,
+ changeOnClick: changeOnClick,
+ loop: loop,
+ minWheelDelta: minWheelDelta,
+ navigateOnScroll: navigateOnScroll,
+ scrollWait: scrollWait,
+ slideOffset: slideOffset,
+ showIndex: showIndex
+ };
+ /**
+ * Initialisation flag.
+ * @type {boolean}
+ */
+ this.initialised = false;
+
+ // Bootstrapping
+ this.removeChildren_();
+ this.grabSlides_();
+ this.createPlugins_();
+ this.initSlides_();
+ // Finished
+ this.onInit_();
+ }
+
+ /**
+ * Removes all children elements inside of the main container that are not
+ * eligible to be a Slide Element.
+ * @private
+ */
+
+
+ _createClass(WebSlides, [{
+ key: 'removeChildren_',
+ value: function removeChildren_() {
+ var nodes = this.el.childNodes;
+ var i = nodes.length;
+
+ while (i--) {
+ var node = nodes[i];
+
+ if (!__WEBPACK_IMPORTED_MODULE_1__slide__["b" /* default */].isCandidate(node)) {
+ this.el.removeChild(node);
+ }
+ }
+ }
+
+ /**
+ * Creates all the registered plugins and store the instances inside of the
+ * the webslide instance.
+ * @private
+ */
+
+ }, {
+ key: 'createPlugins_',
+ value: function createPlugins_() {
+ var _this = this;
+
+ Object.keys(PLUGINS).forEach(function (pluginName) {
+ var PluginCto = PLUGINS[pluginName];
+ _this.plugins[pluginName] = new PluginCto(_this);
+ });
+ }
+
+ /**
+ * Called once the WebSlide instance has finished initialising.
+ * @private
+ * @fires WebSlide#ws:init
+ */
+
+ }, {
+ key: 'onInit_',
+ value: function onInit_() {
+ this.initialised = true;
+ __WEBPACK_IMPORTED_MODULE_2__utils_dom__["a" /* default */].fireEvent(this.el, 'ws:init');
+ document.documentElement.classList.add(CLASSES.READY);
+ }
+
+ /**
+ * Grabs the slides from the DOM and creates all the Slides modules.
+ * @private
+ */
+
+ }, {
+ key: 'grabSlides_',
+ value: function grabSlides_() {
+ this.slides = __WEBPACK_IMPORTED_MODULE_2__utils_dom__["a" /* default */].toArray(this.el.childNodes).map(function (slide, i) {
+ return new __WEBPACK_IMPORTED_MODULE_1__slide__["b" /* default */](slide, i);
+ });
+
+ this.maxSlide_ = this.slides.length;
+ }
+
+ /**
+ * Goes to a given slide.
+ * @param {!number} slideI The slide index.
+ * @param {?boolean=} forward Whether we're forcing moving forward/backwards.
+ * This parameter is used only from the goNext, goPrev functions to adjust the
+ * scroll animations.
+ */
+
+ }, {
+ key: 'goToSlide',
+ value: function goToSlide(slideI) {
+ var forward = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
+
+ if (this.isValidIndexSlide_(slideI) && !this.isMoving && this.currentSlideI_ !== slideI) {
+ this.isMoving = true;
+ var isMovingForward = false;
+
+ if (forward !== null) {
+ isMovingForward = forward;
+ } else {
+ if (this.currentSlideI_ >= 0) {
+ isMovingForward = slideI > this.currentSlideI_;
+ }
+ }
+ var nextSlide = this.slides[slideI];
+
+ if (this.currentSlide_ !== null && this.isVertical && (!this.plugins.touch || !this.plugins.touch.isEnabled)) {
+ this.scrollTransitionToSlide_(isMovingForward, nextSlide, this.onSlideChange_);
+ } else {
+ this.transitionToSlide_(isMovingForward, nextSlide, this.onSlideChange_);
+ }
+ }
+ }
+
+ /**
+ * Transitions to a slide, doing the scroll animation.
+ * @param {boolean} isMovingForward Whether we're going forward or backwards.
+ * @param {Slide} nextSlide Next slide.
+ * @param {Function} callback Callback to be called upon finishing. This is an
+ * async function so it'll happen once the scroll animation finishes.
+ * @private
+ * @see scrollTo
+ */
+
+ }, {
+ key: 'scrollTransitionToSlide_',
+ value: function scrollTransitionToSlide_(isMovingForward, nextSlide, callback) {
+ var _this2 = this;
+
+ this.el.style.overflow = 'hidden';
+
+ if (!isMovingForward) {
+ nextSlide.moveBeforeFirst();
+ nextSlide.show();
+ Object(__WEBPACK_IMPORTED_MODULE_3__utils_scroll_to__["a" /* default */])(this.currentSlide_.el.offsetTop, 0);
+ } else {
+ nextSlide.show();
+ }
+
+ Object(__WEBPACK_IMPORTED_MODULE_3__utils_scroll_to__["a" /* default */])(nextSlide.el.offsetTop, 500, function () {
+ _this2.currentSlide_.hide();
+
+ if (isMovingForward) {
+ _this2.currentSlide_.moveAfterLast();
+ }
+
+ _this2.el.style.overflow = 'auto';
+ setTimeout(function () {
+ callback.call(_this2, nextSlide);
+ }, 150);
+ });
+ }
+
+ /**
+ * Transitions to a slide, without doing the scroll animation. If the page is
+ * already initialised and on mobile device, it will do a slide animation.
+ * @param {boolean} isMovingForward Whether we're going forward or backwards.
+ * @param {Slide} nextSlide Next slide.
+ * @param {Function} callback Callback to be called upon finishing. This is a
+ * sync function so it'll happen on run time.
+ * @private
+ */
+
+ }, {
+ key: 'transitionToSlide_',
+ value: function transitionToSlide_(isMovingForward, nextSlide, callback) {
+ var _this3 = this;
+
+ Object(__WEBPACK_IMPORTED_MODULE_3__utils_scroll_to__["a" /* default */])(0, 0);
+ var className = 'slideInRight';
+
+ if (!isMovingForward) {
+ nextSlide.moveBeforeFirst();
+ className = 'slideInLeft';
+ }
+
+ if (this.currentSlide_) {
+ if (isMovingForward) {
+ this.currentSlide_.moveAfterLast();
+ }
+
+ this.currentSlide_.hide();
+ }
+
+ nextSlide.show();
+
+ if (this.initialised && this.plugins.touch && this.plugins.touch.isEnabled) {
+ __WEBPACK_IMPORTED_MODULE_2__utils_dom__["a" /* default */].once(nextSlide.el, __WEBPACK_IMPORTED_MODULE_2__utils_dom__["a" /* default */].getAnimationEvent(), function () {
+ nextSlide.el.classList.remove(className);
+ callback.call(_this3, nextSlide);
+ });
+
+ nextSlide.el.classList.add(className);
+ } else {
+ callback.call(this, nextSlide);
+ }
+ }
+
+ /**
+ * Whenever a slide is changed, this function gets called. It updates the
+ * references to the current slide, disables the moving flag and fires
+ * a custom event.
+ * @param {Slide} slide The slide we're transitioning to.
+ * @fires WebSlide#ws:slide-change
+ * @private
+ */
+
+ }, {
+ key: 'onSlideChange_',
+ value: function onSlideChange_(slide) {
+ if (this.currentSlide_) {
+ this.currentSlide_.disable();
+ }
+
+ this.currentSlide_ = slide;
+ this.currentSlideI_ = slide.i;
+ this.currentSlide_.enable();
+ this.isMoving = false;
+
+ __WEBPACK_IMPORTED_MODULE_2__utils_dom__["a" /* default */].fireEvent(this.el, 'ws:slide-change', {
+ slides: this.maxSlide_,
+ currentSlide0: this.currentSlideI_,
+ currentSlide: this.currentSlideI_ + 1
+ });
+ }
+
+ /**
+ * Goes to the next slide.
+ */
+
+ }, {
+ key: 'goNext',
+ value: function goNext() {
+ var nextIndex = this.currentSlideI_ + 1;
+
+ if (nextIndex >= this.maxSlide_) {
+ if (!this.options.loop) {
+ return;
+ }
+
+ nextIndex = 0;
+ }
+
+ this.goToSlide(nextIndex, true);
+ }
+
+ /**
+ * Goes to the previous slide.
+ */
+
+ }, {
+ key: 'goPrev',
+ value: function goPrev() {
+ var prevIndex = this.currentSlideI_ - 1;
+
+ if (prevIndex < 0) {
+ if (!this.options.loop) {
+ return;
+ }
+
+ prevIndex = this.maxSlide_ - 1;
+ }
+
+ this.goToSlide(prevIndex, false);
+ }
+
+ /**
+ * Check if the given number is a valid index to go to.
+ * @param {number} i The index to check.
+ * @return {boolean} Whether you can move to that slide or not.
+ * @private
+ */
+
+ }, {
+ key: 'isValidIndexSlide_',
+ value: function isValidIndexSlide_(i) {
+ return typeof i === 'number' && i >= 0 && i < this.maxSlide_;
+ }
+
+ /**
+ * Init the shown slide on load. It'll fetch it from the Hash if present
+ * and, otherwise, it'll default to the first one.
+ * @private
+ * @see Hash.getSlideNumber
+ */
+
+ }, {
+ key: 'initSlides_',
+ value: function initSlides_() {
+ var slideNumber = this.plugins.hash.constructor.getSlideNumber();
+
+ // Not valid
+ if (slideNumber === null || slideNumber >= this.maxSlide_) {
+ slideNumber = 0;
+ }
+
+ // Keeping the order
+ if (slideNumber !== 0) {
+ var i = 0;
+
+ while (i < slideNumber) {
+ this.slides[i].moveAfterLast();
+ i++;
+ }
+ }
+
+ this.goToSlide(slideNumber);
+ }
+
+ /**
+ * Toggles zoom
+ */
+
+ }, {
+ key: 'toggleZoom',
+ value: function toggleZoom() {
+ if (this.options.showIndex) {
+ this.plugins.zoom.toggleZoom();
+ }
+ }
+
+ /**
+ * Disables the webslides element adding a class "disabled"
+ */
+
+ }, {
+ key: 'disable',
+ value: function disable() {
+ this.el.classList.add(CLASSES.DISABLED);
+
+ if (this.plugins.autoslide && this.plugins.autoslide.time !== false) {
+ this.plugins.autoslide.stop();
+ }
+ }
+
+ /**
+ * Enables the webslides element removing a class "disabled"
+ */
+
+ }, {
+ key: 'enable',
+ value: function enable() {
+ this.el.classList.remove(CLASSES.DISABLED);
+
+ if (this.plugins.autoslide && this.plugins.autoslide.time !== false) {
+ this.plugins.autoslide.play();
+ }
+ }
+
+ /**
+ * Checks if it is disabled
+ * @return {boolean}
+ */
+
+ }, {
+ key: 'isDisabled',
+ value: function isDisabled() {
+ return this.el.classList.contains(CLASSES.DISABLED);
+ }
+
+ /**
+ * Puts the browser into fullscreen
+ */
+
+ }, {
+ key: 'fullscreen',
+ value: function fullscreen() {
+ var el = document.documentElement;
+ var isFullscreen = document.fullscreen || document.webkitIsFullScreen || document.mozFullScreen || document.msFullScreenElement;
+
+ if (!isFullscreen) {
+ /* istanbul ignore next hard to test prefixes */
+ var requestFullscreen = el.requestFullscreen || el.webkitRequestFullScreen || el.mozRequestFullScreen || el.msRequestFullscreen;
+ requestFullscreen.call(el);
+ } else {
+ /* istanbul ignore next hard to test prefixes */
+ var cancelFullscreen = document.exitFullScreen || document.webkitCancelFullScreen || document.mozCancelFullScreen || document.msExitFullscreen;
+
+ cancelFullscreen.call(document);
+ }
+ }
+
+ /**
+ * Registers a plugin to be loaded when the instance is created. It allows
+ * (on purpose) to replace default plugins.
+ * @param {!string} key They key under which it'll be stored inside of the
+ * instance, inside the plugins dict.
+ * @param {!Function} cto Plugin constructor.
+ */
+
+ }], [{
+ key: 'registerPlugin',
+ value: function registerPlugin(key, cto) {
+ PLUGINS[key] = cto;
+ }
+ }]);
+
+ return WebSlides;
+}();
+
+/* harmony default export */ __webpack_exports__["a"] = (WebSlides);
+
+/***/ }),
+/* 7 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__autoslide__ = __webpack_require__(8);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__click_nav__ = __webpack_require__(10);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__grid__ = __webpack_require__(11);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__hash__ = __webpack_require__(12);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__keyboard__ = __webpack_require__(13);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__navigation__ = __webpack_require__(14);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__scroll__ = __webpack_require__(15);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__touch__ = __webpack_require__(16);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__video__ = __webpack_require__(17);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__youtube__ = __webpack_require__(18);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__zoom__ = __webpack_require__(19);
+
+
+
+
+
+
+
+
+
+
+
+
+/* harmony default export */ __webpack_exports__["a"] = ({
+ AutoSlide: __WEBPACK_IMPORTED_MODULE_0__autoslide__["a" /* default */],
+ ClickNav: __WEBPACK_IMPORTED_MODULE_1__click_nav__["a" /* default */],
+ Grid: __WEBPACK_IMPORTED_MODULE_2__grid__["a" /* default */],
+ Hash: __WEBPACK_IMPORTED_MODULE_3__hash__["a" /* default */],
+ Keyboard: __WEBPACK_IMPORTED_MODULE_4__keyboard__["a" /* default */],
+ Navigation: __WEBPACK_IMPORTED_MODULE_5__navigation__["a" /* default */],
+ Scroll: __WEBPACK_IMPORTED_MODULE_6__scroll__["a" /* default */],
+ Touch: __WEBPACK_IMPORTED_MODULE_7__touch__["a" /* default */],
+ Video: __WEBPACK_IMPORTED_MODULE_8__video__["a" /* default */],
+ YouTube: __WEBPACK_IMPORTED_MODULE_9__youtube__["a" /* default */],
+ Zoom: __WEBPACK_IMPORTED_MODULE_10__zoom__["a" /* default */]
+});
+
+/***/ }),
+/* 8 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__utils_dom__ = __webpack_require__(0);
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+
+
+/**
+ * Autoslide plugin.
+ */
+
+var AutoSlide = function () {
+ /**
+ * @param {WebSlides} wsInstance The WebSlides instance
+ * @constructor
+ */
+ function AutoSlide(wsInstance) {
+ _classCallCheck(this, AutoSlide);
+
+ /**
+ * @type {WebSlides}
+ * @private
+ */
+ this.ws_ = wsInstance;
+ /**
+ * Interval ID reference for the autoslide.
+ * @type {?number}
+ * @private
+ */
+ this.interval_ = null;
+ /**
+ * Internal stored time.
+ * @type {?number}
+ */
+ this.time = this.ws_.options.autoslide;
+
+ if (this.time) {
+ __WEBPACK_IMPORTED_MODULE_0__utils_dom__["a" /* default */].once(wsInstance.el, 'ws:init', this.play.bind(this));
+ document.body.addEventListener('focus', this.onFocus.bind(this));
+ }
+ }
+
+ /**
+ * On focus handler. Will decide if stops/play depending on the focused
+ * element if autoslide is active.
+ */
+
+
+ _createClass(AutoSlide, [{
+ key: 'onFocus',
+ value: function onFocus() {
+ if (__WEBPACK_IMPORTED_MODULE_0__utils_dom__["a" /* default */].isFocusableElement()) {
+ this.stop();
+ } else if (this.interval_ === null) {
+ this.play();
+ }
+ }
+
+ /**
+ * Starts autosliding all the slides if it's not currently doing it and the
+ * autoslide option was a number greater than 0.
+ * @param {?number=} time Amount of milliseconds to wait to go to next slide
+ * automatically.
+ */
+
+ }, {
+ key: 'play',
+ value: function play(time) {
+ if (typeof time !== 'number') {
+ time = this.time;
+ }
+
+ this.time = time;
+
+ if (!this.interval_ && typeof time === 'number' && time > 0) {
+ this.interval_ = setInterval(this.ws_.goNext.bind(this.ws_), time);
+ }
+ }
+
+ /**
+ * Stops autosliding all the slides.
+ */
+
+ }, {
+ key: 'stop',
+ value: function stop() {
+ if (this.interval_) {
+ clearInterval(this.interval_);
+ this.interval_ = null;
+ }
+ }
+ }]);
+
+ return AutoSlide;
+}();
+
+/* harmony default export */ __webpack_exports__["a"] = (AutoSlide);
+
+/***/ }),
+/* 9 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+var NativeCustomEvent = window.CustomEvent;
+
+/**
+ * Check for the usage of native support for CustomEvents which is lacking
+ * completely on IE.
+ * @return {boolean} Whether it can be used or not.
+ */
+function canIuseNativeCustom() {
+ try {
+ var p = new NativeCustomEvent('t', {
+ detail: {
+ a: 'b'
+ }
+ });
+ return 't' === p.type && 'b' === p.detail.a;
+ } catch (e) {}
+
+ /* istanbul ignore next: hard to reproduce on test environment */
+ return false;
+}
+
+/**
+ * Lousy polyfill for the Custom Event constructor for IE.
+ * @param {!string} type The type of the event.
+ * @param {?Object} params Additional information for the event.
+ * @return {Event}
+ * @constructor
+ */
+/* istanbul ignore next: hard to reproduce on test environment */
+var IECustomEvent = function CustomEvent(type, params) {
+ var e = document.createEvent('CustomEvent');
+
+ if (params) {
+ e.initCustomEvent(type, params.bubbles, params.cancelable, params.detail);
+ } else {
+ e.initCustomEvent(type, false, false, undefined);
+ }
+
+ return e;
+};
+
+/* istanbul ignore next: hard to reproduce on test environment */
+var WSCustomEvent = canIuseNativeCustom() ? NativeCustomEvent : IECustomEvent;
+
+/* harmony default export */ __webpack_exports__["a"] = (WSCustomEvent);
+
+/***/ }),
+/* 10 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+var CLICKABLE_ELS = ['INPUT', 'SELECT', 'OPTION', 'BUTTON', 'A', 'TEXTAREA'];
+
+/**
+ * ClickNav plugin that allows to click on the page to get to the next slide.
+ */
+
+var ClickNav = function () {
+ /**
+ * @param {WebSlides} wsInstance The WebSlides instance
+ * @constructor
+ */
+ function ClickNav(wsInstance) {
+ _classCallCheck(this, ClickNav);
+
+ /**
+ * @type {WebSlides}
+ * @private
+ */
+ this.ws_ = wsInstance;
+
+ if (wsInstance.options.changeOnClick) {
+ this.ws_.el.addEventListener('click', this.onClick_.bind(this));
+ }
+ }
+
+ /**
+ * Reacts to the click event. It will go to the next slide unless the element
+ * has a data-prevent-nav attribute or is on the list of CLICKABLE_ELS.
+ * @param {MouseEvent} event The click event.
+ * @private
+ */
+
+
+ _createClass(ClickNav, [{
+ key: 'onClick_',
+ value: function onClick_(event) {
+ if (CLICKABLE_ELS.indexOf(event.target.tagName) < 0 && typeof event.target.dataset.preventNav === 'undefined') {
+ this.ws_.goNext();
+ }
+ }
+ }]);
+
+ return ClickNav;
+}();
+
+/* harmony default export */ __webpack_exports__["a"] = (ClickNav);
+
+/***/ }),
+/* 11 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__utils_keys__ = __webpack_require__(2);
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+
+
+var GRID_IMAGE = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYAg' + 'MAAACdGdVrAAAACVBMVEUAAAAtXsUtXcPDDPUWAAAAA3RSTlMAZmHzZFkxAAAAFklEQVQI12M' + 'AA9bBR3ExhAJB1iooBQBGwgVEs/QtuAAAAABJRU5ErkJggg==';
+
+/**
+ * Grid plugin that shows a grid on top of the WebSlides for easy prototyping.
+ */
+
+var Grid = function () {
+ /**
+ * @param {WebSlides} wsInstance The WebSlides instance
+ * @constructor
+ */
+ function Grid(wsInstance) {
+ _classCallCheck(this, Grid);
+
+ /**
+ * @type {WebSlides}
+ * @private
+ */
+ this.ws_ = wsInstance;
+
+ var CSS = 'body.baseline {\n background: url(' + GRID_IMAGE + ') left top .8rem/.8rem;\n }';
+ var head = document.head || document.getElementsByTagName('head')[0];
+ var style = document.createElement('style');
+
+ style.type = 'text/css';
+
+ if (style.styleSheet) {
+ style.styleSheet.cssText = CSS;
+ } else {
+ style.appendChild(document.createTextNode(CSS));
+ }
+
+ head.appendChild(style);
+
+ document.addEventListener('keydown', this.onKeyPress_.bind(this), false);
+ }
+
+ /**
+ * Reacts to the keydown event. It reacts to ENTER key to toggle the class.
+ * @param {KeyboardEvent} event The key event.
+ * @private
+ */
+
+
+ _createClass(Grid, [{
+ key: 'onKeyPress_',
+ value: function onKeyPress_(event) {
+ if (event.which === __WEBPACK_IMPORTED_MODULE_0__utils_keys__["a" /* default */].ENTER) {
+ document.body.classList.toggle('baseline');
+ }
+ }
+ }]);
+
+ return Grid;
+}();
+
+/* harmony default export */ __webpack_exports__["a"] = (Grid);
+
+/***/ }),
+/* 12 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+var HASH = '#slide';
+var slideRegex = /#slide=(\d+)/;
+
+/**
+ * Static class with methods to manipulate and extract info from the hash of
+ * the URL.
+ */
+
+var Hash = function () {
+ /**
+ * @param {WebSlides} wsInstance
+ * @constructor
+ */
+ function Hash(wsInstance) {
+ _classCallCheck(this, Hash);
+
+ this.ws_ = wsInstance;
+
+ wsInstance.el.addEventListener('ws:slide-change', Hash.onSlideChange_);
+ window.addEventListener('hashchange', this.onHashChange_.bind(this), false);
+ }
+
+ /**
+ * hashchange event handler, makes the WebSlide instance navigate to the
+ * needed slide.
+ */
+
+
+ _createClass(Hash, [{
+ key: 'onHashChange_',
+ value: function onHashChange_() {
+ var newSlideIndex = Hash.getSlideNumber();
+
+ if (newSlideIndex !== null) {
+ this.ws_.goToSlide(newSlideIndex);
+ }
+ }
+
+ /**
+ * Handler for the slide change event which updates the slide on the hash.
+ * @param {Event} event
+ * @private
+ */
+
+ }], [{
+ key: 'onSlideChange_',
+ value: function onSlideChange_(event) {
+ Hash.setSlideNumber(event.detail.currentSlide);
+ }
+
+ /**
+ * Gets the slide number from the hash by a regex matching `#slide=` and gets
+ * the number after it. If the number is invalid or less than 0, it will
+ * return null as an invalid value.
+ * @return {?number}
+ */
+
+ }, {
+ key: 'getSlideNumber',
+ value: function getSlideNumber() {
+ var results = document.location.hash.match(slideRegex);
+ var slide = 0;
+
+ if (Array.isArray(results)) {
+ slide = parseInt(results[1], 10);
+ }
+
+ if (typeof slide !== 'number' || slide < 0 || !Array.isArray(results)) {
+ slide = null;
+ } else {
+ slide--; // Convert to 0 index
+ }
+
+ return slide;
+ }
+
+ /**
+ * It will update the hash (if it's different) so it reflects the slide
+ * number being visible.
+ * @param {number} number The number of the slide we're transitioning to.
+ */
+
+ }, {
+ key: 'setSlideNumber',
+ value: function setSlideNumber(number) {
+ if (Hash.getSlideNumber() !== number - 1) {
+ history.pushState({
+ slideI: number - 1
+ }, 'Slide ' + number, HASH + '=' + number);
+ }
+ }
+ }]);
+
+ return Hash;
+}();
+
+/* harmony default export */ __webpack_exports__["a"] = (Hash);
+
+/***/ }),
+/* 13 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__utils_keys__ = __webpack_require__(2);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__utils_dom__ = __webpack_require__(0);
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+
+
+
+/**
+ * Keyboard interaction plugin.
+ */
+
+var Keyboard = function () {
+ /**
+ * @param {WebSlides} wsInstance The WebSlides instance
+ * @constructor
+ */
+ function Keyboard(wsInstance) {
+ _classCallCheck(this, Keyboard);
+
+ /**
+ * @type {WebSlides}
+ * @private
+ */
+ this.ws_ = wsInstance;
+
+ document.addEventListener('keydown', this.onKeyPress_.bind(this), false);
+ }
+
+ /**
+ * Reacts to the keydown event. It reacts to the arrows and space key
+ * depending on the layout of the page.
+ * @param {KeyboardEvent} event The key event.
+ * @private
+ */
+
+
+ _createClass(Keyboard, [{
+ key: 'onKeyPress_',
+ value: function onKeyPress_(event) {
+ var method = void 0;
+ var argument = void 0;
+
+ if (__WEBPACK_IMPORTED_MODULE_1__utils_dom__["a" /* default */].isFocusableElement() || this.ws_.isDisabled()) {
+ return;
+ }
+
+ switch (event.which) {
+ case __WEBPACK_IMPORTED_MODULE_0__utils_keys__["a" /* default */].AV_PAGE:
+ method = this.ws_.goNext;
+ break;
+ case __WEBPACK_IMPORTED_MODULE_0__utils_keys__["a" /* default */].SPACE:
+ if (event.shiftKey) {
+ method = this.ws_.goPrev;
+ } else {
+ method = this.ws_.goNext;
+ }
+ break;
+ case __WEBPACK_IMPORTED_MODULE_0__utils_keys__["a" /* default */].RE_PAGE:
+ method = this.ws_.goPrev;
+ break;
+ case __WEBPACK_IMPORTED_MODULE_0__utils_keys__["a" /* default */].HOME:
+ method = this.ws_.goToSlide;
+ argument = 0;
+ break;
+ case __WEBPACK_IMPORTED_MODULE_0__utils_keys__["a" /* default */].END:
+ method = this.ws_.goToSlide;
+ argument = this.ws_.maxSlide_ - 1;
+ break;
+ case __WEBPACK_IMPORTED_MODULE_0__utils_keys__["a" /* default */].DOWN:
+ method = this.ws_.isVertical ? this.ws_.goNext : null;
+ break;
+ case __WEBPACK_IMPORTED_MODULE_0__utils_keys__["a" /* default */].UP:
+ method = this.ws_.isVertical ? this.ws_.goPrev : null;
+ break;
+ case __WEBPACK_IMPORTED_MODULE_0__utils_keys__["a" /* default */].LEFT:
+ method = !this.ws_.isVertical ? this.ws_.goPrev : null;
+ break;
+ case __WEBPACK_IMPORTED_MODULE_0__utils_keys__["a" /* default */].RIGHT:
+ method = !this.ws_.isVertical ? this.ws_.goNext : null;
+ break;
+ case __WEBPACK_IMPORTED_MODULE_0__utils_keys__["a" /* default */].F:
+ if (!event.metaKey && !event.ctrlKey) {
+ method = this.ws_.fullscreen;
+ }
+
+ break;
+ }
+
+ if (method) {
+ method.call(this.ws_, argument);
+ // Prevents Firefox key events.
+ event.preventDefault();
+ }
+ }
+ }]);
+
+ return Keyboard;
+}();
+
+/* harmony default export */ __webpack_exports__["a"] = (Keyboard);
+
+/***/ }),
+/* 14 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__utils_dom__ = __webpack_require__(0);
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+
+
+var ELEMENT_ID = {
+ NAV: 'navigation',
+ NEXT: 'next',
+ PREV: 'previous',
+ COUNTER: 'counter'
+};
+
+var LABELS = {
+ VERTICAL: {
+ NEXT: '↓',
+ PREV: '↑'
+ },
+ HORIZONTAL: {
+ NEXT: '→',
+ PREV: '←'
+ }
+};
+
+/**
+ * Navigation plugin.
+ */
+
+var Navigation = function () {
+ /**
+ * @param {WebSlides} wsInstance The WebSlides instance
+ * @constructor
+ */
+ function Navigation(wsInstance) {
+ _classCallCheck(this, Navigation);
+
+ var arrowLabels = wsInstance.isVertical ? LABELS.VERTICAL : LABELS.HORIZONTAL;
+ /**
+ * Navigation element.
+ * @type {Element}
+ */
+ this.el = __WEBPACK_IMPORTED_MODULE_0__utils_dom__["a" /* default */].createNode('div', 'navigation');
+ /**
+ * Next button.
+ * @type {Element}
+ */
+ this.next = Navigation.createArrow(ELEMENT_ID.NEXT, arrowLabels.NEXT);
+ /**
+ * Prev button.
+ * @type {Element}
+ */
+ this.prev = Navigation.createArrow(ELEMENT_ID.PREV, arrowLabels.PREV);
+ /**
+ * Counter Element.
+ * @type {Element}
+ */
+ this.counter = Navigation.createCounter(ELEMENT_ID.COUNTER, wsInstance);
+ /**
+ * @type {WebSlides}
+ * @private
+ */
+ this.ws_ = wsInstance;
+
+ this.el.appendChild(this.next);
+ this.el.appendChild(this.prev);
+ this.el.appendChild(this.counter);
+
+ this.ws_.el.appendChild(this.el);
+ this.bindEvents_();
+ }
+
+ /**
+ * Bind all events for the navigation.
+ * @private
+ */
+
+
+ _createClass(Navigation, [{
+ key: 'bindEvents_',
+ value: function bindEvents_() {
+ this.ws_.el.addEventListener('ws:slide-change', this.onSlideChanged_.bind(this));
+ this.next.addEventListener('click', this.onButtonClicked_.bind(this));
+ this.prev.addEventListener('click', this.onButtonClicked_.bind(this));
+ this.counter.addEventListener('click', this.onButtonClicked_.bind(this));
+ }
+
+ /**
+ * Updates the counter inside the navigation.
+ * @param {string|number} current Current slide number.
+ * @param {string|number} max Max slide number.
+ */
+
+ }, {
+ key: 'updateCounter',
+ value: function updateCounter(current, max) {
+ if (this.ws_.options.showIndex) {
+ this.counter.childNodes[0].textContent = current + ' / ' + max;
+ } else {
+ this.counter.textContent = current + ' / ' + max;
+ }
+ }
+
+ /**
+ * Creates an arrow to navigate.
+ * @param {!String} id Desired ID for the arrow.
+ * @param {!String} text Desired text for the arrow.
+ * @return {Element} The arrow element.
+ */
+
+ }, {
+ key: 'onSlideChanged_',
+
+
+ /**
+ * Slide Change event handler. Will update the text on the navigation.
+ * @param {CustomEvent} event
+ * @private
+ */
+ value: function onSlideChanged_(event) {
+ this.updateCounter(event.detail.currentSlide, event.detail.slides);
+ }
+
+ /**
+ * Handles clicks on the next/prev buttons.
+ * @param {MouseEvent} event
+ * @private
+ */
+
+ }, {
+ key: 'onButtonClicked_',
+ value: function onButtonClicked_(event) {
+ event.preventDefault();
+ if (event.target === this.next) {
+ this.ws_.goNext();
+ } else if (event.target === this.prev) {
+ this.ws_.goPrev();
+ } else {
+ this.ws_.toggleZoom();
+ }
+ }
+ }], [{
+ key: 'createArrow',
+ value: function createArrow(id, text) {
+ var arrow = __WEBPACK_IMPORTED_MODULE_0__utils_dom__["a" /* default */].createNode('a', id, text);
+ arrow.href = '#';
+ arrow.title = 'Arrow Keys';
+
+ return arrow;
+ }
+
+ /**
+ * Creates the navigation counter.
+ * @param {!String} id Desired ID for the counter.
+ * @param {WebSlides} ws_ WebSlides object.
+ * @return {Element} The arrow element.
+ */
+
+ }, {
+ key: 'createCounter',
+ value: function createCounter(id, ws_) {
+ var counter = __WEBPACK_IMPORTED_MODULE_0__utils_dom__["a" /* default */].createNode('span', id);
+ if (ws_.options.showIndex) {
+ var link = document.createElement('a');
+ link.href = '#';
+ link.title = 'View all slides';
+ counter.appendChild(link);
+ }
+
+ return counter;
+ }
+ }]);
+
+ return Navigation;
+}();
+
+/* harmony default export */ __webpack_exports__["a"] = (Navigation);
+
+/***/ }),
+/* 15 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__utils_mobile_detector__ = __webpack_require__(3);
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+
+
+/**
+ * Scroll plugin.
+ */
+
+var Scroll = function () {
+ /**
+ * @param {WebSlides} wsInstance The WebSlides instance
+ * @constructor
+ */
+ function Scroll(wsInstance) {
+ _classCallCheck(this, Scroll);
+
+ /**
+ * @type {WebSlides}
+ * @private
+ */
+ this.ws_ = wsInstance;
+ /**
+ * Where the scroll is going to happen. The WebSlides element.
+ * @type {Element}
+ * @private
+ */
+ this.scrollContainer_ = wsInstance.el;
+ /**
+ * Whether movement is happening up or down.
+ * @type {boolean}
+ * @private
+ */
+ this.isGoingUp_ = false;
+ /**
+ * Whether movement is happening left or right.
+ * @type {boolean}
+ * @private
+ */
+ this.isGoingLeft_ = false;
+ /**
+ * Timeout id holder.
+ * @type {?number}
+ * @private
+ */
+ this.timeout_ = null;
+
+ // Disabling from option
+ if (!this.ws_.options.navigateOnScroll) {
+ return;
+ }
+
+ if (!__WEBPACK_IMPORTED_MODULE_0__utils_mobile_detector__["a" /* default */].isAny()) {
+ this.scrollContainer_.addEventListener('wheel', this.onMouseWheel_.bind(this));
+
+ if (!wsInstance.isVertical) {
+ wsInstance.el.addEventListener('ws:slide-change', this.onSlideChange_.bind(this));
+ }
+ }
+ }
+
+ /**
+ * When the slides change, set an inner timeout to avoid prematurely
+ * changing to the next slide again.
+ * @private
+ */
+
+
+ _createClass(Scroll, [{
+ key: 'onSlideChange_',
+ value: function onSlideChange_() {
+ var _this = this;
+
+ this.timeout_ = setTimeout(function () {
+ _this.timeout_ = null;
+ }, this.ws_.options.scrollWait);
+ }
+
+ /**
+ * Reacts to the wheel event. Detects whether is going up or down and decides
+ * if it needs to move the slide based on the amount of delta.
+ * @param {WheelEvent} event The Wheel Event.
+ * @private
+ */
+
+ }, {
+ key: 'onMouseWheel_',
+ value: function onMouseWheel_(event) {
+ if (this.ws_.isDisabled()) {
+ return;
+ }
+
+ if (this.ws_.isMoving || this.timeout_) {
+ event.preventDefault();
+ return;
+ }
+
+ // Firefox uses lines instead of pixels for delta
+ var linesToPx = event.deltaMode * this.ws_.options.minWheelDelta;
+ var wheelDeltaY = event.deltaY,
+ wheelDeltaX = event.deltaX;
+
+ var isVertical = this.ws_.isVertical;
+ var isHorizontalMovement = Math.abs(wheelDeltaX) > Math.abs(wheelDeltaY);
+ this.isGoingUp_ = wheelDeltaY < 0;
+ this.isGoingLeft_ = wheelDeltaX < 0;
+
+ // If we're mainly moving horizontally, prevent default
+ if (isHorizontalMovement) {
+ if (!isVertical) {
+ event.preventDefault();
+ } else {
+ // If we're moving horizontally but this is vertical, return to avoid
+ // unwanted navigation.
+ return;
+ }
+ }
+
+ if (Math.abs(wheelDeltaY + linesToPx) >= this.ws_.options.minWheelDelta || Math.abs(wheelDeltaX + linesToPx) >= this.ws_.options.minWheelDelta) {
+ if (isHorizontalMovement && this.isGoingLeft_ || !isHorizontalMovement && this.isGoingUp_) {
+ this.ws_.goPrev();
+ } else {
+ this.ws_.goNext();
+ }
+
+ event.preventDefault();
+ }
+ }
+ }]);
+
+ return Scroll;
+}();
+
+/* harmony default export */ __webpack_exports__["a"] = (Scroll);
+
+/***/ }),
+/* 16 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__utils_mobile_detector__ = __webpack_require__(3);
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+
+
+var EVENTS = {
+ touch: {
+ START: 'touchstart',
+ MOVE: 'touchmove',
+ END: 'touchend'
+ },
+ pointer: {
+ START: 'pointerdown',
+ MOVE: 'pointermove',
+ END: 'pointerup'
+ }
+};
+
+/**
+ * Touch plugin.
+ */
+
+var Touch = function () {
+ /**
+ * @param {WebSlides} wsInstance The WebSlides instance
+ * @constructor
+ */
+ function Touch(wsInstance) {
+ _classCallCheck(this, Touch);
+
+ /**
+ * @type {WebSlides}
+ * @private
+ */
+ this.ws_ = wsInstance;
+
+ /**
+ * Start position for the X coordinate.
+ * @type {number}
+ * @private
+ */
+ this.startX_ = 0;
+
+ /**
+ * Start position for the Y coordinate.
+ * @type {number}
+ * @private
+ */
+ this.startY_ = 0;
+
+ /**
+ * Start position for the X coord.
+ * @type {number}
+ * @private
+ */
+ this.endX_ = 0;
+
+ /**
+ * Start position for the Y coord.
+ * @type {number}
+ * @private
+ */
+ this.endY_ = 0;
+
+ /**
+ * Whether is enabled or not. Only enabled for touch devices.
+ * @type {boolean}
+ * @private
+ */
+ this.isEnabled = false;
+
+ /**
+ * Whether is a gesture or not.
+ * @type {boolean}
+ * @private
+ */
+ this.isGesture = false;
+
+ /**
+ * Stores start touch event (x, y).
+ * @type {array}
+ * @private
+ */
+ this.startTouches = [];
+
+ /**
+ * Stores end touch event (x, y).
+ * @type {array}
+ * @private
+ */
+ this.endTouches = [];
+
+ var events = void 0;
+
+ if (__WEBPACK_IMPORTED_MODULE_0__utils_mobile_detector__["a" /* default */].isAny()) {
+ // Likely IE
+ if (window.PointerEvent && (__WEBPACK_IMPORTED_MODULE_0__utils_mobile_detector__["a" /* default */].isWindows() || __WEBPACK_IMPORTED_MODULE_0__utils_mobile_detector__["a" /* default */].isWindowsPhone())) {
+ events = EVENTS.pointer;
+ } else {
+ events = EVENTS.touch;
+ }
+
+ this.isEnabled = true;
+ document.addEventListener(events.START, this.onStart_.bind(this), false);
+ document.addEventListener(events.MOVE, this.onMove_.bind(this), false);
+ document.addEventListener(events.END, this.onStop_.bind(this), false);
+ }
+ }
+
+ /**
+ * Start touch handler. Saves starting points.
+ * @param {Event} event The Touch event.
+ * @private
+ */
+
+
+ _createClass(Touch, [{
+ key: 'onStart_',
+ value: function onStart_(event) {
+ if (this.ws_.isDisabled()) {
+ return;
+ }
+
+ var info = Touch.normalizeEventInfo(event);
+
+ if (event.touches.length === 1) {
+ this.startX_ = info.x;
+ this.startY_ = info.y;
+ this.endX_ = info.x;
+ this.endY_ = info.y;
+ } else if (event.touches.length > 1) {
+ this.startTouches = Touch.getTouchCoordinates(event);
+ this.endTouches = this.startTouches;
+ this.isGesture = true;
+ }
+ }
+
+ /**
+ * Move touch handler. Saves end points.
+ * @param {Event} event The Touch event.
+ * @private
+ */
+
+ }, {
+ key: 'onMove_',
+ value: function onMove_(event) {
+ if (this.ws_.isDisabled()) {
+ return;
+ }
+
+ var info = Touch.normalizeEventInfo(event);
+
+ if (this.isGesture) {
+ this.endTouches = Touch.getTouchCoordinates(event);
+ } else {
+ this.endX_ = info.x;
+ this.endY_ = info.y;
+ }
+ }
+
+ /**
+ * Stop touch handler. Checks if it needs to make any actions.
+ * @private
+ */
+
+ }, {
+ key: 'onStop_',
+ value: function onStop_() {
+ if (this.ws_.isDisabled()) {
+ return;
+ }
+
+ if (this.isGesture) {
+ var startDistance = Math.sqrt(Math.pow(this.startTouches[0].x - this.startTouches[1].x, 2) + Math.pow(this.startTouches[0].y - this.startTouches[1].y, 2));
+ var endDistance = Math.sqrt(Math.pow(this.endTouches[0].x - this.endTouches[1].x, 2) + Math.pow(this.endTouches[0].y - this.endTouches[1].y, 2));
+ if (startDistance > endDistance) {
+ // Pinch gesture
+ this.ws_.toggleZoom();
+ }
+ this.isGesture = false;
+ } else {
+ var diffX = this.startX_ - this.endX_;
+ var diffY = this.startY_ - this.endY_;
+
+ // It's an horizontal drag
+ if (Math.abs(diffX) > Math.abs(diffY)) {
+ if (diffX < -this.ws_.options.slideOffset) {
+ this.ws_.goPrev();
+ } else if (diffX > this.ws_.options.slideOffset) {
+ this.ws_.goNext();
+ }
+ }
+ }
+ }
+
+ /**
+ * Get X,Y coordinates from touch pointers.
+ * @param {Event} event
+ * @return {Object}
+ */
+
+ }], [{
+ key: 'getTouchCoordinates',
+ value: function getTouchCoordinates(event) {
+ return [{
+ x: event.touches[0].clientX,
+ y: event.touches[0].clientY
+ }, {
+ x: event.touches[1].clientX,
+ y: event.touches[1].clientY
+ }];
+ }
+
+ /**
+ * Normalizes an event to deal with differences between PointerEvent and
+ * TouchEvent.
+ * @param {Event} event
+ * @return {Object} Normalised touch points.
+ */
+
+ }, {
+ key: 'normalizeEventInfo',
+ value: function normalizeEventInfo(event) {
+ var touchEvent = { pageX: 0, pageY: 0 };
+
+ if (typeof event.changedTouches !== 'undefined') {
+ touchEvent = event.changedTouches[0];
+ } else if (typeof event.originalEvent !== 'undefined' && typeof event.originalEvent.changedTouches !== 'undefined') {
+ touchEvent = event.originalEvent.changedTouches[0];
+ }
+
+ var x = event.offsetX || event.layerX || touchEvent.pageX;
+ var y = event.offsetY || event.layerY || touchEvent.pageY;
+
+ return { x: x, y: y };
+ }
+ }]);
+
+ return Touch;
+}();
+
+/* harmony default export */ __webpack_exports__["a"] = (Touch);
+
+/***/ }),
+/* 17 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__utils_dom__ = __webpack_require__(0);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__modules_slide__ = __webpack_require__(1);
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+
+
+
+/**
+ * Video plugin. Video plugin that allows to autoplay videos once the slide gets
+ * active.
+ */
+
+var Video = function () {
+ /**
+ * @param {WebSlides} wsInstance The WebSlides instance.
+ * @constructor
+ */
+ function Video(wsInstance) {
+ _classCallCheck(this, Video);
+
+ /**
+ * @type {WebSlides}
+ * @private
+ */
+ this.ws_ = wsInstance;
+
+ var videos = __WEBPACK_IMPORTED_MODULE_0__utils_dom__["a" /* default */].toArray(this.ws_.el.querySelectorAll('video'));
+
+ if (videos.length) {
+ videos.forEach(function (video) {
+ if (!video.hasAttribute('autoplay')) {
+ return;
+ }
+
+ video.removeAttribute('autoplay');
+ video.pause();
+ video.currentTime = 0;
+
+ var _Slide$getSectionFrom = __WEBPACK_IMPORTED_MODULE_1__modules_slide__["b" /* default */].getSectionFromEl(video),
+ i = _Slide$getSectionFrom.i;
+
+ var slide = wsInstance.slides[i - 1];
+
+ slide.video = video;
+
+ slide.el.addEventListener(__WEBPACK_IMPORTED_MODULE_1__modules_slide__["a" /* Events */].ENABLE, Video.onSectionEnabled);
+ slide.el.addEventListener(__WEBPACK_IMPORTED_MODULE_1__modules_slide__["a" /* Events */].DISABLE, Video.onSectionDisabled);
+ });
+ }
+ }
+
+ /**
+ * On Section enable hook. Will play the video.
+ * @param {CustomEvent} event
+ */
+
+
+ _createClass(Video, null, [{
+ key: 'onSectionEnabled',
+ value: function onSectionEnabled(event) {
+ event.detail.slide.video.play();
+ }
+
+ /**
+ * On Section enable hook. Will pause the video.
+ * @param {CustomEvent} event
+ */
+
+ }, {
+ key: 'onSectionDisabled',
+ value: function onSectionDisabled(event) {
+ event.detail.slide.video.pause();
+ }
+ }]);
+
+ return Video;
+}();
+
+/* harmony default export */ __webpack_exports__["a"] = (Video);
+
+/***/ }),
+/* 18 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__utils_dom__ = __webpack_require__(0);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__modules_slide__ = __webpack_require__(1);
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+/* global YT */
+
+
+
+/**
+ * Player wrapper around the YT player. This is mostly to get around the event
+ * in which we need to play a video which player isn't ready yet.
+ */
+
+var Player = function () {
+ /**
+ * @param {Element} el
+ */
+ function Player(el) {
+ _classCallCheck(this, Player);
+
+ /**
+ * Whether the Player is ready or not.
+ * @type {boolean}
+ */
+ this.ready = false;
+ /**
+ * Ready callback.
+ * @type {?function}
+ */
+ this.onReadyCb = null;
+ /**
+ * Slide element in which the video is located.
+ * @type {Node}
+ */
+ this.slide = __WEBPACK_IMPORTED_MODULE_1__modules_slide__["b" /* default */].getSectionFromEl(el).section;
+ /**
+ * Whether it should autoplay on load or not.
+ * @type {boolean}
+ */
+ this.autoplay = typeof el.dataset.autoplay !== 'undefined';
+ /**
+ * Whether the video should be muted or not.
+ * @type {boolean}
+ */
+ this.isMuted = typeof el.dataset.mute !== 'undefined';
+
+ /**
+ * Options with which the player is created.
+ * @type {Object}
+ */
+ this.options = {
+ videoId: el.dataset.youtubeId,
+ playerVars: this.getPlayerVars(el),
+ events: {
+ onReady: this.onPlayerReady.bind(this)
+ }
+ };
+
+ /**
+ * The iframe in which the video is loaded.
+ * @type {Element}
+ */
+ this.el = el;
+ /**
+ * Timeout id.
+ * @type {?number}
+ */
+ this.timeout = null;
+
+ this.create();
+ }
+
+ /**
+ * Destroys the iframe. Saves the current time in case it gets restored.
+ */
+
+
+ _createClass(Player, [{
+ key: 'destroy',
+ value: function destroy() {
+ this.currentTime = this.player.getCurrentTime();
+ this.player.destroy();
+ this.player = null;
+ this.el = this.slide.querySelector('[data-youtube]');
+ this.ready = false;
+ }
+
+ /**
+ * Creates the player.
+ */
+
+ }, {
+ key: 'create',
+ value: function create() {
+ this.player = new YT.Player(this.el, this.options);
+ this.el = this.player.getIframe();
+ }
+
+ /**
+ * Player ready callback. Will play the video if it was intended to be played
+ * and will also call any pending callbacks.
+ */
+
+ }, {
+ key: 'onPlayerReady',
+ value: function onPlayerReady() {
+ this.ready = true;
+
+ // Restoring the current time if saved
+ if (this.currentTime) {
+ this.player.seekTo(this.currentTime, true);
+ this.player.pauseVideo();
+ this.currentTime = null;
+ }
+
+ if (this.timeout && this.player.getPlayerState() !== 1) {
+ this.play();
+ }
+
+ if (this.onReadyCb) {
+ this.onReadyCb();
+ this.onReadyCb = null;
+ }
+ }
+
+ /**
+ * Plays the video.
+ */
+
+ }, {
+ key: 'play',
+ value: function play() {
+ var _this = this;
+
+ if (this.ready) {
+ this.timeout = setTimeout(function () {
+ _this.timeout = null;
+ }, 1000);
+
+ if (this.isMuted) {
+ this.player.mute();
+ } else {
+ this.player.unMute();
+ }
+
+ this.player.playVideo();
+ } else {
+ this.onReadyCb = this.play;
+ }
+ }
+
+ /**
+ * Pause playing the video if it's already playing.
+ */
+
+ }, {
+ key: 'pause',
+ value: function pause() {
+ if (this.player && this.player.pauseVideo && this.player.getPlayerState() === 1) {
+ this.player.pauseVideo();
+ }
+ }
+
+ /**
+ * Parses the element to have the proper variables.
+ * @param {Element} element
+ * @return {Object} Player variables.
+ */
+
+ }, {
+ key: 'getPlayerVars',
+ value: function getPlayerVars(element) {
+ var vars = {
+ modestbranding: 1,
+ rel: 0,
+ origin: window.location.origin
+ };
+
+ if (this.slide.classList.contains('fullscreen')) {
+ // Disabling keyboard interaction for fullscreenvideos
+ vars.disablekb = 1;
+ }
+
+ if (typeof element.dataset.noControls !== 'undefined') {
+ vars.controls = 0;
+ vars.showinfo = 0;
+ }
+
+ if (typeof element.dataset.loop !== 'undefined') {
+ vars.loop = 1;
+ vars.playlist = element.dataset.youtubeId;
+ }
+
+ return vars;
+ }
+ }]);
+
+ return Player;
+}();
+
+/**
+ * Video plugin.
+ */
+
+
+var YouTube = function () {
+ /**
+ * Grid plugin that shows a grid on top of the WebSlides for easy prototyping.
+ * @param {WebSlides} wsInstance The WebSlides instance
+ */
+ function YouTube(wsInstance) {
+ _classCallCheck(this, YouTube);
+
+ /**
+ * @type {WebSlides}
+ * @private
+ */
+ this.ws_ = wsInstance;
+
+ this.videos = __WEBPACK_IMPORTED_MODULE_0__utils_dom__["a" /* default */].toArray(this.ws_.el.querySelectorAll('[data-youtube]'));
+
+ if (this.videos.length) {
+ this.inject();
+ }
+ }
+
+ /**
+ * Once the YouTube API is ready this gets called so we can start the videos.
+ */
+
+
+ _createClass(YouTube, [{
+ key: 'onYTReady',
+ value: function onYTReady() {
+ var _this2 = this;
+
+ this.videos.forEach(function (video) {
+ var player = new Player(video);
+
+ if (typeof video.dataset.autoplay !== 'undefined') {
+ var _Slide$getSectionFrom = __WEBPACK_IMPORTED_MODULE_1__modules_slide__["b" /* default */].getSectionFromEl(player.el),
+ i = _Slide$getSectionFrom.i;
+
+ var slide = _this2.ws_.slides[i - 1];
+
+ slide.player = player;
+
+ slide.el.addEventListener(__WEBPACK_IMPORTED_MODULE_1__modules_slide__["a" /* Events */].ENABLE, YouTube.onSlideEvent);
+ slide.el.addEventListener(__WEBPACK_IMPORTED_MODULE_1__modules_slide__["a" /* Events */].DISABLE, YouTube.onSlideEvent);
+ slide.el.addEventListener(__WEBPACK_IMPORTED_MODULE_1__modules_slide__["a" /* Events */].ENTER, YouTube.onSlideEvent);
+ slide.el.addEventListener(__WEBPACK_IMPORTED_MODULE_1__modules_slide__["a" /* Events */].LEAVE, YouTube.onSlideEvent);
+
+ if (_this2.ws_.currentSlide_ === slide) {
+ YouTube.onSectionEnabled(slide);
+ }
+ }
+ });
+ }
+
+ /**
+ * Injects the YouTube iFrame API into the page.
+ */
+
+ }, {
+ key: 'inject',
+ value: function inject() {
+ window.onYouTubeIframeAPIReady = this.onYTReady.bind(this);
+ var tag = document.createElement('script');
+ tag.src = 'https://www.youtube.com/iframe_api';
+ var firstScriptTag = document.getElementsByTagName('script')[0];
+ firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
+ }
+
+ /**
+ * Reacts to any event on the slide.
+ * @param {CustomEvent} event
+ */
+
+ }], [{
+ key: 'onSlideEvent',
+ value: function onSlideEvent(event) {
+ var slide = event.detail.slide;
+
+ switch (event.type) {
+ case __WEBPACK_IMPORTED_MODULE_1__modules_slide__["a" /* Events */].ENABLE:
+ YouTube.onSectionEnabled(slide);
+ break;
+ case __WEBPACK_IMPORTED_MODULE_1__modules_slide__["a" /* Events */].DISABLE:
+ YouTube.onSectionDisabled(slide);
+ break;
+ case __WEBPACK_IMPORTED_MODULE_1__modules_slide__["a" /* Events */].LEAVE:
+ slide.player.destroy();
+ break;
+ case __WEBPACK_IMPORTED_MODULE_1__modules_slide__["a" /* Events */].ENTER:
+ slide.player.create();
+ break;
+ }
+ }
+
+ /**
+ * On Section enable hook. Will play the video.
+ * @param {Slide} slide
+ */
+
+ }, {
+ key: 'onSectionEnabled',
+ value: function onSectionEnabled(slide) {
+ if (slide.player.autoplay) {
+ slide.player.play();
+ }
+ }
+
+ /**
+ * On Section enable hook. Will pause the video.
+ * @param {Slide} slide
+ */
+
+ }, {
+ key: 'onSectionDisabled',
+ value: function onSectionDisabled(slide) {
+ slide.player.pause();
+ }
+ }]);
+
+ return YouTube;
+}();
+
+/* harmony default export */ __webpack_exports__["a"] = (YouTube);
+
+/***/ }),
+/* 19 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__utils_dom__ = __webpack_require__(0);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__utils_keys__ = __webpack_require__(2);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__utils_scroll_to__ = __webpack_require__(4);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__modules_slide__ = __webpack_require__(1);
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+
+
+
+
+
+var CLASSES = {
+ ZOOM: 'grid',
+ DIV: 'column',
+ WRAP: 'wrap-zoom',
+ WRAP_CONTAINER: 'wrap',
+ CURRENT: 'current',
+ SLIDE: 'slide',
+ ZOOM_ENABLED: 'ws-ready-zoom'
+};
+
+var ID = 'webslides-zoomed';
+
+/**
+ * Zoom plugin.
+ */
+
+var Zoom = function () {
+ /**
+ * @param {WebSlides} wsInstance The WebSlides instance
+ * @constructor
+ */
+ function Zoom(wsInstance) {
+ _classCallCheck(this, Zoom);
+
+ /**
+ * @type {WebSlides}
+ * @private
+ */
+ this.ws_ = wsInstance;
+
+ /**
+ * @type {WebSlides}
+ * @private
+ */
+ this.zws_ = {};
+
+ /**
+ * @type {boolean}
+ * @private
+ */
+ this.isZoomed_ = false;
+
+ this.preBuildZoom_();
+ document.body.addEventListener('keydown', this.onKeyDown.bind(this));
+ }
+
+ /**
+ * On key down handler. Will decide if Zoom in or out
+ * @param {Event} event Key down event.
+ */
+
+
+ _createClass(Zoom, [{
+ key: 'onKeyDown',
+ value: function onKeyDown(event) {
+ if (!this.isZoomed_ && __WEBPACK_IMPORTED_MODULE_1__utils_keys__["a" /* default */].MINUS.some(function (key) {
+ return key === event.which;
+ })) {
+ this.zoomIn();
+ } else if (this.isZoomed_ && (__WEBPACK_IMPORTED_MODULE_1__utils_keys__["a" /* default */].PLUS.some(function (key) {
+ return key === event.which;
+ }) || event.which === __WEBPACK_IMPORTED_MODULE_1__utils_keys__["a" /* default */].ESCAPE)) {
+ this.zoomOut();
+ }
+ }
+
+ /**
+ * Prepare zoom structure, scales the slides and uses a grid layout
+ * to show them.
+ */
+
+ }, {
+ key: 'preBuildZoom_',
+ value: function preBuildZoom_() {
+ var _this = this;
+
+ // Clone #webslides element
+ this.zws_.el = this.ws_.el.cloneNode();
+ this.zws_.el.id = ID;
+ this.zws_.wrap = __WEBPACK_IMPORTED_MODULE_0__utils_dom__["a" /* default */].createNode('div');
+ this.zws_.wrap.className = CLASSES.WRAP_CONTAINER;
+ this.zws_.el.appendChild(this.zws_.wrap);
+ this.zws_.grid = __WEBPACK_IMPORTED_MODULE_0__utils_dom__["a" /* default */].createNode('div');
+ this.zws_.grid.className = CLASSES.ZOOM;
+ this.zws_.wrap.appendChild(this.zws_.grid);
+
+ this.zws_.el.addEventListener('click', function () {
+ return _this.toggleZoom();
+ });
+
+ // Clone the slides
+ this.zws_.slides = [].map.call(this.ws_.slides, function (slide, i) {
+ var s_ = slide.el.cloneNode(true);
+ _this.zws_.grid.appendChild(s_);
+ return new __WEBPACK_IMPORTED_MODULE_3__modules_slide__["b" /* default */](s_, i);
+ });
+
+ this.disable();
+ __WEBPACK_IMPORTED_MODULE_0__utils_dom__["a" /* default */].after(this.zws_.el, this.ws_.el);
+
+ // Creates the container for each slide
+ this.zws_.slides.forEach(function (elem) {
+ return _this.createSlideBlock_(elem);
+ });
+ }
+
+ /**
+ * Creates a block structure around the slide.
+ * @param {Element} elem slide element.
+ */
+
+ }, {
+ key: 'createSlideBlock_',
+ value: function createSlideBlock_(elem) {
+ var _this2 = this;
+
+ // Wraps the slide around a container
+ var wrap = __WEBPACK_IMPORTED_MODULE_0__utils_dom__["a" /* default */].wrap(elem.el, 'div');
+ wrap.className = CLASSES.WRAP;
+ wrap.setAttribute('id', 'zoomed-' + elem.el.getAttribute('id'));
+
+ // Slide container, need due to flexbox styles
+ var div = __WEBPACK_IMPORTED_MODULE_0__utils_dom__["a" /* default */].wrap(wrap, 'div');
+ div.className = CLASSES.DIV;
+
+ // Adding some layer for controlling click events
+ var divLayer = __WEBPACK_IMPORTED_MODULE_0__utils_dom__["a" /* default */].createNode('div');
+ divLayer.className = 'zoom-layer';
+ divLayer.addEventListener('click', function (e) {
+ e.stopPropagation();
+ _this2.zoomOut();
+ _this2.ws_.goToSlide(elem.i);
+ });
+ wrap.appendChild(divLayer);
+
+ // Slide number
+ var slideNumber = __WEBPACK_IMPORTED_MODULE_0__utils_dom__["a" /* default */].createNode('p', '', '' + (elem.i + 1));
+ slideNumber.className = 'text-slide-number';
+ div.appendChild(slideNumber);
+ }
+
+ /**
+ * Toggles zoom.
+ */
+
+ }, {
+ key: 'toggleZoom',
+ value: function toggleZoom() {
+ if (this.isZoomed_) {
+ this.zoomOut();
+ } else {
+ this.zoomIn();
+ }
+ }
+
+ /**
+ * Zoom In the slider, scales the slides and uses a grid layout to show them.
+ */
+
+ }, {
+ key: 'zoomIn',
+ value: function zoomIn() {
+ var _this3 = this;
+
+ if (!this.ws_.options.showIndex) return;
+ this.enable();
+ var currentId = this.ws_.currentSlide_.el.id;
+ var zoomedCurrent = this.zws_.el.querySelector('.' + CLASSES.WRAP + '.' + CLASSES.CURRENT);
+
+ if (zoomedCurrent) {
+ zoomedCurrent.classList.remove(CLASSES.CURRENT);
+ }
+
+ var actualCurrent = this.zws_.el.querySelector('#zoomed-' + currentId);
+ actualCurrent.classList.add(CLASSES.CURRENT);
+
+ this.isZoomed_ = true;
+ document.documentElement.classList.add(CLASSES.ZOOM_ENABLED);
+
+ setTimeout(function () {
+ _this3.ws_.disable();
+ _this3.zws_.el.classList.add('in');
+ var wrapCSS = window.getComputedStyle(_this3.zws_.grid);
+ var scrollingElement = document.body;
+
+ Object(__WEBPACK_IMPORTED_MODULE_2__utils_scroll_to__["a" /* default */])(actualCurrent.parentNode.offsetTop + __WEBPACK_IMPORTED_MODULE_0__utils_dom__["a" /* default */].parseSize(wrapCSS.paddingTop), 50, function () {}, scrollingElement);
+ }, 50);
+ }
+
+ /**
+ * Zoom Out the slider, remove scale from the slides.
+ */
+
+ }, {
+ key: 'zoomOut',
+ value: function zoomOut() {
+ var _this4 = this;
+
+ if (!this.ws_.options.showIndex) return;
+ this.zws_.el.classList.remove('in');
+
+ setTimeout(function () {
+ _this4.ws_.enable();
+ _this4.disable();
+ _this4.isZoomed_ = false;
+ document.documentElement.classList.remove(CLASSES.ZOOM_ENABLED);
+ }, 400);
+ }
+
+ /**
+ * Hides the zoom container
+ */
+
+ }, {
+ key: 'disable',
+ value: function disable() {
+ this.zws_.el.classList.add('disabled');
+ }
+
+ /**
+ * Shows the zoom container
+ */
+
+ }, {
+ key: 'enable',
+ value: function enable() {
+ this.zws_.el.classList.remove('disabled');
+ }
+ }]);
+
+ return Zoom;
+}();
+
+/* harmony default export */ __webpack_exports__["a"] = (Zoom);
+
+/***/ }),
+/* 20 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/**
+ * Swing easing function.
+ * @param {number} p The percentage of time that has passed.
+ * @return {number}
+ */
+function swing(p) {
+ return 0.5 - Math.cos(p * Math.PI) / 2;
+}
+
+/* harmony default export */ __webpack_exports__["a"] = ({ swing: swing });
+
+/***/ }),
+/* 21 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ })
+/******/ ]);
\ No newline at end of file
diff --git a/static/js/webslides.min.js b/static/js/webslides.min.js
new file mode 100644
index 0000000..ddf3790
--- /dev/null
+++ b/static/js/webslides.min.js
@@ -0,0 +1,9 @@
+/*!
+ * Name: WebSlides
+ * Version: 1.5.0
+ * Date: 2017-09-16
+ * Description: Making HTML presentations easy
+ * URL: https://github.com/webslides/webslides#readme
+ * Credits: @jlantunez, @LuisSacristan, @Belelros
+ */
+!function(e){function t(n){if(i[n])return i[n].exports;var s=i[n]={i:n,l:!1,exports:{}};return e[n].call(s.exports,s,s.exports,t),s.l=!0,s.exports}var i={};t.m=e,t.c=i,t.d=function(e,i,n){t.o(e,i)||Object.defineProperty(e,i,{configurable:!1,enumerable:!0,get:n})},t.n=function(e){var i=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(i,"a",i),i},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="/static/js/",t(t.s=5)}([function(e,t,i){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var s=i(9),o=function(){function e(e,t){for(var i=0;i1&&void 0!==arguments[1]?arguments[1]:"",i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",n=document.createElement(e);return t&&(n.id=t),i&&(n.textContent=i),n}},{key:"once",value:function(e,t,i){var n=function n(s){s.target===e&&(e.removeEventListener(t,n),i(s))};e.addEventListener(t,n,!1)}},{key:"getTransitionEvent",value:function(e){if(a&&!e)return a;a="";for(var t=e||document.createElement("ws"),i={transition:"transitionend",OTransition:"oTransitionEnd",MozTransition:"transitionend",WebkitTransition:"webkitTransitionEnd"},n=Object.keys(i),s=0,o=n.length;s2&&void 0!==arguments[2]?arguments[2]:{},n=new s.a(t,{detail:i});e.dispatchEvent(n)}},{key:"toArray",value:function(e){return[].slice.call(e)}},{key:"isFocusableElement",value:function(){var e=!1;if(document.activeElement){var t="inherit"!==document.activeElement.contentEditable&&void 0!==document.activeElement.contentEditable;e=["INPUT","SELECT","OPTION","TEXTAREA"].indexOf(document.activeElement.tagName)>-1||t}return e}},{key:"parseSize",value:function(e){return Number(e.replace(/[^\d\.]/g,""))}},{key:"wrap",value:function(e,t){var i=document.createElement(t);return e.parentElement.insertBefore(i,e),i.appendChild(e),i}},{key:"after",value:function(e,t){var i=t.parentNode;i.lastChild===t?i.appendChild(e):i.insertBefore(e,t.nextSibling)}}]),e}();t.a=l},function(e,t,i){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}i.d(t,"b",function(){return l}),i.d(t,"a",function(){return r});var s=i(0),o=function(){function e(e,t){for(var i=0;i1&&void 0!==arguments[1]?arguments[1]:500,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:function(){},n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:null;o=n||document.getElementById("webslides");var a=e-o.scrollTop,r=o.scrollTop;if(!t)return o.scrollTop=e,void i();!function n(l){l+=16;var u=Math.min(1,l/t),c=s.a.swing(u,l*u,e,a,t);o.scrollTop=Math.floor(r+c*a),l0&&void 0!==arguments[0]?arguments[0]:{},i=t.autoslide,s=void 0!==i&&i,o=t.changeOnClick,a=void 0!==o&&o,r=t.loop,l=void 0===r||r,c=t.minWheelDelta,d=void 0===c?40:c,h=t.navigateOnScroll,f=void 0===h||h,v=t.scrollWait,y=void 0===v?450:v,p=t.slideOffset,m=void 0===p?50:p,w=t.showIndex,b=void 0===w||w;if(n(this,e),this.el=document.getElementById("webslides"),!this.el)throw new Error("Couldn't find the webslides container!");this.isMoving=!1,this.slides=null,this.currentSlideI_=-1,this.currentSlide_=null,this.maxSlide_=0,this.isVertical=this.el.classList.contains(u.VERTICAL),this.plugins={},this.options={autoslide:s,changeOnClick:a,loop:l,minWheelDelta:d,navigateOnScroll:f,scrollWait:y,slideOffset:m,showIndex:b},this.initialised=!1,this.removeChildren_(),this.grabSlides_(),this.createPlugins_(),this.initSlides_(),this.onInit_()}return l(e,[{key:"removeChildren_",value:function(){for(var e=this.el.childNodes,t=e.length;t--;){var i=e[t];o.b.isCandidate(i)||this.el.removeChild(i)}}},{key:"createPlugins_",value:function(){var e=this;Object.keys(c).forEach(function(t){var i=c[t];e.plugins[t]=new i(e)})}},{key:"onInit_",value:function(){this.initialised=!0,a.a.fireEvent(this.el,"ws:init"),document.documentElement.classList.add(u.READY)}},{key:"grabSlides_",value:function(){this.slides=a.a.toArray(this.el.childNodes).map(function(e,t){return new o.b(e,t)}),this.maxSlide_=this.slides.length}},{key:"goToSlide",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;if(this.isValidIndexSlide_(e)&&!this.isMoving&&this.currentSlideI_!==e){this.isMoving=!0;var i=!1;null!==t?i=t:this.currentSlideI_>=0&&(i=e>this.currentSlideI_);var n=this.slides[e];null===this.currentSlide_||!this.isVertical||this.plugins.touch&&this.plugins.touch.isEnabled?this.transitionToSlide_(i,n,this.onSlideChange_):this.scrollTransitionToSlide_(i,n,this.onSlideChange_)}}},{key:"scrollTransitionToSlide_",value:function(e,t,i){var n=this;this.el.style.overflow="hidden",e?t.show():(t.moveBeforeFirst(),t.show(),Object(r.a)(this.currentSlide_.el.offsetTop,0)),Object(r.a)(t.el.offsetTop,500,function(){n.currentSlide_.hide(),e&&n.currentSlide_.moveAfterLast(),n.el.style.overflow="auto",setTimeout(function(){i.call(n,t)},150)})}},{key:"transitionToSlide_",value:function(e,t,i){var n=this;Object(r.a)(0,0);var s="slideInRight";e||(t.moveBeforeFirst(),s="slideInLeft"),this.currentSlide_&&(e&&this.currentSlide_.moveAfterLast(),this.currentSlide_.hide()),t.show(),this.initialised&&this.plugins.touch&&this.plugins.touch.isEnabled?(a.a.once(t.el,a.a.getAnimationEvent(),function(){t.el.classList.remove(s),i.call(n,t)}),t.el.classList.add(s)):i.call(this,t)}},{key:"onSlideChange_",value:function(e){this.currentSlide_&&this.currentSlide_.disable(),this.currentSlide_=e,this.currentSlideI_=e.i,this.currentSlide_.enable(),this.isMoving=!1,a.a.fireEvent(this.el,"ws:slide-change",{slides:this.maxSlide_,currentSlide0:this.currentSlideI_,currentSlide:this.currentSlideI_+1})}},{key:"goNext",value:function(){var e=this.currentSlideI_+1;if(e>=this.maxSlide_){if(!this.options.loop)return;e=0}this.goToSlide(e,!0)}},{key:"goPrev",value:function(){var e=this.currentSlideI_-1;if(e<0){if(!this.options.loop)return;e=this.maxSlide_-1}this.goToSlide(e,!1)}},{key:"isValidIndexSlide_",value:function(e){return"number"==typeof e&&e>=0&&e=this.maxSlide_)&&(e=0),0!==e)for(var t=0;t0&&(this.interval_=setInterval(this.ws_.goNext.bind(this.ws_),e))}},{key:"stop",value:function(){this.interval_&&(clearInterval(this.interval_),this.interval_=null)}}]),e}();t.a=a},function(e,t,i){"use strict";var n=window.CustomEvent,s=function(e,t){var i=document.createEvent("CustomEvent");return t?i.initCustomEvent(e,t.bubbles,t.cancelable,t.detail):i.initCustomEvent(e,!1,!1,void 0),i},o=function(){try{var e=new n("t",{detail:{a:"b"}});return"t"===e.type&&"b"===e.detail.a}catch(e){}return!1}()?n:s;t.a=o},function(e,t,i){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var s=function(){function e(e,t){for(var i=0;iMath.abs(i);if(this.isGoingUp_=i<0,this.isGoingLeft_=n<0,o){if(s)return;e.preventDefault()}(Math.abs(i+t)>=this.ws_.options.minWheelDelta||Math.abs(n+t)>=this.ws_.options.minWheelDelta)&&(o&&this.isGoingLeft_||!o&&this.isGoingUp_?this.ws_.goPrev():this.ws_.goNext(),e.preventDefault())}}}]),e}();t.a=a},function(e,t,i){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var s=i(3),o=function(){function e(e,t){for(var i=0;i1&&(this.startTouches=e.getTouchCoordinates(t),this.endTouches=this.startTouches,this.isGesture=!0)}}},{key:"onMove_",value:function(t){if(!this.ws_.isDisabled()){var i=e.normalizeEventInfo(t);this.isGesture?this.endTouches=e.getTouchCoordinates(t):(this.endX_=i.x,this.endY_=i.y)}}},{key:"onStop_",value:function(){if(!this.ws_.isDisabled())if(this.isGesture){var e=Math.sqrt(Math.pow(this.startTouches[0].x-this.startTouches[1].x,2)+Math.pow(this.startTouches[0].y-this.startTouches[1].y,2)),t=Math.sqrt(Math.pow(this.endTouches[0].x-this.endTouches[1].x,2)+Math.pow(this.endTouches[0].y-this.endTouches[1].y,2));e>t&&this.ws_.toggleZoom(),this.isGesture=!1}else{var i=this.startX_-this.endX_,n=this.startY_-this.endY_;Math.abs(i)>Math.abs(n)&&(i<-this.ws_.options.slideOffset?this.ws_.goPrev():i>this.ws_.options.slideOffset&&this.ws_.goNext())}}}],[{key:"getTouchCoordinates",value:function(e){return[{x:e.touches[0].clientX,y:e.touches[0].clientY},{x:e.touches[1].clientX,y:e.touches[1].clientY}]}},{key:"normalizeEventInfo",value:function(e){var t={pageX:0,pageY:0};return void 0!==e.changedTouches?t=e.changedTouches[0]:void 0!==e.originalEvent&&void 0!==e.originalEvent.changedTouches&&(t=e.originalEvent.changedTouches[0]),{x:e.offsetX||e.layerX||t.pageX,y:e.offsetY||e.layerY||t.pageY}}}]),e}();t.a=r},function(e,t,i){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var s=i(0),o=i(1),a=function(){function e(e,t){for(var i=0;i