0){let a=.9;t+=u.querySelectorAll(".fragment.visible").length/e.length*a}}return Math.min(t/(e-1),1)}function pt(){return!!window.location.search.match(/receiver/gi)}function ft(){let e=window.location.hash,t=e.slice(2).split("/"),n=e.replace(/#|\//gi,"");if(!/^[0-9]*$/.test(t[0])&&n.length){let e;try{e=document.getElementById(decodeURIComponent(n))}catch(e){}let t=!!u&&u.getAttribute("id")===n;if(e){if(!t){let t=a.getIndices(e);De(t.h,t.v)}}else De(l||0,d||0)}else{let e,a=s.hashOneBasedIndex?1:0,n=parseInt(t[0],10)-a||0,r=parseInt(t[1],10)-a||0;s.fragmentInURL&&(e=parseInt(t[2],10),isNaN(e)&&(e=void 0)),n===l&&r===d&&void 0===e||De(n,r,e)}}function ht(e){clearTimeout(P),"number"==typeof e?P=setTimeout(ht,e):u&&(s.history||!window.history?window.location.hash=Me():s.hash?window.history.replaceState(null,null,"#"+Me()):window.history.replaceState(null,null,window.location.pathname+window.location.search))}function gt(e){let t,a=l,n=d;if(e){let t=Ne(e),r=t?e.parentNode:e,i=te(x.wrapper.querySelectorAll(".slides>section"));a=Math.max(i.indexOf(r),0),n=void 0,t&&(n=Math.max(te(e.parentNode.querySelectorAll("section")).indexOf(e),0))}if(!e&&u){if(u.querySelectorAll(".fragment").length>0){let e=u.querySelector(".current-fragment");t=e&&e.hasAttribute("data-fragment-index")?parseInt(e.getAttribute("data-fragment-index"),10):u.querySelectorAll(".fragment.visible").length-1}}return{h:a,v:n,f:t}}function mt(){return te(x.wrapper.querySelectorAll('.slides section:not(.stack):not([data-visibility="uncounted"])'))}function vt(){return te(x.wrapper.querySelectorAll(".slides>section"))}function bt(){return te(x.wrapper.querySelectorAll(".slides>section>section"))}function yt(){return vt().length>1}function wt(){return bt().length>1}function At(){return mt().length}function kt(e,t){let a=vt()[e],n=a&&a.querySelectorAll("section");return n&&n.length&&"number"==typeof t?n?n[t]:void 0:a}function Et(e,t){let a="number"==typeof e?kt(e,t):e;if(a)return a.slideBackgroundElement}function St(e=u){if(e.hasAttribute("data-notes"))return e.getAttribute("data-notes");let t=e.querySelector("aside.notes");return t?t.innerHTML:null}function Lt(){let e=gt();return{indexh:e.h,indexv:e.v,indexf:e.f,paused:Oe(),overview:xe()}}function xt(e,t=!1){e=te(e);let a=[],n=[],r=[];e.forEach(e=>{if(e.hasAttribute("data-fragment-index")){let t=parseInt(e.getAttribute("data-fragment-index"),10);a[t]||(a[t]=[]),a[t].push(e)}else n.push([e])}),a=a.concat(n);let i=0;return a.forEach(e=>{e.forEach(e=>{r.push(e),e.setAttribute("data-fragment-index",i)}),i++}),!0===t?a:r}function Mt(e,t){let a={shown:[],hidden:[]};if(u&&s.fragments&&(t=t||xt(u.querySelectorAll(".fragment"))).length){let n=0;if("number"!=typeof e){let t=xt(u.querySelectorAll(".fragment.visible")).pop();t&&(e=parseInt(t.getAttribute("data-fragment-index")||0,10))}te(t).forEach((t,r)=>{t.hasAttribute("data-fragment-index")&&(r=parseInt(t.getAttribute("data-fragment-index"),10)),n=Math.max(n,r),r<=e?(t.classList.contains("visible")||a.shown.push(t),t.classList.add("visible"),t.classList.remove("current-fragment"),x.statusDiv.textContent=X(t),r===e&&(t.classList.add("current-fragment"),ot(t))):(t.classList.contains("visible")&&a.hidden.push(t),t.classList.remove("visible"),t.classList.remove("current-fragment"))}),e="number"==typeof e?e:-1,e=Math.max(Math.min(e,n),-1),u.setAttribute("data-fragment",e)}return a}function Nt(e,t=0){if(u&&s.fragments){let a=xt(u.querySelectorAll(".fragment"));if(a.length){if("number"!=typeof e){let t=xt(u.querySelectorAll(".fragment.visible")).pop();e=t?parseInt(t.getAttribute("data-fragment-index")||0,10):-1}let n=Mt(e+=t,a);return n.hidden.length&&de("fragmenthidden",{fragment:n.hidden[0],fragments:n.hidden}),n.shown.length&&de("fragmentshown",{fragment:n.shown[0],fragments:n.shown}),Xe(),Fe(),s.fragmentInURL&&ht(),!(!n.shown.length&&!n.hidden.length)}}return!1}function qt(){return Nt(null,1)}function It(){return Nt(null,-1)}function Pt(){if(Tt(),u&&!1!==s.autoSlide){let e=u.querySelector(".current-fragment");e||(e=u.querySelector(".fragment"));let t=e?e.getAttribute("data-autoslide"):null,n=u.parentNode?u.parentNode.getAttribute("data-autoslide"):null,r=u.getAttribute("data-autoslide");D=t?parseInt(t,10):r?parseInt(r,10):n?parseInt(n,10):s.autoSlide,0===u.querySelectorAll(".fragment").length&&te(u.querySelectorAll("video, audio")).forEach(e=>{e.hasAttribute("data-autoplay")&&D&&1e3*e.duration/e.playbackRate>D&&(D=1e3*e.duration/e.playbackRate+1e3)}),!D||z||Oe()||xe()||a.isLastSlide()&&!it().next&&!0!==s.loop||(B=setTimeout(()=>{"function"==typeof s.autoSlideMethod?s.autoSlideMethod():jt(),Pt()},D),H=Date.now()),m&&m.setPlaying(-1!==B)}}function Tt(){clearTimeout(B),B=-1}function Ct(){D&&!z&&(z=!0,de("autoslidepaused"),clearTimeout(B),m&&m.setPlaying(!1))}function Ot(){D&&z&&(z=!1,de("autoslideresumed"),Pt())}function Rt(){A=!0,s.rtl?(xe()||!1===qt())&&rt().left&&De(l+1,"grid"===s.navigationMode?d:void 0):(xe()||!1===It())&&rt().left&&De(l-1,"grid"===s.navigationMode?d:void 0)}function Dt(){A=!0,s.rtl?(xe()||!1===It())&&rt().right&&De(l-1,"grid"===s.navigationMode?d:void 0):(xe()||!1===qt())&&rt().right&&De(l+1,"grid"===s.navigationMode?d:void 0)}function Bt(){(xe()||!1===It())&&rt().up&&De(l,d-1)}function Ht(){k=!0,(xe()||!1===qt())&&rt().down&&De(l,d+1)}function zt(){if(!1===It())if(rt().up)Bt();else{let e;if(e=s.rtl?te(x.wrapper.querySelectorAll(".slides>section.future")).pop():te(x.wrapper.querySelectorAll(".slides>section.past")).pop(),e){let t=e.querySelectorAll("section").length-1||void 0;De(l-1,t)}}}function jt(){if(A=!0,k=!0,!1===qt()){let e=rt();e.down&&e.right&&s.loop&&a.isLastVerticalSlide(u)&&(e.down=!1),e.down?Ht():s.rtl?Rt():Dt()}}function $t(e){for(;e&&"function"==typeof e.hasAttribute;){if(e.hasAttribute("data-prevent-swipe"))return!0;e=e.parentNode}return!1}function Wt(e){s.autoSlideStoppable&&Ct()}function Ft(e){qe(),clearTimeout(C),C=setTimeout(Ie,s.hideCursorTime)}function Ut(e){e.shiftKey&&63===e.charCode&&fe()}function Vt(e){if("function"==typeof s.keyboardCondition&&!1===s.keyboardCondition(e))return!0;let t=e.keyCode,n=z;Wt();let r=document.activeElement&&"inherit"!==document.activeElement.contentEditable,i=document.activeElement&&document.activeElement.tagName&&/input|textarea/i.test(document.activeElement.tagName),o=document.activeElement&&document.activeElement.className&&/speaker-notes/i.test(document.activeElement.className),l=e.shiftKey&&32===e.keyCode,d=e.shiftKey&&37===t,c=e.shiftKey&&39===t,u=!l&&!d&&!c&&(e.shiftKey||e.altKey||e.ctrlKey||e.metaKey);if(r||i||o||u)return;let p,f=[66,86,190,191];if("object"==typeof s.keyboard)for(p in s.keyboard)"togglePause"===s.keyboard[p]&&f.push(parseInt(p,10));if(Oe()&&-1===f.indexOf(t))return!1;let h="linear"===s.navigationMode||!yt()||!wt(),g=!1;if("object"==typeof s.keyboard)for(p in s.keyboard)if(parseInt(p,10)===t){var m=s.keyboard[p];"function"==typeof m?m.apply(null,[e]):"string"==typeof m&&"function"==typeof a[m]&&a[m].call(),g=!0}if(!1===g)for(p in W)if(parseInt(p,10)===t){let t=W[p].callback;"function"==typeof t?t.apply(null,[e]):"string"==typeof t&&"function"==typeof a[t]&&a[t].call(),g=!0}!1===g&&(g=!0,80===t||33===t?zt():78===t||34===t?jt():72===t||37===t?d?De(0):!xe()&&h?zt():Rt():76===t||39===t?c?De(Number.MAX_VALUE):!xe()&&h?jt():Dt():75===t||38===t?!xe()&&h?zt():Bt():74===t||40===t?!xe()&&h?jt():Ht():36===t?De(0):35===t?De(Number.MAX_VALUE):32===t?(xe()&&Se(),e.shiftKey?zt():jt()):58===t||59===t||66===t||86===t||190===t||191===t?Ce():70===t?function(){let e=document.documentElement,t=e.requestFullscreen||e.webkitRequestFullscreen||e.webkitRequestFullScreen||e.mozRequestFullScreen||e.msRequestFullscreen;t&&t.apply(e)}():65===t?s.autoSlideStoppable&&Re(n):g=!1),g?e.preventDefault&&e.preventDefault():27!==t&&79!==t||(x.overlay?ge():Le(),e.preventDefault&&e.preventDefault()),Pt()}function Xt(e){if($t(e.target))return!0;j.startX=e.touches[0].clientX,j.startY=e.touches[0].clientY,j.startCount=e.touches.length}function Yt(e){if($t(e.target))return!0;if(j.captured)i.match(/android/gi)&&e.preventDefault();else{Wt();let t=e.touches[0].clientX,a=e.touches[0].clientY;if(1===e.touches.length&&2!==j.startCount){let n=t-j.startX,r=a-j.startY;n>j.threshold&&Math.abs(n)>Math.abs(r)?(j.captured=!0,"linear"===s.navigationMode?s.rtl?jt():zt():Rt()):n<-j.threshold&&Math.abs(n)>Math.abs(r)?(j.captured=!0,"linear"===s.navigationMode?s.rtl?zt():jt():Dt()):r>j.threshold?(j.captured=!0,"linear"===s.navigationMode?zt():Bt()):r<-j.threshold&&(j.captured=!0,"linear"===s.navigationMode?jt():Ht()),s.embedded?(j.captured||Ne(u))&&e.preventDefault():e.preventDefault()}}}function Kt(e){j.captured=!1}function _t(e){e.pointerType!==e.MSPOINTER_TYPE_TOUCH&&"touch"!==e.pointerType||(e.touches=[{clientX:e.clientX,clientY:e.clientY}],Xt(e))}function Jt(e){e.pointerType!==e.MSPOINTER_TYPE_TOUCH&&"touch"!==e.pointerType||(e.touches=[{clientX:e.clientX,clientY:e.clientY}],Yt(e))}function Qt(e){e.pointerType!==e.MSPOINTER_TYPE_TOUCH&&"touch"!==e.pointerType||(e.touches=[{clientX:e.clientX,clientY:e.clientY}],Kt())}function Zt(e){if(Date.now()-I>600){I=Date.now();let t=e.detail||-e.wheelDelta;t>0?jt():t<0&&zt()}}function Gt(e){Wt(),e.preventDefault();let t=vt().length,a=Math.floor(e.clientX/x.wrapper.offsetWidth*t);s.rtl&&(a=t-a),De(a)}function ea(e){e.preventDefault(),Wt(),"linear"===s.navigationMode?zt():Rt()}function ta(e){e.preventDefault(),Wt(),"linear"===s.navigationMode?jt():Dt()}function aa(e){e.preventDefault(),Wt(),Bt()}function na(e){e.preventDefault(),Wt(),Ht()}function ra(e){e.preventDefault(),Wt(),zt()}function ia(e){e.preventDefault(),Wt(),jt()}function oa(e){ft()}function sa(e){me()}function la(e){!1===document.hidden&&document.activeElement!==document.body&&("function"==typeof document.activeElement.blur&&document.activeElement.blur(),document.body.focus())}function da(e){if(O&&xe()){e.preventDefault();let t=e.target;for(;t&&!t.nodeName.match(/section/gi);)t=t.parentNode;if(t&&!t.classList.contains("disabled"))if(Se(),t.nodeName.match(/section/gi))De(parseInt(t.getAttribute("data-index-h"),10),parseInt(t.getAttribute("data-index-v"),10))}}function ca(e){if(e.currentTarget&&e.currentTarget.hasAttribute("href")){let t=e.currentTarget.getAttribute("href");t&&(!function(e){ge(),x.overlay=document.createElement("div"),x.overlay.classList.add("overlay"),x.overlay.classList.add("overlay-preview"),x.wrapper.appendChild(x.overlay),x.overlay.innerHTML=`\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\tUnable to load iframe. This is likely due to the site's policy (x-frame-options).\n\t\t\t\t\n\t\t\t
`,x.overlay.querySelector("iframe").addEventListener("load",e=>{x.overlay.classList.add("loaded")},!1),x.overlay.querySelector(".close").addEventListener("click",e=>{ge(),e.preventDefault()},!1),x.overlay.querySelector(".external").addEventListener("click",e=>{ge()},!1)}(t),e.preventDefault())}}function ua(e){a.isLastSlide()&&!1===s.loop?(De(0,0),Ot()):z?Ot():Ct()}return a={VERSION:"4.0.0-dev",configure:Q,sync:Be,syncSlide:function(e=u){J(e),He(e),at(e),Ye(),We()},syncFragments:He,slide:De,left:Rt,right:Dt,up:Bt,down:Ht,prev:zt,next:jt,navigateTo:De,navigateLeft:Rt,navigateRight:Dt,navigateUp:Bt,navigateDown:Ht,navigatePrev:zt,navigateNext:jt,navigateFragment:Nt,prevFragment:It,nextFragment:qt,layout:me,shuffle:ze,availableRoutes:rt,availableFragments:it,toggleHelp:fe,toggleOverview:Le,togglePause:Ce,toggleAutoSlide:Re,isOverview:xe,isPaused:Oe,isAutoSliding:function(){return!(!D||z)},isSpeakerNotes:pt,loadSlide:at,unloadSlide:nt,addEventListeners:Z,removeEventListeners:G,getState:Lt,setState:function(e){if("object"==typeof e){De(ae(e.indexh),ae(e.indexv),ae(e.indexf));var t=ae(e.paused),a=ae(e.overview);"boolean"==typeof t&&t!==Oe()&&Ce(t),"boolean"==typeof a&&a!==xe()&&Le(a)}},getSlidePastCount:ct,getProgress:ut,getIndices:gt,getSlides:mt,getSlidesAttributes:function(){return mt().map((function(e){let t={};for(let a=0;ac,getCurrentSlide:()=>u,getScale:()=>S,getConfig:()=>s,getQueryHash:()=>{let e={};location.search.replace(/[A-Z0-9]+?=([\w\.%-]*)/gi,t=>{e[t.split("=").shift()]=t.split("=").pop()});for(let t in e){let a=e[t];e[t]=ae(unescape(a))}return e},getRevealElement:()=>x.wrapper||document.querySelector(".reveal"),getPlugins:()=>M,isFirstSlide:()=>0===l&&0===d,isLastSlide:()=>!!u&&(!u.nextElementSibling&&(!Ne(u)||!u.parentNode.nextElementSibling)),isLastVerticalSlide:()=>!(!u||!Ne(u))&&!u.nextElementSibling,isReady:()=>v,addEventListener:(e,t,n)=>{"addEventListener"in window&&a.getRevealElement().addEventListener(e,t,n)},removeEventListener:(e,t,n)=>{"addEventListener"in window&&a.getRevealElement().removeEventListener(e,t,n)},triggerKey:e=>{Vt({keyCode:e})},registerKeyboardShortcut:(e,t)=>{$[e]=t}},function(){if(!e)return void console.warn("reveal.js must be instantiated with a valid .reveal element");!function(){f=/(iphone|ipod|ipad|android)/gi.test(i)||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1,h=/chrome/i.test(i)&&!/edge/i.test(i);let e=document.createElement("div");q.zoom="zoom"in e.style&&!f&&(h||/Version\/[\d\.]+.*Safari/.test(i))}(),x.wrapper=e,x.slides=e.querySelector(".slides"),window.addEventListener("load",me,!1);let n=a.getQueryHash();var o,l;return void 0!==n.dependencies&&delete n.dependencies,s={...r,...t,...n},o=[],l=0,s.dependencies.forEach(e=>{e.condition&&!e.condition()||(e.async?N.push(e):o.push(e))}),o.length?(l=o.length,o.forEach(e=>{V(e.src,(function(){"function"==typeof e.callback&&e.callback(),0==--l&&F()}))})):F(),a}()};window.Reveal=i,window.Reveal.initialize=e=>{window.Reveal=new i(document.querySelector(".reveal"),e)}}]);
\ No newline at end of file
diff --git a/js/config.js b/js/config.js
new file mode 100644
index 0000000..78c77c0
--- /dev/null
+++ b/js/config.js
@@ -0,0 +1,281 @@
+/**
+ * The default reveal.js config object.
+ */
+export default {
+
+ // The "normal" size of the presentation, aspect ratio will be preserved
+ // when the presentation is scaled to fit different resolutions
+ width: 960,
+ height: 700,
+
+ // Factor of the display size that should remain empty around the content
+ margin: 0.04,
+
+ // Bounds for smallest/largest possible scale to apply to content
+ minScale: 0.2,
+ maxScale: 2.0,
+
+ // Display presentation control arrows
+ controls: true,
+
+ // Help the user learn the controls by providing hints, for example by
+ // bouncing the down arrow when they first encounter a vertical slide
+ controlsTutorial: true,
+
+ // Determines where controls appear, "edges" or "bottom-right"
+ controlsLayout: 'bottom-right',
+
+ // Visibility rule for backwards navigation arrows; "faded", "hidden"
+ // or "visible"
+ controlsBackArrows: 'faded',
+
+ // Display a presentation progress bar
+ progress: true,
+
+ // Display the page number of the current slide
+ // - true: Show slide number
+ // - false: Hide slide number
+ //
+ // Can optionally be set as a string that specifies the number formatting:
+ // - "h.v": Horizontal . vertical slide number (default)
+ // - "h/v": Horizontal / vertical slide number
+ // - "c": Flattened slide number
+ // - "c/t": Flattened slide number / total slides
+ //
+ // Alternatively, you can provide a function that returns the slide
+ // number for the current slide. The function should take in a slide
+ // object and return an array with one string [slideNumber] or
+ // three strings [n1,delimiter,n2]. See #formatSlideNumber().
+ slideNumber: false,
+
+ // Can be used to limit the contexts in which the slide number appears
+ // - "all": Always show the slide number
+ // - "print": Only when printing to PDF
+ // - "speaker": Only in the speaker view
+ showSlideNumber: 'all',
+
+ // Use 1 based indexing for # links to match slide number (default is zero
+ // based)
+ hashOneBasedIndex: false,
+
+ // Add the current slide number to the URL hash so that reloading the
+ // page/copying the URL will return you to the same slide
+ hash: false,
+
+ // Push each slide change to the browser history. Implies `hash: true`
+ history: false,
+
+ // Enable keyboard shortcuts for navigation
+ keyboard: true,
+
+ // Optional function that blocks keyboard events when retuning false
+ keyboardCondition: null,
+
+ // Enable the slide overview mode
+ overview: true,
+
+ // Disables the default reveal.js slide layout so that you can use
+ // custom CSS layout
+ disableLayout: false,
+
+ // Vertical centering of slides
+ center: true,
+
+ // Enables touch navigation on devices with touch input
+ touch: true,
+
+ // Loop the presentation
+ loop: false,
+
+ // Change the presentation direction to be RTL
+ rtl: false,
+
+ // Changes the behavior of our navigation directions.
+ //
+ // "default"
+ // Left/right arrow keys step between horizontal slides, up/down
+ // arrow keys step between vertical slides. Space key steps through
+ // all slides (both horizontal and vertical).
+ //
+ // "linear"
+ // Removes the up/down arrows. Left/right arrows step through all
+ // slides (both horizontal and vertical).
+ //
+ // "grid"
+ // When this is enabled, stepping left/right from a vertical stack
+ // to an adjacent vertical stack will land you at the same vertical
+ // index.
+ //
+ // Consider a deck with six slides ordered in two vertical stacks:
+ // 1.1 2.1
+ // 1.2 2.2
+ // 1.3 2.3
+ //
+ // If you're on slide 1.3 and navigate right, you will normally move
+ // from 1.3 -> 2.1. If "grid" is used, the same navigation takes you
+ // from 1.3 -> 2.3.
+ navigationMode: 'default',
+
+ // Randomizes the order of slides each time the presentation loads
+ shuffle: false,
+
+ // Turns fragments on and off globally
+ fragments: true,
+
+ // Flags whether to include the current fragment in the URL,
+ // so that reloading brings you to the same fragment position
+ fragmentInURL: false,
+
+ // Flags if the presentation is running in an embedded mode,
+ // i.e. contained within a limited portion of the screen
+ embedded: false,
+
+ // Flags if we should show a help overlay when the question-mark
+ // key is pressed
+ help: true,
+
+ // Flags if it should be possible to pause the presentation (blackout)
+ pause: true,
+
+ // Flags if speaker notes should be visible to all viewers
+ showNotes: false,
+
+ // Global override for autolaying embedded media (video/audio/iframe)
+ // - null: Media will only autoplay if data-autoplay is present
+ // - true: All media will autoplay, regardless of individual setting
+ // - false: No media will autoplay, regardless of individual setting
+ autoPlayMedia: null,
+
+ // Global override for preloading lazy-loaded iframes
+ // - null: Iframes with data-src AND data-preload will be loaded when within
+ // the viewDistance, iframes with only data-src will be loaded when visible
+ // - true: All iframes with data-src will be loaded when within the viewDistance
+ // - false: All iframes with data-src will be loaded only when visible
+ preloadIframes: null,
+
+ // Can be used to globally disable auto-animation
+ autoAnimate: true,
+
+ // Optionally provide a custom element matcher that will be
+ // used to dictate which elements we can animate between.
+ autoAnimateMatcher: null,
+
+ // Default settings for our auto-animate transitions, can be
+ // overridden per-slide or per-element via data arguments
+ autoAnimateEasing: 'ease',
+ autoAnimateDuration: 1.0,
+ autoAnimateUnmatched: true,
+
+ // CSS properties that can be auto-animated. Position & scale
+ // is matched separately so there's no need to include styles
+ // like top/right/bottom/left, width/height or margin.
+ autoAnimateStyles: [
+ 'opacity',
+ 'color',
+ 'background-color',
+ 'padding',
+ 'font-size',
+ 'line-height',
+ 'letter-spacing',
+ 'border-width',
+ 'border-color',
+ 'border-radius',
+ 'outline',
+ 'outline-offset'
+ ],
+
+ // Controls automatic progression to the next slide
+ // - 0: Auto-sliding only happens if the data-autoslide HTML attribute
+ // is present on the current slide or fragment
+ // - 1+: All slides will progress automatically at the given interval
+ // - false: No auto-sliding, even if data-autoslide is present
+ autoSlide: 0,
+
+ // Stop auto-sliding after user input
+ autoSlideStoppable: true,
+
+ // Use this method for navigation when auto-sliding (defaults to navigateNext)
+ autoSlideMethod: null,
+
+ // Specify the average time in seconds that you think you will spend
+ // presenting each slide. This is used to show a pacing timer in the
+ // speaker view
+ defaultTiming: null,
+
+ // Enable slide navigation via mouse wheel
+ mouseWheel: false,
+
+ // Opens links in an iframe preview overlay
+ // Add `data-preview-link` and `data-preview-link="false"` to customise each link
+ // individually
+ previewLinks: false,
+
+ // Exposes the reveal.js API through window.postMessage
+ postMessage: true,
+
+ // Dispatches all reveal.js events to the parent window through postMessage
+ postMessageEvents: false,
+
+ // Focuses body when page changes visibility to ensure keyboard shortcuts work
+ focusBodyOnPageVisibilityChange: true,
+
+ // Transition style
+ transition: 'slide', // none/fade/slide/convex/concave/zoom
+
+ // Transition speed
+ transitionSpeed: 'default', // default/fast/slow
+
+ // Transition style for full page slide backgrounds
+ backgroundTransition: 'fade', // none/fade/slide/convex/concave/zoom
+
+ // Parallax background image
+ parallaxBackgroundImage: '', // CSS syntax, e.g. "a.jpg"
+
+ // Parallax background size
+ parallaxBackgroundSize: '', // CSS syntax, e.g. "3000px 2000px"
+
+ // Parallax background repeat
+ parallaxBackgroundRepeat: '', // repeat/repeat-x/repeat-y/no-repeat/initial/inherit
+
+ // Parallax background position
+ parallaxBackgroundPosition: '', // CSS syntax, e.g. "top left"
+
+ // Amount of pixels to move the parallax background per slide step
+ parallaxBackgroundHorizontal: null,
+ parallaxBackgroundVertical: null,
+
+ // The maximum number of pages a single slide can expand onto when printing
+ // to PDF, unlimited by default
+ pdfMaxPagesPerSlide: Number.POSITIVE_INFINITY,
+
+ // Prints each fragment on a separate slide
+ pdfSeparateFragments: true,
+
+ // Offset used to reduce the height of content within exported PDF pages.
+ // This exists to account for environment differences based on how you
+ // print to PDF. CLI printing options, like phantomjs and wkpdf, can end
+ // on precisely the total height of the document whereas in-browser
+ // printing has to end one pixel before.
+ pdfPageHeightOffset: -1,
+
+ // Number of slides away from the current that are visible
+ viewDistance: 3,
+
+ // Number of slides away from the current that are visible on mobile
+ // devices. It is advisable to set this to a lower number than
+ // viewDistance in order to save resources.
+ mobileViewDistance: 2,
+
+ // The display mode that will be used to show slides
+ display: 'block',
+
+ // Hide cursor if inactive
+ hideInactiveCursor: true,
+
+ // Time before the cursor is hidden (in ms)
+ hideCursorTime: 5000,
+
+ // Script dependencies to load
+ dependencies: []
+
+}
\ No newline at end of file
diff --git a/js/reveal.js b/js/reveal.js
index afa3567..e73cca9 100644
--- a/js/reveal.js
+++ b/js/reveal.js
@@ -1,4 +1,5 @@
import Playback from './components/playback.js'
+import defaultConfig from './config.js'
/**
* reveal.js
@@ -9,8 +10,6 @@ import Playback from './components/playback.js'
*/
export default function( revealElement, options ) {
- 'use strict';
-
let Reveal;
// The reveal.js version
@@ -27,284 +26,7 @@ export default function( revealElement, options ) {
const POST_MESSAGE_METHOD_BLACKLIST = /registerPlugin|registerKeyboardShortcut|addKeyBinding|addEventListener/;
// Configuration defaults, can be overridden at initialization time
- let config = {
-
- // The "normal" size of the presentation, aspect ratio will be preserved
- // when the presentation is scaled to fit different resolutions
- width: 960,
- height: 700,
-
- // Factor of the display size that should remain empty around the content
- margin: 0.04,
-
- // Bounds for smallest/largest possible scale to apply to content
- minScale: 0.2,
- maxScale: 2.0,
-
- // Display presentation control arrows
- controls: true,
-
- // Help the user learn the controls by providing hints, for example by
- // bouncing the down arrow when they first encounter a vertical slide
- controlsTutorial: true,
-
- // Determines where controls appear, "edges" or "bottom-right"
- controlsLayout: 'bottom-right',
-
- // Visibility rule for backwards navigation arrows; "faded", "hidden"
- // or "visible"
- controlsBackArrows: 'faded',
-
- // Display a presentation progress bar
- progress: true,
-
- // Display the page number of the current slide
- // - true: Show slide number
- // - false: Hide slide number
- //
- // Can optionally be set as a string that specifies the number formatting:
- // - "h.v": Horizontal . vertical slide number (default)
- // - "h/v": Horizontal / vertical slide number
- // - "c": Flattened slide number
- // - "c/t": Flattened slide number / total slides
- //
- // Alternatively, you can provide a function that returns the slide
- // number for the current slide. The function should take in a slide
- // object and return an array with one string [slideNumber] or
- // three strings [n1,delimiter,n2]. See #formatSlideNumber().
- slideNumber: false,
-
- // Can be used to limit the contexts in which the slide number appears
- // - "all": Always show the slide number
- // - "print": Only when printing to PDF
- // - "speaker": Only in the speaker view
- showSlideNumber: 'all',
-
- // Use 1 based indexing for # links to match slide number (default is zero
- // based)
- hashOneBasedIndex: false,
-
- // Add the current slide number to the URL hash so that reloading the
- // page/copying the URL will return you to the same slide
- hash: false,
-
- // Push each slide change to the browser history. Implies `hash: true`
- history: false,
-
- // Enable keyboard shortcuts for navigation
- keyboard: true,
-
- // Optional function that blocks keyboard events when retuning false
- keyboardCondition: null,
-
- // Enable the slide overview mode
- overview: true,
-
- // Disables the default reveal.js slide layout so that you can use
- // custom CSS layout
- disableLayout: false,
-
- // Vertical centering of slides
- center: true,
-
- // Enables touch navigation on devices with touch input
- touch: true,
-
- // Loop the presentation
- loop: false,
-
- // Change the presentation direction to be RTL
- rtl: false,
-
- // Changes the behavior of our navigation directions.
- //
- // "default"
- // Left/right arrow keys step between horizontal slides, up/down
- // arrow keys step between vertical slides. Space key steps through
- // all slides (both horizontal and vertical).
- //
- // "linear"
- // Removes the up/down arrows. Left/right arrows step through all
- // slides (both horizontal and vertical).
- //
- // "grid"
- // When this is enabled, stepping left/right from a vertical stack
- // to an adjacent vertical stack will land you at the same vertical
- // index.
- //
- // Consider a deck with six slides ordered in two vertical stacks:
- // 1.1 2.1
- // 1.2 2.2
- // 1.3 2.3
- //
- // If you're on slide 1.3 and navigate right, you will normally move
- // from 1.3 -> 2.1. If "grid" is used, the same navigation takes you
- // from 1.3 -> 2.3.
- navigationMode: 'default',
-
- // Randomizes the order of slides each time the presentation loads
- shuffle: false,
-
- // Turns fragments on and off globally
- fragments: true,
-
- // Flags whether to include the current fragment in the URL,
- // so that reloading brings you to the same fragment position
- fragmentInURL: false,
-
- // Flags if the presentation is running in an embedded mode,
- // i.e. contained within a limited portion of the screen
- embedded: false,
-
- // Flags if we should show a help overlay when the question-mark
- // key is pressed
- help: true,
-
- // Flags if it should be possible to pause the presentation (blackout)
- pause: true,
-
- // Flags if speaker notes should be visible to all viewers
- showNotes: false,
-
- // Global override for autolaying embedded media (video/audio/iframe)
- // - null: Media will only autoplay if data-autoplay is present
- // - true: All media will autoplay, regardless of individual setting
- // - false: No media will autoplay, regardless of individual setting
- autoPlayMedia: null,
-
- // Global override for preloading lazy-loaded iframes
- // - null: Iframes with data-src AND data-preload will be loaded when within
- // the viewDistance, iframes with only data-src will be loaded when visible
- // - true: All iframes with data-src will be loaded when within the viewDistance
- // - false: All iframes with data-src will be loaded only when visible
- preloadIframes: null,
-
- // Can be used to globally disable auto-animation
- autoAnimate: true,
-
- // Optionally provide a custom element matcher that will be
- // used to dictate which elements we can animate between.
- autoAnimateMatcher: null,
-
- // Default settings for our auto-animate transitions, can be
- // overridden per-slide or per-element via data arguments
- autoAnimateEasing: 'ease',
- autoAnimateDuration: 1.0,
- autoAnimateUnmatched: true,
-
- // CSS properties that can be auto-animated. Position & scale
- // is matched separately so there's no need to include styles
- // like top/right/bottom/left, width/height or margin.
- autoAnimateStyles: [
- 'opacity',
- 'color',
- 'background-color',
- 'padding',
- 'font-size',
- 'line-height',
- 'letter-spacing',
- 'border-width',
- 'border-color',
- 'border-radius',
- 'outline',
- 'outline-offset'
- ],
-
- // Controls automatic progression to the next slide
- // - 0: Auto-sliding only happens if the data-autoslide HTML attribute
- // is present on the current slide or fragment
- // - 1+: All slides will progress automatically at the given interval
- // - false: No auto-sliding, even if data-autoslide is present
- autoSlide: 0,
-
- // Stop auto-sliding after user input
- autoSlideStoppable: true,
-
- // Use this method for navigation when auto-sliding (defaults to navigateNext)
- autoSlideMethod: null,
-
- // Specify the average time in seconds that you think you will spend
- // presenting each slide. This is used to show a pacing timer in the
- // speaker view
- defaultTiming: null,
-
- // Enable slide navigation via mouse wheel
- mouseWheel: false,
-
- // Opens links in an iframe preview overlay
- // Add `data-preview-link` and `data-preview-link="false"` to customise each link
- // individually
- previewLinks: false,
-
- // Exposes the reveal.js API through window.postMessage
- postMessage: true,
-
- // Dispatches all reveal.js events to the parent window through postMessage
- postMessageEvents: false,
-
- // Focuses body when page changes visibility to ensure keyboard shortcuts work
- focusBodyOnPageVisibilityChange: true,
-
- // Transition style
- transition: 'slide', // none/fade/slide/convex/concave/zoom
-
- // Transition speed
- transitionSpeed: 'default', // default/fast/slow
-
- // Transition style for full page slide backgrounds
- backgroundTransition: 'fade', // none/fade/slide/convex/concave/zoom
-
- // Parallax background image
- parallaxBackgroundImage: '', // CSS syntax, e.g. "a.jpg"
-
- // Parallax background size
- parallaxBackgroundSize: '', // CSS syntax, e.g. "3000px 2000px"
-
- // Parallax background repeat
- parallaxBackgroundRepeat: '', // repeat/repeat-x/repeat-y/no-repeat/initial/inherit
-
- // Parallax background position
- parallaxBackgroundPosition: '', // CSS syntax, e.g. "top left"
-
- // Amount of pixels to move the parallax background per slide step
- parallaxBackgroundHorizontal: null,
- parallaxBackgroundVertical: null,
-
- // The maximum number of pages a single slide can expand onto when printing
- // to PDF, unlimited by default
- pdfMaxPagesPerSlide: Number.POSITIVE_INFINITY,
-
- // Prints each fragment on a separate slide
- pdfSeparateFragments: true,
-
- // Offset used to reduce the height of content within exported PDF pages.
- // This exists to account for environment differences based on how you
- // print to PDF. CLI printing options, like phantomjs and wkpdf, can end
- // on precisely the total height of the document whereas in-browser
- // printing has to end one pixel before.
- pdfPageHeightOffset: -1,
-
- // Number of slides away from the current that are visible
- viewDistance: 3,
-
- // Number of slides away from the current that are visible on mobile
- // devices. It is advisable to set this to a lower number than
- // viewDistance in order to save resources.
- mobileViewDistance: 2,
-
- // The display mode that will be used to show slides
- display: 'block',
-
- // Hide cursor if inactive
- hideInactiveCursor: true,
-
- // Time before the cursor is hidden (in ms)
- hideCursorTime: 5000,
-
- // Script dependencies to load
- dependencies: []
-
- },
+ let config,
// Flags if reveal.js is loaded (has dispatched the 'ready' event)
loaded = false,
@@ -432,8 +154,7 @@ export default function( revealElement, options ) {
if( typeof query['dependencies'] !== 'undefined' ) delete query['dependencies'];
// Copy options over to our config object
- extend( config, options );
- extend( config, query );
+ config = {...defaultConfig, ...options, ...query}
// Loads dependencies and continues to #start() once done
load();