From 2b53e3e2ef985a01fecede6a5854428391d83726 Mon Sep 17 00:00:00 2001 From: Quentin Dufour Date: Fri, 26 Nov 2021 15:51:03 +0100 Subject: [PATCH] =?UTF-8?q?Ajout=20pr=C3=A9sentation=20et=20programme=20du?= =?UTF-8?q?=2011/12?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- content/_index.md | 9 +- content/programme/2021-11-13/index.md | 2 +- content/programme/2021-12-11/index.md | 23 + .../2021-11-13/garage/.github/FUNDING.yml | 1 + .../garage/.github/workflows/js.yml | 24 + .../2021-11-13/garage/.gitignore | 12 + .../2021-11-13/garage/.npmignore | 7 + .../2021-11-13/garage/CONTRIBUTING.md | 23 + .../presentations/2021-11-13/garage/LICENSE | 19 + .../presentations/2021-11-13/garage/README.md | 28 + .../2021-11-13/garage/css/layout.scss | 69 + .../2021-11-13/garage/css/print/paper.scss | 173 + .../2021-11-13/garage/css/print/pdf.scss | 156 + .../2021-11-13/garage/css/reveal.scss | 1821 ++ .../2021-11-13/garage/css/theme/README.md | 21 + .../garage/css/theme/source/beige.scss | 41 + .../garage/css/theme/source/black.scss | 46 + .../garage/css/theme/source/blood.scss | 87 + .../garage/css/theme/source/league.scss | 36 + .../garage/css/theme/source/moon.scss | 58 + .../garage/css/theme/source/night.scss | 37 + .../garage/css/theme/source/serif.scss | 38 + .../garage/css/theme/source/simple.scss | 40 + .../garage/css/theme/source/sky.scss | 49 + .../garage/css/theme/source/solarized.scss | 63 + .../garage/css/theme/source/white.scss | 46 + .../garage/css/theme/template/exposer.scss | 28 + .../garage/css/theme/template/mixins.scss | 45 + .../garage/css/theme/template/settings.scss | 45 + .../garage/css/theme/template/theme.scss | 331 + .../presentations/2021-11-13/garage/demo.html | 476 + .../2021-11-13/garage/dist/reset.css | 30 + .../2021-11-13/garage/dist/reveal.css | 8 + .../2021-11-13/garage/dist/reveal.esm.js | 9 + .../2021-11-13/garage/dist/reveal.js | 9 + .../2021-11-13/garage/dist/theme/beige.css | 364 + .../2021-11-13/garage/dist/theme/black.css | 357 + .../2021-11-13/garage/dist/theme/blood.css | 390 + .../dist/theme/fonts/league-gothic/LICENSE | 2 + .../fonts/league-gothic/league-gothic.css | 10 + .../fonts/league-gothic/league-gothic.eot | Bin 0 -> 25696 bytes .../fonts/league-gothic/league-gothic.ttf | Bin 0 -> 64256 bytes .../fonts/league-gothic/league-gothic.woff | Bin 0 -> 30764 bytes .../dist/theme/fonts/source-sans-pro/LICENSE | 45 + .../source-sans-pro-italic.eot | Bin 0 -> 75720 bytes .../source-sans-pro-italic.ttf | Bin 0 -> 238084 bytes .../source-sans-pro-italic.woff | Bin 0 -> 98556 bytes .../source-sans-pro-regular.eot | Bin 0 -> 88070 bytes .../source-sans-pro-regular.ttf | Bin 0 -> 288008 bytes .../source-sans-pro-regular.woff | Bin 0 -> 114324 bytes .../source-sans-pro-semibold.eot | Bin 0 -> 89897 bytes .../source-sans-pro-semibold.ttf | Bin 0 -> 284640 bytes .../source-sans-pro-semibold.woff | Bin 0 -> 115648 bytes .../source-sans-pro-semibolditalic.eot | Bin 0 -> 75706 bytes .../source-sans-pro-semibolditalic.ttf | Bin 0 -> 240944 bytes .../source-sans-pro-semibolditalic.woff | Bin 0 -> 98816 bytes .../fonts/source-sans-pro/source-sans-pro.css | 39 + .../2021-11-13/garage/dist/theme/league.css | 366 + .../2021-11-13/garage/dist/theme/moon.css | 365 + .../2021-11-13/garage/dist/theme/night.css | 358 + .../2021-11-13/garage/dist/theme/serif.css | 361 + .../2021-11-13/garage/dist/theme/simple.css | 360 + .../2021-11-13/garage/dist/theme/sky.css | 368 + .../garage/dist/theme/solarized.css | 361 + .../2021-11-13/garage/dist/theme/white.css | 357 + .../garage/examples/assets/beeping.txt | 2 + .../garage/examples/assets/beeping.wav | Bin 0 -> 422472 bytes .../garage/examples/assets/image1.png | Bin 0 -> 21991 bytes .../garage/examples/assets/image2.png | Bin 0 -> 10237 bytes .../garage/examples/auto-animate.html | 194 + .../garage/examples/backgrounds.html | 141 + .../2021-11-13/garage/examples/barebones.html | 32 + .../garage/examples/layout-helpers.html | 160 + .../2021-11-13/garage/examples/markdown.html | 142 + .../2021-11-13/garage/examples/markdown.md | 41 + .../2021-11-13/garage/examples/math.html | 206 + .../2021-11-13/garage/examples/media.html | 75 + .../examples/multiple-presentations.html | 102 + .../garage/examples/transitions.html | 97 + .../2021-11-13/garage/gulpfile.js | 314 + .../2021-11-13/garage/image/integrations.png | Bin 0 -> 166939 bytes .../2021-11-13/garage/index.html | 76 + .../garage/js/components/playback.js | 165 + .../2021-11-13/garage/js/config.js | 293 + .../garage/js/controllers/autoanimate.js | 626 + .../garage/js/controllers/backgrounds.js | 397 + .../garage/js/controllers/controls.js | 259 + .../2021-11-13/garage/js/controllers/focus.js | 97 + .../garage/js/controllers/fragments.js | 376 + .../garage/js/controllers/keyboard.js | 392 + .../garage/js/controllers/location.js | 215 + .../2021-11-13/garage/js/controllers/notes.js | 114 + .../garage/js/controllers/overview.js | 255 + .../garage/js/controllers/plugins.js | 241 + .../garage/js/controllers/pointer.js | 118 + .../2021-11-13/garage/js/controllers/print.js | 212 + .../garage/js/controllers/progress.js | 105 + .../garage/js/controllers/slidecontent.js | 474 + .../garage/js/controllers/slidenumber.js | 126 + .../2021-11-13/garage/js/controllers/touch.js | 263 + .../2021-11-13/garage/js/index.js | 58 + .../2021-11-13/garage/js/reveal.js | 2688 +++ .../2021-11-13/garage/js/utils/color.js | 77 + .../2021-11-13/garage/js/utils/constants.js | 10 + .../2021-11-13/garage/js/utils/device.js | 15 + .../2021-11-13/garage/js/utils/loader.js | 46 + .../2021-11-13/garage/js/utils/util.js | 282 + .../2021-11-13/garage/package-lock.json | 17223 ++++++++++++++++ .../2021-11-13/garage/package.json | 100 + .../garage/plugin/highlight/highlight.esm.js | 5 + .../garage/plugin/highlight/highlight.js | 5 + .../garage/plugin/highlight/monokai.css | 71 + .../garage/plugin/highlight/plugin.js | 439 + .../garage/plugin/highlight/zenburn.css | 80 + .../garage/plugin/markdown/markdown.esm.js | 1 + .../garage/plugin/markdown/markdown.js | 1 + .../garage/plugin/markdown/plugin.js | 475 + .../2021-11-13/garage/plugin/math/katex.js | 96 + .../2021-11-13/garage/plugin/math/math.esm.js | 1 + .../2021-11-13/garage/plugin/math/math.js | 1 + .../2021-11-13/garage/plugin/math/mathjax2.js | 89 + .../2021-11-13/garage/plugin/math/mathjax3.js | 77 + .../2021-11-13/garage/plugin/math/plugin.js | 15 + .../garage/plugin/notes/notes.esm.js | 1 + .../2021-11-13/garage/plugin/notes/notes.js | 1 + .../2021-11-13/garage/plugin/notes/plugin.js | 184 + .../garage/plugin/notes/speaker-view.html | 852 + .../2021-11-13/garage/plugin/search/plugin.js | 243 + .../garage/plugin/search/search.esm.js | 7 + .../2021-11-13/garage/plugin/search/search.js | 7 + .../2021-11-13/garage/plugin/zoom/plugin.js | 279 + .../2021-11-13/garage/plugin/zoom/zoom.esm.js | 4 + .../2021-11-13/garage/plugin/zoom/zoom.js | 4 + .../garage/test/assets/external-script-a.js | 1 + .../garage/test/assets/external-script-b.js | 1 + .../garage/test/assets/external-script-c.js | 1 + .../garage/test/assets/external-script-d.js | 1 + .../2021-11-13/garage/test/simple.md | 12 + .../garage/test/test-auto-animate.html | 166 + .../garage/test/test-dependencies-async.html | 77 + .../garage/test/test-dependencies.html | 51 + .../garage/test/test-grid-navigation.html | 71 + .../garage/test/test-iframe-backgrounds.html | 98 + .../2021-11-13/garage/test/test-iframes.html | 102 + .../2021-11-13/garage/test/test-markdown.html | 480 + .../test/test-multiple-instances-es5.html | 85 + .../garage/test/test-multiple-instances.html | 103 + .../2021-11-13/garage/test/test-pdf.html | 92 + .../2021-11-13/garage/test/test-plugins.html | 107 + .../2021-11-13/garage/test/test-state.html | 136 + .../2021-11-13/garage/test/test.html | 898 + .../garage/video/00-setup-garage.mp4 | Bin 0 -> 8491240 bytes .../2021-11-13/garage/video/01-hugo.mp4 | Bin 0 -> 3270451 bytes .../2021-11-13/garage/video/02-restic.mp4 | Bin 0 -> 2093799 bytes .../2021-11-13/garage/video/03-nextcloud.mp4 | Bin 0 -> 4650925 bytes .../2021-11-13/garage/video/04-peertube.mp4 | Bin 0 -> 16539021 bytes 156 files changed, 40238 insertions(+), 4 deletions(-) create mode 100644 content/programme/2021-12-11/index.md create mode 100644 static/presentations/2021-11-13/garage/.github/FUNDING.yml create mode 100644 static/presentations/2021-11-13/garage/.github/workflows/js.yml create mode 100644 static/presentations/2021-11-13/garage/.gitignore create mode 100644 static/presentations/2021-11-13/garage/.npmignore create mode 100644 static/presentations/2021-11-13/garage/CONTRIBUTING.md create mode 100644 static/presentations/2021-11-13/garage/LICENSE create mode 100644 static/presentations/2021-11-13/garage/README.md create mode 100644 static/presentations/2021-11-13/garage/css/layout.scss create mode 100644 static/presentations/2021-11-13/garage/css/print/paper.scss create mode 100644 static/presentations/2021-11-13/garage/css/print/pdf.scss create mode 100644 static/presentations/2021-11-13/garage/css/reveal.scss create mode 100644 static/presentations/2021-11-13/garage/css/theme/README.md create mode 100644 static/presentations/2021-11-13/garage/css/theme/source/beige.scss create mode 100644 static/presentations/2021-11-13/garage/css/theme/source/black.scss create mode 100644 static/presentations/2021-11-13/garage/css/theme/source/blood.scss create mode 100644 static/presentations/2021-11-13/garage/css/theme/source/league.scss create mode 100644 static/presentations/2021-11-13/garage/css/theme/source/moon.scss create mode 100644 static/presentations/2021-11-13/garage/css/theme/source/night.scss create mode 100644 static/presentations/2021-11-13/garage/css/theme/source/serif.scss create mode 100644 static/presentations/2021-11-13/garage/css/theme/source/simple.scss create mode 100644 static/presentations/2021-11-13/garage/css/theme/source/sky.scss create mode 100644 static/presentations/2021-11-13/garage/css/theme/source/solarized.scss create mode 100644 static/presentations/2021-11-13/garage/css/theme/source/white.scss create mode 100644 static/presentations/2021-11-13/garage/css/theme/template/exposer.scss create mode 100644 static/presentations/2021-11-13/garage/css/theme/template/mixins.scss create mode 100644 static/presentations/2021-11-13/garage/css/theme/template/settings.scss create mode 100644 static/presentations/2021-11-13/garage/css/theme/template/theme.scss create mode 100644 static/presentations/2021-11-13/garage/demo.html create mode 100644 static/presentations/2021-11-13/garage/dist/reset.css create mode 100644 static/presentations/2021-11-13/garage/dist/reveal.css create mode 100644 static/presentations/2021-11-13/garage/dist/reveal.esm.js create mode 100644 static/presentations/2021-11-13/garage/dist/reveal.js create mode 100644 static/presentations/2021-11-13/garage/dist/theme/beige.css create mode 100644 static/presentations/2021-11-13/garage/dist/theme/black.css create mode 100644 static/presentations/2021-11-13/garage/dist/theme/blood.css create mode 100644 static/presentations/2021-11-13/garage/dist/theme/fonts/league-gothic/LICENSE create mode 100644 static/presentations/2021-11-13/garage/dist/theme/fonts/league-gothic/league-gothic.css create mode 100755 static/presentations/2021-11-13/garage/dist/theme/fonts/league-gothic/league-gothic.eot create mode 100755 static/presentations/2021-11-13/garage/dist/theme/fonts/league-gothic/league-gothic.ttf create mode 100755 static/presentations/2021-11-13/garage/dist/theme/fonts/league-gothic/league-gothic.woff create mode 100644 static/presentations/2021-11-13/garage/dist/theme/fonts/source-sans-pro/LICENSE create mode 100755 static/presentations/2021-11-13/garage/dist/theme/fonts/source-sans-pro/source-sans-pro-italic.eot create mode 100755 static/presentations/2021-11-13/garage/dist/theme/fonts/source-sans-pro/source-sans-pro-italic.ttf create mode 100755 static/presentations/2021-11-13/garage/dist/theme/fonts/source-sans-pro/source-sans-pro-italic.woff create mode 100755 static/presentations/2021-11-13/garage/dist/theme/fonts/source-sans-pro/source-sans-pro-regular.eot create mode 100755 static/presentations/2021-11-13/garage/dist/theme/fonts/source-sans-pro/source-sans-pro-regular.ttf create mode 100755 static/presentations/2021-11-13/garage/dist/theme/fonts/source-sans-pro/source-sans-pro-regular.woff create mode 100755 static/presentations/2021-11-13/garage/dist/theme/fonts/source-sans-pro/source-sans-pro-semibold.eot create mode 100755 static/presentations/2021-11-13/garage/dist/theme/fonts/source-sans-pro/source-sans-pro-semibold.ttf create mode 100755 static/presentations/2021-11-13/garage/dist/theme/fonts/source-sans-pro/source-sans-pro-semibold.woff create mode 100755 static/presentations/2021-11-13/garage/dist/theme/fonts/source-sans-pro/source-sans-pro-semibolditalic.eot create mode 100755 static/presentations/2021-11-13/garage/dist/theme/fonts/source-sans-pro/source-sans-pro-semibolditalic.ttf create mode 100755 static/presentations/2021-11-13/garage/dist/theme/fonts/source-sans-pro/source-sans-pro-semibolditalic.woff create mode 100644 static/presentations/2021-11-13/garage/dist/theme/fonts/source-sans-pro/source-sans-pro.css create mode 100644 static/presentations/2021-11-13/garage/dist/theme/league.css create mode 100644 static/presentations/2021-11-13/garage/dist/theme/moon.css create mode 100644 static/presentations/2021-11-13/garage/dist/theme/night.css create mode 100644 static/presentations/2021-11-13/garage/dist/theme/serif.css create mode 100644 static/presentations/2021-11-13/garage/dist/theme/simple.css create mode 100644 static/presentations/2021-11-13/garage/dist/theme/sky.css create mode 100644 static/presentations/2021-11-13/garage/dist/theme/solarized.css create mode 100644 static/presentations/2021-11-13/garage/dist/theme/white.css create mode 100644 static/presentations/2021-11-13/garage/examples/assets/beeping.txt create mode 100644 static/presentations/2021-11-13/garage/examples/assets/beeping.wav create mode 100644 static/presentations/2021-11-13/garage/examples/assets/image1.png create mode 100644 static/presentations/2021-11-13/garage/examples/assets/image2.png create mode 100644 static/presentations/2021-11-13/garage/examples/auto-animate.html create mode 100644 static/presentations/2021-11-13/garage/examples/backgrounds.html create mode 100644 static/presentations/2021-11-13/garage/examples/barebones.html create mode 100644 static/presentations/2021-11-13/garage/examples/layout-helpers.html create mode 100644 static/presentations/2021-11-13/garage/examples/markdown.html create mode 100644 static/presentations/2021-11-13/garage/examples/markdown.md create mode 100644 static/presentations/2021-11-13/garage/examples/math.html create mode 100644 static/presentations/2021-11-13/garage/examples/media.html create mode 100644 static/presentations/2021-11-13/garage/examples/multiple-presentations.html create mode 100644 static/presentations/2021-11-13/garage/examples/transitions.html create mode 100644 static/presentations/2021-11-13/garage/gulpfile.js create mode 100644 static/presentations/2021-11-13/garage/image/integrations.png create mode 100644 static/presentations/2021-11-13/garage/index.html create mode 100644 static/presentations/2021-11-13/garage/js/components/playback.js create mode 100644 static/presentations/2021-11-13/garage/js/config.js create mode 100644 static/presentations/2021-11-13/garage/js/controllers/autoanimate.js create mode 100644 static/presentations/2021-11-13/garage/js/controllers/backgrounds.js create mode 100644 static/presentations/2021-11-13/garage/js/controllers/controls.js create mode 100644 static/presentations/2021-11-13/garage/js/controllers/focus.js create mode 100644 static/presentations/2021-11-13/garage/js/controllers/fragments.js create mode 100644 static/presentations/2021-11-13/garage/js/controllers/keyboard.js create mode 100644 static/presentations/2021-11-13/garage/js/controllers/location.js create mode 100644 static/presentations/2021-11-13/garage/js/controllers/notes.js create mode 100644 static/presentations/2021-11-13/garage/js/controllers/overview.js create mode 100644 static/presentations/2021-11-13/garage/js/controllers/plugins.js create mode 100644 static/presentations/2021-11-13/garage/js/controllers/pointer.js create mode 100644 static/presentations/2021-11-13/garage/js/controllers/print.js create mode 100644 static/presentations/2021-11-13/garage/js/controllers/progress.js create mode 100644 static/presentations/2021-11-13/garage/js/controllers/slidecontent.js create mode 100644 static/presentations/2021-11-13/garage/js/controllers/slidenumber.js create mode 100644 static/presentations/2021-11-13/garage/js/controllers/touch.js create mode 100644 static/presentations/2021-11-13/garage/js/index.js create mode 100644 static/presentations/2021-11-13/garage/js/reveal.js create mode 100644 static/presentations/2021-11-13/garage/js/utils/color.js create mode 100644 static/presentations/2021-11-13/garage/js/utils/constants.js create mode 100644 static/presentations/2021-11-13/garage/js/utils/device.js create mode 100644 static/presentations/2021-11-13/garage/js/utils/loader.js create mode 100644 static/presentations/2021-11-13/garage/js/utils/util.js create mode 100644 static/presentations/2021-11-13/garage/package-lock.json create mode 100644 static/presentations/2021-11-13/garage/package.json create mode 100644 static/presentations/2021-11-13/garage/plugin/highlight/highlight.esm.js create mode 100644 static/presentations/2021-11-13/garage/plugin/highlight/highlight.js create mode 100644 static/presentations/2021-11-13/garage/plugin/highlight/monokai.css create mode 100644 static/presentations/2021-11-13/garage/plugin/highlight/plugin.js create mode 100644 static/presentations/2021-11-13/garage/plugin/highlight/zenburn.css create mode 100644 static/presentations/2021-11-13/garage/plugin/markdown/markdown.esm.js create mode 100644 static/presentations/2021-11-13/garage/plugin/markdown/markdown.js create mode 100755 static/presentations/2021-11-13/garage/plugin/markdown/plugin.js create mode 100755 static/presentations/2021-11-13/garage/plugin/math/katex.js create mode 100644 static/presentations/2021-11-13/garage/plugin/math/math.esm.js create mode 100644 static/presentations/2021-11-13/garage/plugin/math/math.js create mode 100644 static/presentations/2021-11-13/garage/plugin/math/mathjax2.js create mode 100644 static/presentations/2021-11-13/garage/plugin/math/mathjax3.js create mode 100644 static/presentations/2021-11-13/garage/plugin/math/plugin.js create mode 100644 static/presentations/2021-11-13/garage/plugin/notes/notes.esm.js create mode 100644 static/presentations/2021-11-13/garage/plugin/notes/notes.js create mode 100644 static/presentations/2021-11-13/garage/plugin/notes/plugin.js create mode 100644 static/presentations/2021-11-13/garage/plugin/notes/speaker-view.html create mode 100644 static/presentations/2021-11-13/garage/plugin/search/plugin.js create mode 100644 static/presentations/2021-11-13/garage/plugin/search/search.esm.js create mode 100644 static/presentations/2021-11-13/garage/plugin/search/search.js create mode 100644 static/presentations/2021-11-13/garage/plugin/zoom/plugin.js create mode 100644 static/presentations/2021-11-13/garage/plugin/zoom/zoom.esm.js create mode 100644 static/presentations/2021-11-13/garage/plugin/zoom/zoom.js create mode 100644 static/presentations/2021-11-13/garage/test/assets/external-script-a.js create mode 100644 static/presentations/2021-11-13/garage/test/assets/external-script-b.js create mode 100644 static/presentations/2021-11-13/garage/test/assets/external-script-c.js create mode 100644 static/presentations/2021-11-13/garage/test/assets/external-script-d.js create mode 100644 static/presentations/2021-11-13/garage/test/simple.md create mode 100644 static/presentations/2021-11-13/garage/test/test-auto-animate.html create mode 100644 static/presentations/2021-11-13/garage/test/test-dependencies-async.html create mode 100644 static/presentations/2021-11-13/garage/test/test-dependencies.html create mode 100644 static/presentations/2021-11-13/garage/test/test-grid-navigation.html create mode 100644 static/presentations/2021-11-13/garage/test/test-iframe-backgrounds.html create mode 100644 static/presentations/2021-11-13/garage/test/test-iframes.html create mode 100644 static/presentations/2021-11-13/garage/test/test-markdown.html create mode 100644 static/presentations/2021-11-13/garage/test/test-multiple-instances-es5.html create mode 100644 static/presentations/2021-11-13/garage/test/test-multiple-instances.html create mode 100644 static/presentations/2021-11-13/garage/test/test-pdf.html create mode 100644 static/presentations/2021-11-13/garage/test/test-plugins.html create mode 100644 static/presentations/2021-11-13/garage/test/test-state.html create mode 100644 static/presentations/2021-11-13/garage/test/test.html create mode 100644 static/presentations/2021-11-13/garage/video/00-setup-garage.mp4 create mode 100644 static/presentations/2021-11-13/garage/video/01-hugo.mp4 create mode 100644 static/presentations/2021-11-13/garage/video/02-restic.mp4 create mode 100644 static/presentations/2021-11-13/garage/video/03-nextcloud.mp4 create mode 100644 static/presentations/2021-11-13/garage/video/04-peertube.mp4 diff --git a/content/_index.md b/content/_index.md index 5fda67b..f8a32a7 100644 --- a/content/_index.md +++ b/content/_index.md @@ -3,13 +3,15 @@ title: "Rencontres Francophones de l'Infonuagique Décentralisée" date: 2018-11-28T15:14:39+10:00 --- -Tous les deuxièmes samedi du mois, pendant une heure, nous discutons des enjeux techniques de la création d'un Internet plus décentralisé et éthique. +Ces rencontres ont pour but de discuter des enjeux techniques de la création d'un Internet plus décentralisé et éthique. -Chaque rencontre est composée de présentations de 10 minutes suivies d'un échange. Tout le monde est bienvenu, aucune inscription n'est nécessaire. +Généralement le 2ème samedi du mois, nous proposons soit une session présentation (3x10 minutes suivies d'un échange), soit un atelier. + +Tout le monde est bienvenu, aucune inscription n'est nécessaire. ## Prochaine rencontre -Samedi 13 novembre 2021 - 10h à Québec - 16h à Paris +Samedi 11 décembre 2021 - 10h à Québec - 16h à Paris Rendez-vous sur https://jitsi.fedi.quebec/infonuagique ## Organisation @@ -38,3 +40,4 @@ Rendez-vous sur https://jitsi.fedi.quebec/infonuagique Pour rejoindre la liste de diffusion, nous poser des questions, proposer un sujet ou juste discuter, écrivez-nous à : rfid-organisation (arobase) deuxfleurs.fr +Vous nous avons également un salon de discussion décentralisé accessible depuis [Matrix](https://matrix.to/#/#rfid:deuxfleurs.fr), le [Rocketchat de Drave](https://rocketchat.drave.quebec/) et le [Discord de La Console](https://discord.com/invite/YJ9q3D24Hf). diff --git a/content/programme/2021-11-13/index.md b/content/programme/2021-11-13/index.md index 75417da..453ca85 100644 --- a/content/programme/2021-11-13/index.md +++ b/content/programme/2021-11-13/index.md @@ -1,5 +1,5 @@ --- -title: (Archive) 13 novembre 2021 - Fondations pour le décentralisé +title: (Archive, Présentation) 13 novembre 2021 - Fondations pour le décentralisé summary: "Présentations de l'identité souveraine par Drave, du cluster kubernetes autre/entre hébergé par TeDomum et du logiciel de stockage d'objet, alternative à AWS S3, par Deuxfleurs." --- diff --git a/content/programme/2021-12-11/index.md b/content/programme/2021-12-11/index.md new file mode 100644 index 0000000..55717ce --- /dev/null +++ b/content/programme/2021-12-11/index.md @@ -0,0 +1,23 @@ +--- +title: (Atelier) 11 décembre 2021 - Atelier convergence +summary: "Faire converger notre savoir-faire en gestion d'identité, orchestrateurs et clusters." +--- + +**Date** - Samedi 11 Décembre 2021 +**Heure** - 10h à Québec, 16h à Paris +**Durée** - Environ 2h +**Lieu** - En visio sur le Jitsi de Fédi Québec : [https://jitsi.fedi.quebec/infonuagique](https://jitsi.fedi.quebec/infonuagique) + +--- + +Atelier à définir, date à confirmer. + +Pistes envisagées : + + - Convergence identité souveraine et [hiboo](https://acides.org/docs/hiboo/) + - Explorer OpenID Connect — Self-Issued Identity Provider (OIDC - SIOP) + - Réaliser un déploiement de test entre nos infras + + - Intégrer Garage dans k8s (eg. hepto) + - Voir ce qu'on peut faire de [csi-s3](https://github.com/ctrox/csi-s3) + - Créer les fichiers helm & les intégrations nécessaires diff --git a/static/presentations/2021-11-13/garage/.github/FUNDING.yml b/static/presentations/2021-11-13/garage/.github/FUNDING.yml new file mode 100644 index 0000000..972831e --- /dev/null +++ b/static/presentations/2021-11-13/garage/.github/FUNDING.yml @@ -0,0 +1 @@ +github: [hakimel] diff --git a/static/presentations/2021-11-13/garage/.github/workflows/js.yml b/static/presentations/2021-11-13/garage/.github/workflows/js.yml new file mode 100644 index 0000000..d28e02d --- /dev/null +++ b/static/presentations/2021-11-13/garage/.github/workflows/js.yml @@ -0,0 +1,24 @@ +name: tests + +on: [push] + +jobs: + build: + + runs-on: ubuntu-latest + + strategy: + matrix: + node-version: [10.x, 14.x, 16.x] + + steps: + - uses: actions/checkout@v2 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v1 + with: + node-version: ${{ matrix.node-version }} + - run: npm install + - run: npm run build --if-present + - run: npm test + env: + CI: true diff --git a/static/presentations/2021-11-13/garage/.gitignore b/static/presentations/2021-11-13/garage/.gitignore new file mode 100644 index 0000000..7d986c3 --- /dev/null +++ b/static/presentations/2021-11-13/garage/.gitignore @@ -0,0 +1,12 @@ +.idea/ +*.iml +*.iws +*.eml +out/ +.DS_Store +.svn +log/*.log +tmp/** +node_modules/ +.sass-cache +dist/*.map \ No newline at end of file diff --git a/static/presentations/2021-11-13/garage/.npmignore b/static/presentations/2021-11-13/garage/.npmignore new file mode 100644 index 0000000..50c12b9 --- /dev/null +++ b/static/presentations/2021-11-13/garage/.npmignore @@ -0,0 +1,7 @@ +/test +/examples +.github +.gulpfile +.sass-cache +gulpfile.js +CONTRIBUTING.md \ No newline at end of file diff --git a/static/presentations/2021-11-13/garage/CONTRIBUTING.md b/static/presentations/2021-11-13/garage/CONTRIBUTING.md new file mode 100644 index 0000000..c2091e8 --- /dev/null +++ b/static/presentations/2021-11-13/garage/CONTRIBUTING.md @@ -0,0 +1,23 @@ +## Contributing + +Please keep the [issue tracker](http://github.com/hakimel/reveal.js/issues) limited to **bug reports**, **feature requests** and **pull requests**. + + +### Personal Support +If you have personal support or setup questions the best place to ask those are [StackOverflow](http://stackoverflow.com/questions/tagged/reveal.js). + + +### Bug Reports +When reporting a bug make sure to include information about which browser and operating system you are on as well as the necessary steps to reproduce the issue. If possible please include a link to a sample presentation where the bug can be tested. + + +### Pull Requests +- Should follow the coding style of the file you work in, most importantly: + - Tabs to indent + - Single-quoted strings +- Should be made towards the **dev branch** +- Should be submitted from a feature/topic branch (not your master) + + +### Plugins +Please do not submit plugins as pull requests. They should be maintained in their own separate repository. More information here: https://github.com/hakimel/reveal.js/wiki/Plugin-Guidelines diff --git a/static/presentations/2021-11-13/garage/LICENSE b/static/presentations/2021-11-13/garage/LICENSE new file mode 100644 index 0000000..807bc62 --- /dev/null +++ b/static/presentations/2021-11-13/garage/LICENSE @@ -0,0 +1,19 @@ +Copyright (C) 2011-2021 Hakim El Hattab, http://hakim.se, and reveal.js contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/static/presentations/2021-11-13/garage/README.md b/static/presentations/2021-11-13/garage/README.md new file mode 100644 index 0000000..5040ba2 --- /dev/null +++ b/static/presentations/2021-11-13/garage/README.md @@ -0,0 +1,28 @@ +

+ + reveal.js + +

+ + Slides +

+ +reveal.js is an open source HTML presentation framework. It enables anyone with a web browser to create fully featured and beautiful presentations for free. [Check out the live demo](https://revealjs.com/). + +The framework comes with a broad range of features including [nested slides](https://revealjs.com/vertical-slides/), [Markdown support](https://revealjs.com/markdown/), [Auto-Animate](https://revealjs.com/auto-animate/), [PDF export](https://revealjs.com/pdf-export/), [speaker notes](https://revealjs.com/speaker-view/), [LaTeX support](https://revealjs.com/math/), [syntax highlighted code](https://revealjs.com/code/) and much more. + +

+ Get Started +

+ +## Documentation +The full reveal.js documentation is available at [revealjs.com](https://revealjs.com). + +## Online Editor +Want to create your presentation using a visual editor? Try the official reveal.js presentation platform for free at [Slides.com](https://slides.com). It's made by the same people behind reveal.js. + +## License + +MIT licensed + +Copyright (C) 2011-2021 Hakim El Hattab, https://hakim.se diff --git a/static/presentations/2021-11-13/garage/css/layout.scss b/static/presentations/2021-11-13/garage/css/layout.scss new file mode 100644 index 0000000..6c4abd5 --- /dev/null +++ b/static/presentations/2021-11-13/garage/css/layout.scss @@ -0,0 +1,69 @@ +/** + * Layout helpers. + */ + +// Stretch an element vertically based on available space +.reveal .stretch, +.reveal .r-stretch { + max-width: none; + max-height: none; +} + +.reveal pre.stretch code, +.reveal pre.r-stretch code { + height: 100%; + max-height: 100%; + box-sizing: border-box; +} + +// Text that auto-fits it's container +.reveal .r-fit-text { + display: inline-block; // https://github.com/rikschennink/fitty#performance + white-space: nowrap; +} + +// Stack multiple elements on top of each other +.reveal .r-stack { + display: grid; +} + +.reveal .r-stack > * { + grid-area: 1/1; + margin: auto; +} + +// Horizontal and vertical stacks +.reveal .r-vstack, +.reveal .r-hstack { + display: flex; + + img, video { + min-width: 0; + min-height: 0; + object-fit: contain; + } +} + +.reveal .r-vstack { + flex-direction: column; + align-items: center; + justify-content: center; +} + +.reveal .r-hstack { + flex-direction: row; + align-items: center; + justify-content: center; +} + +// Naming based on tailwindcss +.reveal .items-stretch { align-items: stretch; } +.reveal .items-start { align-items: flex-start; } +.reveal .items-center { align-items: center; } +.reveal .items-end { align-items: flex-end; } + +.reveal .justify-between { justify-content: space-between; } +.reveal .justify-around { justify-content: space-around; } +.reveal .justify-start { justify-content: flex-start; } +.reveal .justify-center { justify-content: center; } +.reveal .justify-end { justify-content: flex-end; } diff --git a/static/presentations/2021-11-13/garage/css/print/paper.scss b/static/presentations/2021-11-13/garage/css/print/paper.scss new file mode 100644 index 0000000..2ffa3b0 --- /dev/null +++ b/static/presentations/2021-11-13/garage/css/print/paper.scss @@ -0,0 +1,173 @@ +/* Default Print Stylesheet Template + by Rob Glazebrook of CSSnewbie.com + Last Updated: June 4, 2008 + + Feel free (nay, compelled) to edit, append, and + manipulate this file as you see fit. */ + +@media print { + html:not(.print-pdf) { + + background: #fff; + width: auto; + height: auto; + overflow: visible; + + body { + background: #fff; + font-size: 20pt; + width: auto; + height: auto; + border: 0; + margin: 0 5%; + padding: 0; + overflow: visible; + float: none !important; + } + + .nestedarrow, + .controls, + .fork-reveal, + .share-reveal, + .state-background, + .reveal .progress, + .reveal .backgrounds, + .reveal .slide-number { + display: none !important; + } + + body, p, td, li { + font-size: 20pt!important; + color: #000; + } + + h1,h2,h3,h4,h5,h6 { + color: #000!important; + height: auto; + line-height: normal; + text-align: left; + letter-spacing: normal; + } + + /* Need to reduce the size of the fonts for printing */ + h1 { font-size: 28pt !important; } + h2 { font-size: 24pt !important; } + h3 { font-size: 22pt !important; } + h4 { font-size: 22pt !important; font-variant: small-caps; } + h5 { font-size: 21pt !important; } + h6 { font-size: 20pt !important; font-style: italic; } + + a:link, + a:visited { + color: #000 !important; + font-weight: bold; + text-decoration: underline; + } + + ul, ol, div, p { + visibility: visible; + position: static; + width: auto; + height: auto; + display: block; + overflow: visible; + margin: 0; + text-align: left !important; + } + .reveal pre, + .reveal table { + margin-left: 0; + margin-right: 0; + } + .reveal pre code { + padding: 20px; + } + .reveal blockquote { + margin: 20px 0; + } + .reveal .slides { + position: static !important; + width: auto !important; + height: auto !important; + + left: 0 !important; + top: 0 !important; + margin-left: 0 !important; + margin-top: 0 !important; + padding: 0 !important; + zoom: 1 !important; + transform: none !important; + + overflow: visible !important; + display: block !important; + + text-align: left !important; + perspective: none; + + perspective-origin: 50% 50%; + } + .reveal .slides section { + visibility: visible !important; + position: static !important; + width: auto !important; + height: auto !important; + display: block !important; + overflow: visible !important; + + left: 0 !important; + top: 0 !important; + margin-left: 0 !important; + margin-top: 0 !important; + padding: 60px 20px !important; + z-index: auto !important; + + opacity: 1 !important; + + page-break-after: always !important; + + transform-style: flat !important; + transform: none !important; + transition: none !important; + } + .reveal .slides section.stack { + padding: 0 !important; + } + .reveal section:last-of-type { + page-break-after: avoid !important; + } + .reveal section .fragment { + opacity: 1 !important; + visibility: visible !important; + + transform: none !important; + } + .reveal section img { + display: block; + margin: 15px 0px; + background: rgba(255,255,255,1); + border: 1px solid #666; + box-shadow: none; + } + + .reveal section small { + font-size: 0.8em; + } + + .reveal .hljs { + max-height: 100%; + white-space: pre-wrap; + word-wrap: break-word; + word-break: break-word; + font-size: 15pt; + } + + .reveal .hljs .hljs-ln-numbers { + white-space: nowrap; + } + + .reveal .hljs td { + font-size: inherit !important; + color: inherit !important; + } + } +} diff --git a/static/presentations/2021-11-13/garage/css/print/pdf.scss b/static/presentations/2021-11-13/garage/css/print/pdf.scss new file mode 100644 index 0000000..f967845 --- /dev/null +++ b/static/presentations/2021-11-13/garage/css/print/pdf.scss @@ -0,0 +1,156 @@ +/** + * This stylesheet is used to print reveal.js + * presentations to PDF. + * + * https://revealjs.com/pdf-export/ + */ + +html.print-pdf { + * { + -webkit-print-color-adjust: exact; + } + + & { + width: 100%; + height: 100%; + overflow: visible; + } + + body { + margin: 0 auto !important; + border: 0; + padding: 0; + float: none !important; + overflow: visible; + } + + /* Remove any elements not needed in print. */ + .nestedarrow, + .reveal .controls, + .reveal .progress, + .reveal .playback, + .reveal.overview, + .state-background { + display: none !important; + } + + .reveal pre code { + overflow: hidden !important; + font-family: Courier, 'Courier New', monospace !important; + } + + .reveal { + width: auto !important; + height: auto !important; + overflow: hidden !important; + } + .reveal .slides { + position: static; + width: 100% !important; + height: auto !important; + zoom: 1 !important; + pointer-events: initial; + + left: auto; + top: auto; + margin: 0 !important; + padding: 0 !important; + + overflow: visible; + display: block; + + perspective: none; + perspective-origin: 50% 50%; + } + + .reveal .slides .pdf-page { + position: relative; + overflow: hidden; + z-index: 1; + + page-break-after: always; + } + + .reveal .slides section { + visibility: visible !important; + display: block !important; + position: absolute !important; + + margin: 0 !important; + padding: 0 !important; + box-sizing: border-box !important; + min-height: 1px; + + opacity: 1 !important; + + transform-style: flat !important; + transform: none !important; + } + + .reveal section.stack { + position: relative !important; + margin: 0 !important; + padding: 0 !important; + page-break-after: avoid !important; + height: auto !important; + min-height: auto !important; + } + + .reveal img { + box-shadow: none; + } + + + /* Slide backgrounds are placed inside of their slide when exporting to PDF */ + .reveal .backgrounds { + display: none; + } + .reveal .slide-background { + display: block !important; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: auto !important; + } + + /* Display slide speaker notes when 'showNotes' is enabled */ + .reveal.show-notes { + max-width: none; + max-height: none; + } + .reveal .speaker-notes-pdf { + display: block; + width: 100%; + height: auto; + max-height: none; + top: auto; + right: auto; + bottom: auto; + left: auto; + z-index: 100; + } + + /* Layout option which makes notes appear on a separate page */ + .reveal .speaker-notes-pdf[data-layout="separate-page"] { + position: relative; + color: inherit; + background-color: transparent; + padding: 20px; + page-break-after: always; + border: 0; + } + + /* Display slide numbers when 'slideNumber' is enabled */ + .reveal .slide-number-pdf { + display: block; + position: absolute; + font-size: 14px; + } + + /* This accessibility tool is not useful in PDF and breaks it visually */ + .aria-status { + display: none; + } +} diff --git a/static/presentations/2021-11-13/garage/css/reveal.scss b/static/presentations/2021-11-13/garage/css/reveal.scss new file mode 100644 index 0000000..9071734 --- /dev/null +++ b/static/presentations/2021-11-13/garage/css/reveal.scss @@ -0,0 +1,1821 @@ +/** + * reveal.js + * http://revealjs.com + * MIT licensed + * + * Copyright (C) Hakim El Hattab, https://hakim.se + */ + +@import 'layout'; + +/********************************************* + * GLOBAL STYLES + *********************************************/ + +html.reveal-full-page { + width: 100%; + height: 100%; + height: 100vh; + height: calc( var(--vh, 1vh) * 100 ); + overflow: hidden; +} + +.reveal-viewport { + height: 100%; + overflow: hidden; + position: relative; + line-height: 1; + margin: 0; + + background-color: #fff; + color: #000; +} + + +/********************************************* + * VIEW FRAGMENTS + *********************************************/ + +.reveal .slides section .fragment { + opacity: 0; + visibility: hidden; + transition: all .2s ease; + will-change: opacity; + + &.visible { + opacity: 1; + visibility: inherit; + } + + &.disabled { + transition: none; + } +} + +.reveal .slides section .fragment.grow { + opacity: 1; + visibility: inherit; + + &.visible { + transform: scale( 1.3 ); + } +} + +.reveal .slides section .fragment.shrink { + opacity: 1; + visibility: inherit; + + &.visible { + transform: scale( 0.7 ); + } +} + +.reveal .slides section .fragment.zoom-in { + transform: scale( 0.1 ); + + &.visible { + transform: none; + } +} + +.reveal .slides section .fragment.fade-out { + opacity: 1; + visibility: inherit; + + &.visible { + opacity: 0; + visibility: hidden; + } +} + +.reveal .slides section .fragment.semi-fade-out { + opacity: 1; + visibility: inherit; + + &.visible { + opacity: 0.5; + visibility: inherit; + } +} + +.reveal .slides section .fragment.strike { + opacity: 1; + visibility: inherit; + + &.visible { + text-decoration: line-through; + } +} + +.reveal .slides section .fragment.fade-up { + transform: translate(0, 40px); + + &.visible { + transform: translate(0, 0); + } +} + +.reveal .slides section .fragment.fade-down { + transform: translate(0, -40px); + + &.visible { + transform: translate(0, 0); + } +} + +.reveal .slides section .fragment.fade-right { + transform: translate(-40px, 0); + + &.visible { + transform: translate(0, 0); + } +} + +.reveal .slides section .fragment.fade-left { + transform: translate(40px, 0); + + &.visible { + transform: translate(0, 0); + } +} + +.reveal .slides section .fragment.fade-in-then-out, +.reveal .slides section .fragment.current-visible { + opacity: 0; + visibility: hidden; + + &.current-fragment { + opacity: 1; + visibility: inherit; + } +} + +.reveal .slides section .fragment.fade-in-then-semi-out { + opacity: 0; + visibility: hidden; + + &.visible { + opacity: 0.5; + visibility: inherit; + } + + &.current-fragment { + opacity: 1; + visibility: inherit; + } +} + +.reveal .slides section .fragment.highlight-red, +.reveal .slides section .fragment.highlight-current-red, +.reveal .slides section .fragment.highlight-green, +.reveal .slides section .fragment.highlight-current-green, +.reveal .slides section .fragment.highlight-blue, +.reveal .slides section .fragment.highlight-current-blue { + opacity: 1; + visibility: inherit; +} + .reveal .slides section .fragment.highlight-red.visible { + color: #ff2c2d + } + .reveal .slides section .fragment.highlight-green.visible { + color: #17ff2e; + } + .reveal .slides section .fragment.highlight-blue.visible { + color: #1b91ff; + } + +.reveal .slides section .fragment.highlight-current-red.current-fragment { + color: #ff2c2d +} +.reveal .slides section .fragment.highlight-current-green.current-fragment { + color: #17ff2e; +} +.reveal .slides section .fragment.highlight-current-blue.current-fragment { + color: #1b91ff; +} + + +/********************************************* + * DEFAULT ELEMENT STYLES + *********************************************/ + +/* Fixes issue in Chrome where italic fonts did not appear when printing to PDF */ +.reveal:after { + content: ''; + font-style: italic; +} + +.reveal iframe { + z-index: 1; +} + +/** Prevents layering issues in certain browser/transition combinations */ +.reveal a { + position: relative; +} + + +/********************************************* + * CONTROLS + *********************************************/ + +@keyframes bounce-right { + 0%, 10%, 25%, 40%, 50% {transform: translateX(0);} + 20% {transform: translateX(10px);} + 30% {transform: translateX(-5px);} +} + +@keyframes bounce-left { + 0%, 10%, 25%, 40%, 50% {transform: translateX(0);} + 20% {transform: translateX(-10px);} + 30% {transform: translateX(5px);} +} + +@keyframes bounce-down { + 0%, 10%, 25%, 40%, 50% {transform: translateY(0);} + 20% {transform: translateY(10px);} + 30% {transform: translateY(-5px);} +} + +$controlArrowSize: 3.6em; +$controlArrowSpacing: 1.4em; +$controlArrowLength: 2.6em; +$controlArrowThickness: 0.5em; +$controlsArrowAngle: 45deg; +$controlsArrowAngleHover: 40deg; +$controlsArrowAngleActive: 36deg; + +@mixin controlsArrowTransform( $angle ) { + &:before { + transform: translateX(($controlArrowSize - $controlArrowLength)/2) translateY(($controlArrowSize - $controlArrowThickness)/2) rotate( $angle ); + } + + &:after { + transform: translateX(($controlArrowSize - $controlArrowLength)/2) translateY(($controlArrowSize - $controlArrowThickness)/2) rotate( -$angle ); + } +} + +.reveal .controls { + $spacing: 12px; + + display: none; + position: absolute; + top: auto; + bottom: $spacing; + right: $spacing; + left: auto; + z-index: 11; + color: #000; + pointer-events: none; + font-size: 10px; + + button { + position: absolute; + padding: 0; + background-color: transparent; + border: 0; + outline: 0; + cursor: pointer; + color: currentColor; + transform: scale(.9999); + transition: color 0.2s ease, + opacity 0.2s ease, + transform 0.2s ease; + z-index: 2; // above slides + pointer-events: auto; + font-size: inherit; + + visibility: hidden; + opacity: 0; + + -webkit-appearance: none; + -webkit-tap-highlight-color: rgba( 0, 0, 0, 0 ); + } + + .controls-arrow:before, + .controls-arrow:after { + content: ''; + position: absolute; + top: 0; + left: 0; + width: $controlArrowLength; + height: $controlArrowThickness; + border-radius: $controlArrowThickness/2; + background-color: currentColor; + + transition: all 0.15s ease, background-color 0.8s ease; + transform-origin: floor(($controlArrowThickness/2)*10)/10 50%; + will-change: transform; + } + + .controls-arrow { + position: relative; + width: $controlArrowSize; + height: $controlArrowSize; + + @include controlsArrowTransform( $controlsArrowAngle ); + + &:hover { + @include controlsArrowTransform( $controlsArrowAngleHover ); + } + + &:active { + @include controlsArrowTransform( $controlsArrowAngleActive ); + } + } + + .navigate-left { + right: $controlArrowSize + $controlArrowSpacing*2; + bottom: $controlArrowSpacing + $controlArrowSize/2; + transform: translateX( -10px ); + + &.highlight { + animation: bounce-left 2s 50 both ease-out; + } + } + + .navigate-right { + right: 0; + bottom: $controlArrowSpacing + $controlArrowSize/2; + transform: translateX( 10px ); + + .controls-arrow { + transform: rotate( 180deg ); + } + + &.highlight { + animation: bounce-right 2s 50 both ease-out; + } + } + + .navigate-up { + right: $controlArrowSpacing + $controlArrowSize/2; + bottom: $controlArrowSpacing*2 + $controlArrowSize; + transform: translateY( -10px ); + + .controls-arrow { + transform: rotate( 90deg ); + } + } + + .navigate-down { + right: $controlArrowSpacing + $controlArrowSize/2; + bottom: -$controlArrowSpacing; + padding-bottom: $controlArrowSpacing; + transform: translateY( 10px ); + + .controls-arrow { + transform: rotate( -90deg ); + } + + &.highlight { + animation: bounce-down 2s 50 both ease-out; + } + } + + // Back arrow style: "faded": + // Deemphasize backwards navigation arrows in favor of drawing + // attention to forwards navigation + &[data-controls-back-arrows="faded"] .navigate-up.enabled { + opacity: 0.3; + + &:hover { + opacity: 1; + } + } + + // Back arrow style: "hidden": + // Never show arrows for backwards navigation + &[data-controls-back-arrows="hidden"] .navigate-up.enabled { + opacity: 0; + visibility: hidden; + } + + // Any control button that can be clicked is "enabled" + .enabled { + visibility: visible; + opacity: 0.9; + cursor: pointer; + transform: none; + } + + // Any control button that leads to showing or hiding + // a fragment + .enabled.fragmented { + opacity: 0.5; + } + + .enabled:hover, + .enabled.fragmented:hover { + opacity: 1; + } +} + +.reveal:not(.rtl) .controls { + // Back arrow style: "faded": + // Deemphasize left arrow + &[data-controls-back-arrows="faded"] .navigate-left.enabled { + opacity: 0.3; + + &:hover { + opacity: 1; + } + } + + // Back arrow style: "hidden": + // Never show left arrow + &[data-controls-back-arrows="hidden"] .navigate-left.enabled { + opacity: 0; + visibility: hidden; + } +} + +.reveal.rtl .controls { + // Back arrow style: "faded": + // Deemphasize right arrow in RTL mode + &[data-controls-back-arrows="faded"] .navigate-right.enabled { + opacity: 0.3; + + &:hover { + opacity: 1; + } + } + + // Back arrow style: "hidden": + // Never show right arrow in RTL mode + &[data-controls-back-arrows="hidden"] .navigate-right.enabled { + opacity: 0; + visibility: hidden; + } +} + +.reveal[data-navigation-mode="linear"].has-horizontal-slides .navigate-up, +.reveal[data-navigation-mode="linear"].has-horizontal-slides .navigate-down { + display: none; +} + +// Adjust the layout when there are no vertical slides +.reveal[data-navigation-mode="linear"].has-horizontal-slides .navigate-left, +.reveal:not(.has-vertical-slides) .controls .navigate-left { + bottom: $controlArrowSpacing; + right: 0.5em + $controlArrowSpacing + $controlArrowSize; +} + +.reveal[data-navigation-mode="linear"].has-horizontal-slides .navigate-right, +.reveal:not(.has-vertical-slides) .controls .navigate-right { + bottom: $controlArrowSpacing; + right: 0.5em; +} + +// Adjust the layout when there are no horizontal slides +.reveal:not(.has-horizontal-slides) .controls .navigate-up { + right: $controlArrowSpacing; + bottom: $controlArrowSpacing + $controlArrowSize; +} +.reveal:not(.has-horizontal-slides) .controls .navigate-down { + right: $controlArrowSpacing; + bottom: 0.5em; +} + +// Invert arrows based on background color +.reveal.has-dark-background .controls { + color: #fff; +} +.reveal.has-light-background .controls { + color: #000; +} + +// Disable active states on touch devices +.reveal.no-hover .controls .controls-arrow:hover, +.reveal.no-hover .controls .controls-arrow:active { + @include controlsArrowTransform( $controlsArrowAngle ); +} + +// Edge aligned controls layout +@media screen and (min-width: 500px) { + + $spacing: 0.8em; + + .reveal .controls[data-controls-layout="edges"] { + & { + top: 0; + right: 0; + bottom: 0; + left: 0; + } + + .navigate-left, + .navigate-right, + .navigate-up, + .navigate-down { + bottom: auto; + right: auto; + } + + .navigate-left { + top: 50%; + left: $spacing; + margin-top: -$controlArrowSize/2; + } + + .navigate-right { + top: 50%; + right: $spacing; + margin-top: -$controlArrowSize/2; + } + + .navigate-up { + top: $spacing; + left: 50%; + margin-left: -$controlArrowSize/2; + } + + .navigate-down { + bottom: $spacing - $controlArrowSpacing + 0.3em; + left: 50%; + margin-left: -$controlArrowSize/2; + } + } + +} + + +/********************************************* + * PROGRESS BAR + *********************************************/ + +.reveal .progress { + position: absolute; + display: none; + height: 3px; + width: 100%; + bottom: 0; + left: 0; + z-index: 10; + + background-color: rgba( 0, 0, 0, 0.2 ); + color: #fff; +} + .reveal .progress:after { + content: ''; + display: block; + position: absolute; + height: 10px; + width: 100%; + top: -10px; + } + .reveal .progress span { + display: block; + height: 100%; + width: 100%; + + background-color: currentColor; + transition: transform 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985); + transform-origin: 0 0; + transform: scaleX(0); + } + +/********************************************* + * SLIDE NUMBER + *********************************************/ + +.reveal .slide-number { + position: absolute; + display: block; + right: 8px; + bottom: 8px; + z-index: 31; + font-family: Helvetica, sans-serif; + font-size: 12px; + line-height: 1; + color: #fff; + background-color: rgba( 0, 0, 0, 0.4 ); + padding: 5px; +} + +.reveal .slide-number a { + color: currentColor; +} + +.reveal .slide-number-delimiter { + margin: 0 3px; +} + +/********************************************* + * SLIDES + *********************************************/ + +.reveal { + position: relative; + width: 100%; + height: 100%; + overflow: hidden; + touch-action: pinch-zoom; +} + +// Swiping on an embedded deck should not block page scrolling +.reveal.embedded { + touch-action: pan-y; +} + +.reveal .slides { + position: absolute; + width: 100%; + height: 100%; + top: 0; + right: 0; + bottom: 0; + left: 0; + margin: auto; + pointer-events: none; + + overflow: visible; + z-index: 1; + text-align: center; + perspective: 600px; + perspective-origin: 50% 40%; +} + +.reveal .slides>section { + perspective: 600px; +} + +.reveal .slides>section, +.reveal .slides>section>section { + display: none; + position: absolute; + width: 100%; + pointer-events: auto; + + z-index: 10; + transform-style: flat; + transition: transform-origin 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985), + transform 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985), + visibility 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985), + opacity 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985); +} + +/* Global transition speed settings */ +.reveal[data-transition-speed="fast"] .slides section { + transition-duration: 400ms; +} +.reveal[data-transition-speed="slow"] .slides section { + transition-duration: 1200ms; +} + +/* Slide-specific transition speed overrides */ +.reveal .slides section[data-transition-speed="fast"] { + transition-duration: 400ms; +} +.reveal .slides section[data-transition-speed="slow"] { + transition-duration: 1200ms; +} + +.reveal .slides>section.stack { + padding-top: 0; + padding-bottom: 0; + pointer-events: none; + height: 100%; +} + +.reveal .slides>section.present, +.reveal .slides>section>section.present { + display: block; + z-index: 11; + opacity: 1; +} + +.reveal .slides>section:empty, +.reveal .slides>section>section:empty, +.reveal .slides>section[data-background-interactive], +.reveal .slides>section>section[data-background-interactive] { + pointer-events: none; +} + +.reveal.center, +.reveal.center .slides, +.reveal.center .slides section { + min-height: 0 !important; +} + +/* Don't allow interaction with invisible slides */ +.reveal .slides>section:not(.present), +.reveal .slides>section>section:not(.present) { + pointer-events: none; +} + +.reveal.overview .slides>section, +.reveal.overview .slides>section>section { + pointer-events: auto; +} + +.reveal .slides>section.past, +.reveal .slides>section.future, +.reveal .slides>section>section.past, +.reveal .slides>section>section.future { + opacity: 0; +} + + +/********************************************* + * Mixins for readability of transitions + *********************************************/ + +@mixin transition-global($style) { + .reveal .slides section[data-transition=#{$style}], + .reveal.#{$style} .slides section:not([data-transition]) { + @content; + } +} +@mixin transition-stack($style) { + .reveal .slides section[data-transition=#{$style}].stack, + .reveal.#{$style} .slides section.stack { + @content; + } +} +@mixin transition-horizontal-past($style) { + .reveal .slides>section[data-transition=#{$style}].past, + .reveal .slides>section[data-transition~=#{$style}-out].past, + .reveal.#{$style} .slides>section:not([data-transition]).past { + @content; + } +} +@mixin transition-horizontal-future($style) { + .reveal .slides>section[data-transition=#{$style}].future, + .reveal .slides>section[data-transition~=#{$style}-in].future, + .reveal.#{$style} .slides>section:not([data-transition]).future { + @content; + } +} + +@mixin transition-vertical-past($style) { + .reveal .slides>section>section[data-transition=#{$style}].past, + .reveal .slides>section>section[data-transition~=#{$style}-out].past, + .reveal.#{$style} .slides>section>section:not([data-transition]).past { + @content; + } +} +@mixin transition-vertical-future($style) { + .reveal .slides>section>section[data-transition=#{$style}].future, + .reveal .slides>section>section[data-transition~=#{$style}-in].future, + .reveal.#{$style} .slides>section>section:not([data-transition]).future { + @content; + } +} + +/********************************************* + * SLIDE TRANSITION + * Aliased 'linear' for backwards compatibility + *********************************************/ + +@each $stylename in slide, linear { + .reveal.#{$stylename} section { + backface-visibility: hidden; + } + @include transition-horizontal-past(#{$stylename}) { + transform: translate(-150%, 0); + } + @include transition-horizontal-future(#{$stylename}) { + transform: translate(150%, 0); + } + @include transition-vertical-past(#{$stylename}) { + transform: translate(0, -150%); + } + @include transition-vertical-future(#{$stylename}) { + transform: translate(0, 150%); + } +} + +/********************************************* + * CONVEX TRANSITION + * Aliased 'default' for backwards compatibility + *********************************************/ + +@each $stylename in default, convex { + @include transition-stack(#{$stylename}) { + transform-style: preserve-3d; + } + + @include transition-horizontal-past(#{$stylename}) { + transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0); + } + @include transition-horizontal-future(#{$stylename}) { + transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0); + } + @include transition-vertical-past(#{$stylename}) { + transform: translate3d(0, -300px, 0) rotateX(70deg) translate3d(0, -300px, 0); + } + @include transition-vertical-future(#{$stylename}) { + transform: translate3d(0, 300px, 0) rotateX(-70deg) translate3d(0, 300px, 0); + } +} + +/********************************************* + * CONCAVE TRANSITION + *********************************************/ + +@include transition-stack(concave) { + transform-style: preserve-3d; +} + +@include transition-horizontal-past(concave) { + transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0); +} +@include transition-horizontal-future(concave) { + transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0); +} +@include transition-vertical-past(concave) { + transform: translate3d(0, -80%, 0) rotateX(-70deg) translate3d(0, -80%, 0); +} +@include transition-vertical-future(concave) { + transform: translate3d(0, 80%, 0) rotateX(70deg) translate3d(0, 80%, 0); +} + + +/********************************************* + * ZOOM TRANSITION + *********************************************/ + +@include transition-global(zoom) { + transition-timing-function: ease; +} +@include transition-horizontal-past(zoom) { + visibility: hidden; + transform: scale(16); +} +@include transition-horizontal-future(zoom) { + visibility: hidden; + transform: scale(0.2); +} +@include transition-vertical-past(zoom) { + transform: scale(16); +} +@include transition-vertical-future(zoom) { + transform: scale(0.2); +} + + +/********************************************* + * CUBE TRANSITION + * + * WARNING: + * this is deprecated and will be removed in a + * future version. + *********************************************/ + +.reveal.cube .slides { + perspective: 1300px; +} + +.reveal.cube .slides section { + padding: 30px; + min-height: 700px; + backface-visibility: hidden; + box-sizing: border-box; + transform-style: preserve-3d; +} + .reveal.center.cube .slides section { + min-height: 0; + } + .reveal.cube .slides section:not(.stack):before { + content: ''; + position: absolute; + display: block; + width: 100%; + height: 100%; + left: 0; + top: 0; + background: rgba(0,0,0,0.1); + border-radius: 4px; + transform: translateZ( -20px ); + } + .reveal.cube .slides section:not(.stack):after { + content: ''; + position: absolute; + display: block; + width: 90%; + height: 30px; + left: 5%; + bottom: 0; + background: none; + z-index: 1; + + border-radius: 4px; + box-shadow: 0px 95px 25px rgba(0,0,0,0.2); + transform: translateZ(-90px) rotateX( 65deg ); + } + +.reveal.cube .slides>section.stack { + padding: 0; + background: none; +} + +.reveal.cube .slides>section.past { + transform-origin: 100% 0%; + transform: translate3d(-100%, 0, 0) rotateY(-90deg); +} + +.reveal.cube .slides>section.future { + transform-origin: 0% 0%; + transform: translate3d(100%, 0, 0) rotateY(90deg); +} + +.reveal.cube .slides>section>section.past { + transform-origin: 0% 100%; + transform: translate3d(0, -100%, 0) rotateX(90deg); +} + +.reveal.cube .slides>section>section.future { + transform-origin: 0% 0%; + transform: translate3d(0, 100%, 0) rotateX(-90deg); +} + + +/********************************************* + * PAGE TRANSITION + * + * WARNING: + * this is deprecated and will be removed in a + * future version. + *********************************************/ + +.reveal.page .slides { + perspective-origin: 0% 50%; + perspective: 3000px; +} + +.reveal.page .slides section { + padding: 30px; + min-height: 700px; + box-sizing: border-box; + transform-style: preserve-3d; +} + .reveal.page .slides section.past { + z-index: 12; + } + .reveal.page .slides section:not(.stack):before { + content: ''; + position: absolute; + display: block; + width: 100%; + height: 100%; + left: 0; + top: 0; + background: rgba(0,0,0,0.1); + transform: translateZ( -20px ); + } + .reveal.page .slides section:not(.stack):after { + content: ''; + position: absolute; + display: block; + width: 90%; + height: 30px; + left: 5%; + bottom: 0; + background: none; + z-index: 1; + + border-radius: 4px; + box-shadow: 0px 95px 25px rgba(0,0,0,0.2); + + -webkit-transform: translateZ(-90px) rotateX( 65deg ); + } + +.reveal.page .slides>section.stack { + padding: 0; + background: none; +} + +.reveal.page .slides>section.past { + transform-origin: 0% 0%; + transform: translate3d(-40%, 0, 0) rotateY(-80deg); +} + +.reveal.page .slides>section.future { + transform-origin: 100% 0%; + transform: translate3d(0, 0, 0); +} + +.reveal.page .slides>section>section.past { + transform-origin: 0% 0%; + transform: translate3d(0, -40%, 0) rotateX(80deg); +} + +.reveal.page .slides>section>section.future { + transform-origin: 0% 100%; + transform: translate3d(0, 0, 0); +} + + +/********************************************* + * FADE TRANSITION + *********************************************/ + +.reveal .slides section[data-transition=fade], +.reveal.fade .slides section:not([data-transition]), +.reveal.fade .slides>section>section:not([data-transition]) { + transform: none; + transition: opacity 0.5s; +} + + +.reveal.fade.overview .slides section, +.reveal.fade.overview .slides>section>section { + transition: none; +} + + +/********************************************* + * NO TRANSITION + *********************************************/ + +@include transition-global(none) { + transform: none; + transition: none; +} + + +/********************************************* + * PAUSED MODE + *********************************************/ + +.reveal .pause-overlay { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: black; + visibility: hidden; + opacity: 0; + z-index: 100; + transition: all 1s ease; +} + +.reveal .pause-overlay .resume-button { + position: absolute; + bottom: 20px; + right: 20px; + color: #ccc; + border-radius: 2px; + padding: 6px 14px; + border: 2px solid #ccc; + font-size: 16px; + background: transparent; + cursor: pointer; + + &:hover { + color: #fff; + border-color: #fff; + } +} + +.reveal.paused .pause-overlay { + visibility: visible; + opacity: 1; +} + + +/********************************************* + * FALLBACK + *********************************************/ + +.reveal .no-transition, +.reveal .no-transition *, +.reveal .slides.disable-slide-transitions section { + transition: none !important; +} + +.reveal .slides.disable-slide-transitions section { + transform: none !important; +} + + +/********************************************* + * PER-SLIDE BACKGROUNDS + *********************************************/ + +.reveal .backgrounds { + position: absolute; + width: 100%; + height: 100%; + top: 0; + left: 0; + perspective: 600px; +} + .reveal .slide-background { + display: none; + position: absolute; + width: 100%; + height: 100%; + opacity: 0; + visibility: hidden; + overflow: hidden; + + background-color: rgba( 0, 0, 0, 0 ); + + transition: all 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985); + } + + .reveal .slide-background-content { + position: absolute; + width: 100%; + height: 100%; + + background-position: 50% 50%; + background-repeat: no-repeat; + background-size: cover; + } + + .reveal .slide-background.stack { + display: block; + } + + .reveal .slide-background.present { + opacity: 1; + visibility: visible; + z-index: 2; + } + + .print-pdf .reveal .slide-background { + opacity: 1 !important; + visibility: visible !important; + } + +/* Video backgrounds */ +.reveal .slide-background video { + position: absolute; + width: 100%; + height: 100%; + max-width: none; + max-height: none; + top: 0; + left: 0; + object-fit: cover; +} + .reveal .slide-background[data-background-size="contain"] video { + object-fit: contain; + } + +/* Immediate transition style */ +.reveal[data-background-transition=none]>.backgrounds .slide-background:not([data-background-transition]), +.reveal>.backgrounds .slide-background[data-background-transition=none] { + transition: none; +} + +/* Slide */ +.reveal[data-background-transition=slide]>.backgrounds .slide-background:not([data-background-transition]), +.reveal>.backgrounds .slide-background[data-background-transition=slide] { + opacity: 1; + backface-visibility: hidden; +} + .reveal[data-background-transition=slide]>.backgrounds .slide-background.past:not([data-background-transition]), + .reveal>.backgrounds .slide-background.past[data-background-transition=slide] { + transform: translate(-100%, 0); + } + .reveal[data-background-transition=slide]>.backgrounds .slide-background.future:not([data-background-transition]), + .reveal>.backgrounds .slide-background.future[data-background-transition=slide] { + transform: translate(100%, 0); + } + + .reveal[data-background-transition=slide]>.backgrounds .slide-background>.slide-background.past:not([data-background-transition]), + .reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=slide] { + transform: translate(0, -100%); + } + .reveal[data-background-transition=slide]>.backgrounds .slide-background>.slide-background.future:not([data-background-transition]), + .reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=slide] { + transform: translate(0, 100%); + } + + +/* Convex */ +.reveal[data-background-transition=convex]>.backgrounds .slide-background.past:not([data-background-transition]), +.reveal>.backgrounds .slide-background.past[data-background-transition=convex] { + opacity: 0; + transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0); +} +.reveal[data-background-transition=convex]>.backgrounds .slide-background.future:not([data-background-transition]), +.reveal>.backgrounds .slide-background.future[data-background-transition=convex] { + opacity: 0; + transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0); +} + +.reveal[data-background-transition=convex]>.backgrounds .slide-background>.slide-background.past:not([data-background-transition]), +.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=convex] { + opacity: 0; + transform: translate3d(0, -100%, 0) rotateX(90deg) translate3d(0, -100%, 0); +} +.reveal[data-background-transition=convex]>.backgrounds .slide-background>.slide-background.future:not([data-background-transition]), +.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=convex] { + opacity: 0; + transform: translate3d(0, 100%, 0) rotateX(-90deg) translate3d(0, 100%, 0); +} + + +/* Concave */ +.reveal[data-background-transition=concave]>.backgrounds .slide-background.past:not([data-background-transition]), +.reveal>.backgrounds .slide-background.past[data-background-transition=concave] { + opacity: 0; + transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0); +} +.reveal[data-background-transition=concave]>.backgrounds .slide-background.future:not([data-background-transition]), +.reveal>.backgrounds .slide-background.future[data-background-transition=concave] { + opacity: 0; + transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0); +} + +.reveal[data-background-transition=concave]>.backgrounds .slide-background>.slide-background.past:not([data-background-transition]), +.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=concave] { + opacity: 0; + transform: translate3d(0, -100%, 0) rotateX(-90deg) translate3d(0, -100%, 0); +} +.reveal[data-background-transition=concave]>.backgrounds .slide-background>.slide-background.future:not([data-background-transition]), +.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=concave] { + opacity: 0; + transform: translate3d(0, 100%, 0) rotateX(90deg) translate3d(0, 100%, 0); +} + +/* Zoom */ +.reveal[data-background-transition=zoom]>.backgrounds .slide-background:not([data-background-transition]), +.reveal>.backgrounds .slide-background[data-background-transition=zoom] { + transition-timing-function: ease; +} + +.reveal[data-background-transition=zoom]>.backgrounds .slide-background.past:not([data-background-transition]), +.reveal>.backgrounds .slide-background.past[data-background-transition=zoom] { + opacity: 0; + visibility: hidden; + transform: scale(16); +} +.reveal[data-background-transition=zoom]>.backgrounds .slide-background.future:not([data-background-transition]), +.reveal>.backgrounds .slide-background.future[data-background-transition=zoom] { + opacity: 0; + visibility: hidden; + transform: scale(0.2); +} + +.reveal[data-background-transition=zoom]>.backgrounds .slide-background>.slide-background.past:not([data-background-transition]), +.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=zoom] { + opacity: 0; + visibility: hidden; + transform: scale(16); +} +.reveal[data-background-transition=zoom]>.backgrounds .slide-background>.slide-background.future:not([data-background-transition]), +.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=zoom] { + opacity: 0; + visibility: hidden; + transform: scale(0.2); +} + + +/* Global transition speed settings */ +.reveal[data-transition-speed="fast"]>.backgrounds .slide-background { + transition-duration: 400ms; +} +.reveal[data-transition-speed="slow"]>.backgrounds .slide-background { + transition-duration: 1200ms; +} + + +/********************************************* + * AUTO ANIMATE + *********************************************/ + +.reveal [data-auto-animate-target^="unmatched"] { + will-change: opacity; +} + +.reveal section[data-auto-animate]:not(.stack):not([data-auto-animate="running"]) [data-auto-animate-target^="unmatched"] { + opacity: 0; +} + + +/********************************************* + * OVERVIEW + *********************************************/ + +.reveal.overview { + perspective-origin: 50% 50%; + perspective: 700px; + + .slides { + // Fixes overview rendering errors in FF48+, not applied to + // other browsers since it degrades performance + -moz-transform-style: preserve-3d; + } + + .slides section { + height: 100%; + top: 0 !important; + opacity: 1 !important; + overflow: hidden; + visibility: visible !important; + cursor: pointer; + box-sizing: border-box; + } + .slides section:hover, + .slides section.present { + outline: 10px solid rgba(150,150,150,0.4); + outline-offset: 10px; + } + .slides section .fragment { + opacity: 1; + transition: none; + } + .slides section:after, + .slides section:before { + display: none !important; + } + .slides>section.stack { + padding: 0; + top: 0 !important; + background: none; + outline: none; + overflow: visible; + } + + .backgrounds { + perspective: inherit; + + // Fixes overview rendering errors in FF48+, not applied to + // other browsers since it degrades performance + -moz-transform-style: preserve-3d; + } + + .backgrounds .slide-background { + opacity: 1; + visibility: visible; + + // This can't be applied to the slide itself in Safari + outline: 10px solid rgba(150,150,150,0.1); + outline-offset: 10px; + } + + .backgrounds .slide-background.stack { + overflow: visible; + } +} + +// Disable transitions transitions while we're activating +// or deactivating the overview mode. +.reveal.overview .slides section, +.reveal.overview-deactivating .slides section { + transition: none; +} + +.reveal.overview .backgrounds .slide-background, +.reveal.overview-deactivating .backgrounds .slide-background { + transition: none; +} + + +/********************************************* + * RTL SUPPORT + *********************************************/ + +.reveal.rtl .slides, +.reveal.rtl .slides h1, +.reveal.rtl .slides h2, +.reveal.rtl .slides h3, +.reveal.rtl .slides h4, +.reveal.rtl .slides h5, +.reveal.rtl .slides h6 { + direction: rtl; + font-family: sans-serif; +} + +.reveal.rtl pre, +.reveal.rtl code { + direction: ltr; +} + +.reveal.rtl ol, +.reveal.rtl ul { + text-align: right; +} + +.reveal.rtl .progress span { + transform-origin: 100% 0; +} + +/********************************************* + * PARALLAX BACKGROUND + *********************************************/ + +.reveal.has-parallax-background .backgrounds { + transition: all 0.8s ease; +} + +/* Global transition speed settings */ +.reveal.has-parallax-background[data-transition-speed="fast"] .backgrounds { + transition-duration: 400ms; +} +.reveal.has-parallax-background[data-transition-speed="slow"] .backgrounds { + transition-duration: 1200ms; +} + + +/********************************************* + * OVERLAY FOR LINK PREVIEWS AND HELP + *********************************************/ + +$overlayHeaderHeight: 40px; +$overlayHeaderPadding: 5px; + +.reveal > .overlay { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 1000; + background: rgba( 0, 0, 0, 0.9 ); + transition: all 0.3s ease; +} + + .reveal > .overlay .spinner { + position: absolute; + display: block; + top: 50%; + left: 50%; + width: 32px; + height: 32px; + margin: -16px 0 0 -16px; + z-index: 10; + background-image: url(data:image/gif;base64,R0lGODlhIAAgAPMAAJmZmf%2F%2F%2F6%2Bvr8nJybW1tcDAwOjo6Nvb26ioqKOjo7Ozs%2FLy8vz8%2FAAAAAAAAAAAACH%2FC05FVFNDQVBFMi4wAwEAAAAh%2FhpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh%2BQQJCgAAACwAAAAAIAAgAAAE5xDISWlhperN52JLhSSdRgwVo1ICQZRUsiwHpTJT4iowNS8vyW2icCF6k8HMMBkCEDskxTBDAZwuAkkqIfxIQyhBQBFvAQSDITM5VDW6XNE4KagNh6Bgwe60smQUB3d4Rz1ZBApnFASDd0hihh12BkE9kjAJVlycXIg7CQIFA6SlnJ87paqbSKiKoqusnbMdmDC2tXQlkUhziYtyWTxIfy6BE8WJt5YJvpJivxNaGmLHT0VnOgSYf0dZXS7APdpB309RnHOG5gDqXGLDaC457D1zZ%2FV%2FnmOM82XiHRLYKhKP1oZmADdEAAAh%2BQQJCgAAACwAAAAAIAAgAAAE6hDISWlZpOrNp1lGNRSdRpDUolIGw5RUYhhHukqFu8DsrEyqnWThGvAmhVlteBvojpTDDBUEIFwMFBRAmBkSgOrBFZogCASwBDEY%2FCZSg7GSE0gSCjQBMVG023xWBhklAnoEdhQEfyNqMIcKjhRsjEdnezB%2BA4k8gTwJhFuiW4dokXiloUepBAp5qaKpp6%2BHo7aWW54wl7obvEe0kRuoplCGepwSx2jJvqHEmGt6whJpGpfJCHmOoNHKaHx61WiSR92E4lbFoq%2BB6QDtuetcaBPnW6%2BO7wDHpIiK9SaVK5GgV543tzjgGcghAgAh%2BQQJCgAAACwAAAAAIAAgAAAE7hDISSkxpOrN5zFHNWRdhSiVoVLHspRUMoyUakyEe8PTPCATW9A14E0UvuAKMNAZKYUZCiBMuBakSQKG8G2FzUWox2AUtAQFcBKlVQoLgQReZhQlCIJesQXI5B0CBnUMOxMCenoCfTCEWBsJColTMANldx15BGs8B5wlCZ9Po6OJkwmRpnqkqnuSrayqfKmqpLajoiW5HJq7FL1Gr2mMMcKUMIiJgIemy7xZtJsTmsM4xHiKv5KMCXqfyUCJEonXPN2rAOIAmsfB3uPoAK%2B%2BG%2Bw48edZPK%2BM6hLJpQg484enXIdQFSS1u6UhksENEQAAIfkECQoAAAAsAAAAACAAIAAABOcQyEmpGKLqzWcZRVUQnZYg1aBSh2GUVEIQ2aQOE%2BG%2BcD4ntpWkZQj1JIiZIogDFFyHI0UxQwFugMSOFIPJftfVAEoZLBbcLEFhlQiqGp1Vd140AUklUN3eCA51C1EWMzMCezCBBmkxVIVHBWd3HHl9JQOIJSdSnJ0TDKChCwUJjoWMPaGqDKannasMo6WnM562R5YluZRwur0wpgqZE7NKUm%2BFNRPIhjBJxKZteWuIBMN4zRMIVIhffcgojwCF117i4nlLnY5ztRLsnOk%2BaV%2BoJY7V7m76PdkS4trKcdg0Zc0tTcKkRAAAIfkECQoAAAAsAAAAACAAIAAABO4QyEkpKqjqzScpRaVkXZWQEximw1BSCUEIlDohrft6cpKCk5xid5MNJTaAIkekKGQkWyKHkvhKsR7ARmitkAYDYRIbUQRQjWBwJRzChi9CRlBcY1UN4g0%2FVNB0AlcvcAYHRyZPdEQFYV8ccwR5HWxEJ02YmRMLnJ1xCYp0Y5idpQuhopmmC2KgojKasUQDk5BNAwwMOh2RtRq5uQuPZKGIJQIGwAwGf6I0JXMpC8C7kXWDBINFMxS4DKMAWVWAGYsAdNqW5uaRxkSKJOZKaU3tPOBZ4DuK2LATgJhkPJMgTwKCdFjyPHEnKxFCDhEAACH5BAkKAAAALAAAAAAgACAAAATzEMhJaVKp6s2nIkolIJ2WkBShpkVRWqqQrhLSEu9MZJKK9y1ZrqYK9WiClmvoUaF8gIQSNeF1Er4MNFn4SRSDARWroAIETg1iVwuHjYB1kYc1mwruwXKC9gmsJXliGxc%2BXiUCby9ydh1sOSdMkpMTBpaXBzsfhoc5l58Gm5yToAaZhaOUqjkDgCWNHAULCwOLaTmzswadEqggQwgHuQsHIoZCHQMMQgQGubVEcxOPFAcMDAYUA85eWARmfSRQCdcMe0zeP1AAygwLlJtPNAAL19DARdPzBOWSm1brJBi45soRAWQAAkrQIykShQ9wVhHCwCQCACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiRMDjI0Fd30%2FiI2UA5GSS5UDj2l6NoqgOgN4gksEBgYFf0FDqKgHnyZ9OX8HrgYHdHpcHQULXAS2qKpENRg7eAMLC7kTBaixUYFkKAzWAAnLC7FLVxLWDBLKCwaKTULgEwbLA4hJtOkSBNqITT3xEgfLpBtzE%2FjiuL04RGEBgwWhShRgQExHBAAh%2BQQJCgAAACwAAAAAIAAgAAAE7xDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfZiCqGk5dTESJeaOAlClzsJsqwiJwiqnFrb2nS9kmIcgEsjQydLiIlHehhpejaIjzh9eomSjZR%2BipslWIRLAgMDOR2DOqKogTB9pCUJBagDBXR6XB0EBkIIsaRsGGMMAxoDBgYHTKJiUYEGDAzHC9EACcUGkIgFzgwZ0QsSBcXHiQvOwgDdEwfFs0sDzt4S6BK4xYjkDOzn0unFeBzOBijIm1Dgmg5YFQwsCMjp1oJ8LyIAACH5BAkKAAAALAAAAAAgACAAAATwEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GGl6NoiPOH16iZKNlH6KmyWFOggHhEEvAwwMA0N9GBsEC6amhnVcEwavDAazGwIDaH1ipaYLBUTCGgQDA8NdHz0FpqgTBwsLqAbWAAnIA4FWKdMLGdYGEgraigbT0OITBcg5QwPT4xLrROZL6AuQAPUS7bxLpoWidY0JtxLHKhwwMJBTHgPKdEQAACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GAULDJCRiXo1CpGXDJOUjY%2BYip9DhToJA4RBLwMLCwVDfRgbBAaqqoZ1XBMHswsHtxtFaH1iqaoGNgAIxRpbFAgfPQSqpbgGBqUD1wBXeCYp1AYZ19JJOYgH1KwA4UBvQwXUBxPqVD9L3sbp2BNk2xvvFPJd%2BMFCN6HAAIKgNggY0KtEBAAh%2BQQJCgAAACwAAAAAIAAgAAAE6BDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfYIDMaAFdTESJeaEDAIMxYFqrOUaNW4E4ObYcCXaiBVEgULe0NJaxxtYksjh2NLkZISgDgJhHthkpU4mW6blRiYmZOlh4JWkDqILwUGBnE6TYEbCgevr0N1gH4At7gHiRpFaLNrrq8HNgAJA70AWxQIH1%2BvsYMDAzZQPC9VCNkDWUhGkuE5PxJNwiUK4UfLzOlD4WvzAHaoG9nxPi5d%2BjYUqfAhhykOFwJWiAAAIfkECQoAAAAsAAAAACAAIAAABPAQyElpUqnqzaciSoVkXVUMFaFSwlpOCcMYlErAavhOMnNLNo8KsZsMZItJEIDIFSkLGQoQTNhIsFehRww2CQLKF0tYGKYSg%2BygsZIuNqJksKgbfgIGepNo2cIUB3V1B3IvNiBYNQaDSTtfhhx0CwVPI0UJe0%2Bbm4g5VgcGoqOcnjmjqDSdnhgEoamcsZuXO1aWQy8KAwOAuTYYGwi7w5h%2BKr0SJ8MFihpNbx%2B4Erq7BYBuzsdiH1jCAzoSfl0rVirNbRXlBBlLX%2BBP0XJLAPGzTkAuAOqb0WT5AH7OcdCm5B8TgRwSRKIHQtaLCwg1RAAAOwAAAAAAAAAAAA%3D%3D); + + visibility: visible; + opacity: 0.6; + transition: all 0.3s ease; + } + + .reveal > .overlay header { + position: absolute; + left: 0; + top: 0; + width: 100%; + padding: $overlayHeaderPadding; + z-index: 2; + box-sizing: border-box; + } + .reveal > .overlay header a { + display: inline-block; + width: $overlayHeaderHeight; + height: $overlayHeaderHeight; + line-height: 36px; + padding: 0 10px; + float: right; + opacity: 0.6; + + box-sizing: border-box; + } + .reveal > .overlay header a:hover { + opacity: 1; + } + .reveal > .overlay header a .icon { + display: inline-block; + width: 20px; + height: 20px; + + background-position: 50% 50%; + background-size: 100%; + background-repeat: no-repeat; + } + .reveal > .overlay header a.close .icon { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABkklEQVRYR8WX4VHDMAxG6wnoJrABZQPYBCaBTWAD2g1gE5gg6OOsXuxIlr40d81dfrSJ9V4c2VLK7spHuTJ/5wpM07QXuXc5X0opX2tEJcadjHuV80li/FgxTIEK/5QBCICBD6xEhSMGHgQPgBgLiYVAB1dpSqKDawxTohFw4JSEA3clzgIBPCURwE2JucBR7rhPJJv5OpJwDX+SfDjgx1wACQeJG1aChP9K/IMmdZ8DtESV1WyP3Bt4MwM6sj4NMxMYiqUWHQu4KYA/SYkIjOsm3BXYWMKFDwU2khjCQ4ELJUJ4SmClRArOCmSXGuKma0fYD5CbzHxFpCSGAhfAVSSUGDUk2BWZaff2g6GE15BsBQ9nwmpIGDiyHQddwNTMKkbZaf9fajXQca1EX44puJZUsnY0ObGmITE3GVLCbEhQUjGVt146j6oasWN+49Vph2w1pZ5EansNZqKBm1txbU57iRRcZ86RWMDdWtBJUHBHwoQPi1GV+JCbntmvok7iTX4/Up9mgyTc/FJYDTcndgH/AA5A/CHsyEkVAAAAAElFTkSuQmCC); + } + .reveal > .overlay header a.external .icon { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAcElEQVRYR+2WSQoAIQwEzf8f7XiOMkUQxUPlGkM3hVmiQfQR9GYnH1SsAQlI4DiBqkCMoNb9y2e90IAEJPAcgdznU9+engMaeJ7Azh5Y1U67gAho4DqBqmB1buAf0MB1AlVBek83ZPkmJMGc1wAR+AAqod/B97TRpQAAAABJRU5ErkJggg==); + } + + .reveal > .overlay .viewport { + position: absolute; + display: flex; + top: $overlayHeaderHeight + $overlayHeaderPadding*2; + right: 0; + bottom: 0; + left: 0; + } + + .reveal > .overlay.overlay-preview .viewport iframe { + width: 100%; + height: 100%; + max-width: 100%; + max-height: 100%; + border: 0; + + opacity: 0; + visibility: hidden; + transition: all 0.3s ease; + } + + .reveal > .overlay.overlay-preview.loaded .viewport iframe { + opacity: 1; + visibility: visible; + } + + .reveal > .overlay.overlay-preview.loaded .viewport-inner { + position: absolute; + z-index: -1; + left: 0; + top: 45%; + width: 100%; + text-align: center; + letter-spacing: normal; + } + .reveal > .overlay.overlay-preview .x-frame-error { + opacity: 0; + transition: opacity 0.3s ease 0.3s; + } + .reveal > .overlay.overlay-preview.loaded .x-frame-error { + opacity: 1; + } + + .reveal > .overlay.overlay-preview.loaded .spinner { + opacity: 0; + visibility: hidden; + transform: scale(0.2); + } + + .reveal > .overlay.overlay-help .viewport { + overflow: auto; + color: #fff; + } + + .reveal > .overlay.overlay-help .viewport .viewport-inner { + width: 600px; + margin: auto; + padding: 20px 20px 80px 20px; + text-align: center; + letter-spacing: normal; + } + + .reveal > .overlay.overlay-help .viewport .viewport-inner .title { + font-size: 20px; + } + + .reveal > .overlay.overlay-help .viewport .viewport-inner table { + border: 1px solid #fff; + border-collapse: collapse; + font-size: 16px; + } + + .reveal > .overlay.overlay-help .viewport .viewport-inner table th, + .reveal > .overlay.overlay-help .viewport .viewport-inner table td { + width: 200px; + padding: 14px; + border: 1px solid #fff; + vertical-align: middle; + } + + .reveal > .overlay.overlay-help .viewport .viewport-inner table th { + padding-top: 20px; + padding-bottom: 20px; + } + + +/********************************************* + * PLAYBACK COMPONENT + *********************************************/ + +.reveal .playback { + position: absolute; + left: 15px; + bottom: 20px; + z-index: 30; + cursor: pointer; + transition: all 400ms ease; + -webkit-tap-highlight-color: rgba( 0, 0, 0, 0 ); +} + +.reveal.overview .playback { + opacity: 0; + visibility: hidden; +} + + +/********************************************* + * CODE HIGHLGIHTING + *********************************************/ + +.reveal .hljs { + min-height: 100%; +} + +.reveal .hljs table { + margin: initial; +} + +.reveal .hljs-ln-code, +.reveal .hljs-ln-numbers { + padding: 0; + border: 0; +} + +.reveal .hljs-ln-numbers { + opacity: 0.6; + padding-right: 0.75em; + text-align: right; + vertical-align: top; +} + +.reveal .hljs.has-highlights tr:not(.highlight-line) { + opacity: 0.4; +} + +.reveal .hljs:not(:first-child).fragment { + position: absolute; + top: 0; + left: 0; + width: 100%; + box-sizing: border-box; +} + +.reveal pre[data-auto-animate-target] { + overflow: hidden; +} +.reveal pre[data-auto-animate-target] code { + height: 100%; +} + + +/********************************************* + * ROLLING LINKS + *********************************************/ + +.reveal .roll { + display: inline-block; + line-height: 1.2; + overflow: hidden; + + vertical-align: top; + perspective: 400px; + perspective-origin: 50% 50%; +} + .reveal .roll:hover { + background: none; + text-shadow: none; + } +.reveal .roll span { + display: block; + position: relative; + padding: 0 2px; + + pointer-events: none; + transition: all 400ms ease; + transform-origin: 50% 0%; + transform-style: preserve-3d; + backface-visibility: hidden; +} + .reveal .roll:hover span { + background: rgba(0,0,0,0.5); + transform: translate3d( 0px, 0px, -45px ) rotateX( 90deg ); + } +.reveal .roll span:after { + content: attr(data-title); + + display: block; + position: absolute; + left: 0; + top: 0; + padding: 0 2px; + backface-visibility: hidden; + transform-origin: 50% 0%; + transform: translate3d( 0px, 110%, 0px ) rotateX( -90deg ); +} + + +/********************************************* + * SPEAKER NOTES + *********************************************/ + +$notesWidthPercent: 25%; + +// Hide on-page notes +.reveal aside.notes { + display: none; +} + +// An interface element that can optionally be used to show the +// speaker notes to all viewers, on top of the presentation +.reveal .speaker-notes { + display: none; + position: absolute; + width: $notesWidthPercent / (1-$notesWidthPercent/100) * 1%; + height: 100%; + top: 0; + left: 100%; + padding: 14px 18px 14px 18px; + z-index: 1; + font-size: 18px; + line-height: 1.4; + border: 1px solid rgba( 0, 0, 0, 0.05 ); + color: #222; + background-color: #f5f5f5; + overflow: auto; + box-sizing: border-box; + text-align: left; + font-family: Helvetica, sans-serif; + -webkit-overflow-scrolling: touch; + + .notes-placeholder { + color: #ccc; + font-style: italic; + } + + &:focus { + outline: none; + } + + &:before { + content: 'Speaker notes'; + display: block; + margin-bottom: 10px; + opacity: 0.5; + } +} + + +.reveal.show-notes { + max-width: 100% - $notesWidthPercent; + overflow: visible; +} + +.reveal.show-notes .speaker-notes { + display: block; +} + +@media screen and (min-width: 1600px) { + .reveal .speaker-notes { + font-size: 20px; + } +} + +@media screen and (max-width: 1024px) { + .reveal.show-notes { + border-left: 0; + max-width: none; + max-height: 70%; + max-height: 70vh; + overflow: visible; + } + + .reveal.show-notes .speaker-notes { + top: 100%; + left: 0; + width: 100%; + height: (30/0.7)*1%; + height: 30vh; + border: 0; + } +} + +@media screen and (max-width: 600px) { + .reveal.show-notes { + max-height: 60%; + max-height: 60vh; + } + + .reveal.show-notes .speaker-notes { + top: 100%; + height: (40/0.6)*1%; + height: 40vh; + } + + .reveal .speaker-notes { + font-size: 14px; + } +} + + +/********************************************* + * ZOOM PLUGIN + *********************************************/ + +.zoomed .reveal *, +.zoomed .reveal *:before, +.zoomed .reveal *:after { + backface-visibility: visible !important; +} + +.zoomed .reveal .progress, +.zoomed .reveal .controls { + opacity: 0; +} + +.zoomed .reveal .roll span { + background: none; +} + +.zoomed .reveal .roll span:after { + visibility: hidden; +} + + +/********************************************* + * PRINT STYLES + *********************************************/ + +@import 'print/pdf.scss'; +@import 'print/paper.scss'; + diff --git a/static/presentations/2021-11-13/garage/css/theme/README.md b/static/presentations/2021-11-13/garage/css/theme/README.md new file mode 100644 index 0000000..30916c4 --- /dev/null +++ b/static/presentations/2021-11-13/garage/css/theme/README.md @@ -0,0 +1,21 @@ +## Dependencies + +Themes are written using Sass to keep things modular and reduce the need for repeated selectors across files. Make sure that you have the reveal.js development environment installed before proceeding: https://revealjs.com/installation/#full-setup + +## Creating a Theme + +To create your own theme, start by duplicating a ```.scss``` file in [/css/theme/source](https://github.com/hakimel/reveal.js/blob/master/css/theme/source). It will be automatically compiled from Sass to CSS (see the [gulpfile](https://github.com/hakimel/reveal.js/blob/master/gulpfile.js)) when you run `npm run build -- css-themes`. + +Each theme file does four things in the following order: + +1. **Include [/css/theme/template/mixins.scss](https://github.com/hakimel/reveal.js/blob/master/css/theme/template/mixins.scss)** +Shared utility functions. + +2. **Include [/css/theme/template/settings.scss](https://github.com/hakimel/reveal.js/blob/master/css/theme/template/settings.scss)** +Declares a set of custom variables that the template file (step 4) expects. Can be overridden in step 3. + +3. **Override** +This is where you override the default theme. Either by specifying variables (see [settings.scss](https://github.com/hakimel/reveal.js/blob/master/css/theme/template/settings.scss) for reference) or by adding any selectors and styles you please. + +4. **Include [/css/theme/template/theme.scss](https://github.com/hakimel/reveal.js/blob/master/css/theme/template/theme.scss)** +The template theme file which will generate final CSS output based on the currently defined variables. diff --git a/static/presentations/2021-11-13/garage/css/theme/source/beige.scss b/static/presentations/2021-11-13/garage/css/theme/source/beige.scss new file mode 100644 index 0000000..1f60178 --- /dev/null +++ b/static/presentations/2021-11-13/garage/css/theme/source/beige.scss @@ -0,0 +1,41 @@ +/** + * Beige theme for reveal.js. + * + * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se + */ + + +// Default mixins and settings ----------------- +@import "../template/mixins"; +@import "../template/settings"; +// --------------------------------------------- + + + +// Include theme-specific fonts +@import url(./fonts/league-gothic/league-gothic.css); +@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic); + + +// Override theme settings (see ../template/settings.scss) +$mainColor: #333; +$headingColor: #333; +$headingTextShadow: none; +$backgroundColor: #f7f3de; +$linkColor: #8b743d; +$linkColorHover: lighten( $linkColor, 20% ); +$selectionBackgroundColor: rgba(79, 64, 28, 0.99); +$heading1TextShadow: 0 1px 0 #ccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaa, 0 6px 1px rgba(0,0,0,.1), 0 0 5px rgba(0,0,0,.1), 0 1px 3px rgba(0,0,0,.3), 0 3px 5px rgba(0,0,0,.2), 0 5px 10px rgba(0,0,0,.25), 0 20px 20px rgba(0,0,0,.15); + +// Background generator +@mixin bodyBackground() { + @include radial-gradient( rgba(247,242,211,1), rgba(255,255,255,1) ); +} + +// Change text colors against dark slide backgrounds +@include dark-bg-text-color(#fff); + + +// Theme template ------------------------------ +@import "../template/theme"; +// --------------------------------------------- diff --git a/static/presentations/2021-11-13/garage/css/theme/source/black.scss b/static/presentations/2021-11-13/garage/css/theme/source/black.scss new file mode 100644 index 0000000..358dc1d --- /dev/null +++ b/static/presentations/2021-11-13/garage/css/theme/source/black.scss @@ -0,0 +1,46 @@ +/** + * Black theme for reveal.js. This is the opposite of the 'white' theme. + * + * By Hakim El Hattab, http://hakim.se + */ + + +// Default mixins and settings ----------------- +@import "../template/mixins"; +@import "../template/settings"; +// --------------------------------------------- + + +// Include theme-specific fonts +@import url(./fonts/source-sans-pro/source-sans-pro.css); + + +// Override theme settings (see ../template/settings.scss) +$backgroundColor: #191919; + +$mainColor: #fff; +$headingColor: #fff; + +$mainFontSize: 42px; +$mainFont: 'Source Sans Pro', Helvetica, sans-serif; +$headingFont: 'Source Sans Pro', Helvetica, sans-serif; +$headingTextShadow: none; +$headingLetterSpacing: normal; +$headingTextTransform: uppercase; +$headingFontWeight: 600; +$linkColor: #42affa; +$linkColorHover: lighten( $linkColor, 15% ); +$selectionBackgroundColor: lighten( $linkColor, 25% ); + +$heading1Size: 2.5em; +$heading2Size: 1.6em; +$heading3Size: 1.3em; +$heading4Size: 1.0em; + +// Change text colors against light slide backgrounds +@include light-bg-text-color(#222); + + +// Theme template ------------------------------ +@import "../template/theme"; +// --------------------------------------------- diff --git a/static/presentations/2021-11-13/garage/css/theme/source/blood.scss b/static/presentations/2021-11-13/garage/css/theme/source/blood.scss new file mode 100644 index 0000000..b5a8679 --- /dev/null +++ b/static/presentations/2021-11-13/garage/css/theme/source/blood.scss @@ -0,0 +1,87 @@ +/** + * Blood theme for reveal.js + * Author: Walther http://github.com/Walther + * + * Designed to be used with highlight.js theme + * "monokai_sublime.css" available from + * https://github.com/isagalaev/highlight.js/ + * + * For other themes, change $codeBackground accordingly. + * + */ + + // Default mixins and settings ----------------- +@import "../template/mixins"; +@import "../template/settings"; +// --------------------------------------------- + +// Include theme-specific fonts + +@import url(https://fonts.googleapis.com/css?family=Ubuntu:300,700,300italic,700italic); + +// Colors used in the theme +$blood: #a23; +$coal: #222; +$codeBackground: #23241f; + +$backgroundColor: $coal; + +// Main text +$mainFont: Ubuntu, 'sans-serif'; +$mainColor: #eee; + +// Headings +$headingFont: Ubuntu, 'sans-serif'; +$headingTextShadow: 2px 2px 2px $coal; + +// h1 shadow, borrowed humbly from +// (c) Default theme by Hakim El Hattab +$heading1TextShadow: 0 1px 0 #ccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaa, 0 6px 1px rgba(0,0,0,.1), 0 0 5px rgba(0,0,0,.1), 0 1px 3px rgba(0,0,0,.3), 0 3px 5px rgba(0,0,0,.2), 0 5px 10px rgba(0,0,0,.25), 0 20px 20px rgba(0,0,0,.15); + +// Links +$linkColor: $blood; +$linkColorHover: lighten( $linkColor, 20% ); + +// Text selection +$selectionBackgroundColor: $blood; +$selectionColor: #fff; + +// Change text colors against dark slide backgrounds +@include light-bg-text-color(#222); + + +// Theme template ------------------------------ +@import "../template/theme"; +// --------------------------------------------- + +// some overrides after theme template import + +.reveal p { + font-weight: 300; + text-shadow: 1px 1px $coal; +} + +section.has-light-background { + p, h1, h2, h3, h4 { + text-shadow: none; + } +} + +.reveal h1, +.reveal h2, +.reveal h3, +.reveal h4, +.reveal h5, +.reveal h6 { + font-weight: 700; +} + +.reveal p code { + background-color: $codeBackground; + display: inline-block; + border-radius: 7px; +} + +.reveal small code { + vertical-align: baseline; +} \ No newline at end of file diff --git a/static/presentations/2021-11-13/garage/css/theme/source/league.scss b/static/presentations/2021-11-13/garage/css/theme/source/league.scss new file mode 100644 index 0000000..ee01258 --- /dev/null +++ b/static/presentations/2021-11-13/garage/css/theme/source/league.scss @@ -0,0 +1,36 @@ +/** + * League theme for reveal.js. + * + * This was the default theme pre-3.0.0. + * + * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se + */ + + +// Default mixins and settings ----------------- +@import "../template/mixins"; +@import "../template/settings"; +// --------------------------------------------- + + + +// Include theme-specific fonts +@import url(./fonts/league-gothic/league-gothic.css); +@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic); + +// Override theme settings (see ../template/settings.scss) +$headingTextShadow: 0px 0px 6px rgba(0,0,0,0.2); +$heading1TextShadow: 0 1px 0 #ccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaa, 0 6px 1px rgba(0,0,0,.1), 0 0 5px rgba(0,0,0,.1), 0 1px 3px rgba(0,0,0,.3), 0 3px 5px rgba(0,0,0,.2), 0 5px 10px rgba(0,0,0,.25), 0 20px 20px rgba(0,0,0,.15); + +// Background generator +@mixin bodyBackground() { + @include radial-gradient( rgba(28,30,32,1), rgba(85,90,95,1) ); +} + +// Change text colors against light slide backgrounds +@include light-bg-text-color(#222); + + +// Theme template ------------------------------ +@import "../template/theme"; +// --------------------------------------------- diff --git a/static/presentations/2021-11-13/garage/css/theme/source/moon.scss b/static/presentations/2021-11-13/garage/css/theme/source/moon.scss new file mode 100644 index 0000000..ff2074a --- /dev/null +++ b/static/presentations/2021-11-13/garage/css/theme/source/moon.scss @@ -0,0 +1,58 @@ +/** + * Solarized Dark theme for reveal.js. + * Author: Achim Staebler + */ + + +// Default mixins and settings ----------------- +@import "../template/mixins"; +@import "../template/settings"; +// --------------------------------------------- + + + +// Include theme-specific fonts +@import url(./fonts/league-gothic/league-gothic.css); +@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic); + +/** + * Solarized colors by Ethan Schoonover + */ +html * { + color-profile: sRGB; + rendering-intent: auto; +} + +// Solarized colors +$base03: #002b36; +$base02: #073642; +$base01: #586e75; +$base00: #657b83; +$base0: #839496; +$base1: #93a1a1; +$base2: #eee8d5; +$base3: #fdf6e3; +$yellow: #b58900; +$orange: #cb4b16; +$red: #dc322f; +$magenta: #d33682; +$violet: #6c71c4; +$blue: #268bd2; +$cyan: #2aa198; +$green: #859900; + +// Override theme settings (see ../template/settings.scss) +$mainColor: $base1; +$headingColor: $base2; +$headingTextShadow: none; +$backgroundColor: $base03; +$linkColor: $blue; +$linkColorHover: lighten( $linkColor, 20% ); +$selectionBackgroundColor: $magenta; + +// Change text colors against light slide backgrounds +@include light-bg-text-color(#222); + +// Theme template ------------------------------ +@import "../template/theme"; +// --------------------------------------------- diff --git a/static/presentations/2021-11-13/garage/css/theme/source/night.scss b/static/presentations/2021-11-13/garage/css/theme/source/night.scss new file mode 100644 index 0000000..98a2062 --- /dev/null +++ b/static/presentations/2021-11-13/garage/css/theme/source/night.scss @@ -0,0 +1,37 @@ +/** + * Black theme for reveal.js. + * + * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se + */ + + +// Default mixins and settings ----------------- +@import "../template/mixins"; +@import "../template/settings"; +// --------------------------------------------- + + +// Include theme-specific fonts +@import url(https://fonts.googleapis.com/css?family=Montserrat:700); +@import url(https://fonts.googleapis.com/css?family=Open+Sans:400,700,400italic,700italic); + + +// Override theme settings (see ../template/settings.scss) +$backgroundColor: #111; + +$mainFont: 'Open Sans', sans-serif; +$linkColor: #e7ad52; +$linkColorHover: lighten( $linkColor, 20% ); +$headingFont: 'Montserrat', Impact, sans-serif; +$headingTextShadow: none; +$headingLetterSpacing: -0.03em; +$headingTextTransform: none; +$selectionBackgroundColor: #e7ad52; + +// Change text colors against light slide backgrounds +@include light-bg-text-color(#222); + + +// Theme template ------------------------------ +@import "../template/theme"; +// --------------------------------------------- \ No newline at end of file diff --git a/static/presentations/2021-11-13/garage/css/theme/source/serif.scss b/static/presentations/2021-11-13/garage/css/theme/source/serif.scss new file mode 100644 index 0000000..1c8d778 --- /dev/null +++ b/static/presentations/2021-11-13/garage/css/theme/source/serif.scss @@ -0,0 +1,38 @@ +/** + * A simple theme for reveal.js presentations, similar + * to the default theme. The accent color is brown. + * + * This theme is Copyright (C) 2012-2013 Owen Versteeg, http://owenversteeg.com - it is MIT licensed. + */ + + +// Default mixins and settings ----------------- +@import "../template/mixins"; +@import "../template/settings"; +// --------------------------------------------- + + + +// Override theme settings (see ../template/settings.scss) +$mainFont: 'Palatino Linotype', 'Book Antiqua', Palatino, FreeSerif, serif; +$mainColor: #000; +$headingFont: 'Palatino Linotype', 'Book Antiqua', Palatino, FreeSerif, serif; +$headingColor: #383D3D; +$headingTextShadow: none; +$headingTextTransform: none; +$backgroundColor: #F0F1EB; +$linkColor: #51483D; +$linkColorHover: lighten( $linkColor, 20% ); +$selectionBackgroundColor: #26351C; + +.reveal a { + line-height: 1.3em; +} + +// Change text colors against dark slide backgrounds +@include dark-bg-text-color(#fff); + + +// Theme template ------------------------------ +@import "../template/theme"; +// --------------------------------------------- diff --git a/static/presentations/2021-11-13/garage/css/theme/source/simple.scss b/static/presentations/2021-11-13/garage/css/theme/source/simple.scss new file mode 100644 index 0000000..faf245f --- /dev/null +++ b/static/presentations/2021-11-13/garage/css/theme/source/simple.scss @@ -0,0 +1,40 @@ +/** + * A simple theme for reveal.js presentations, similar + * to the default theme. The accent color is darkblue. + * + * This theme is Copyright (C) 2012 Owen Versteeg, https://github.com/StereotypicalApps. It is MIT licensed. + * reveal.js is Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se + */ + + +// Default mixins and settings ----------------- +@import "../template/mixins"; +@import "../template/settings"; +// --------------------------------------------- + + + +// Include theme-specific fonts +@import url(https://fonts.googleapis.com/css?family=News+Cycle:400,700); +@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic); + + +// Override theme settings (see ../template/settings.scss) +$mainFont: 'Lato', sans-serif; +$mainColor: #000; +$headingFont: 'News Cycle', Impact, sans-serif; +$headingColor: #000; +$headingTextShadow: none; +$headingTextTransform: none; +$backgroundColor: #fff; +$linkColor: #00008B; +$linkColorHover: lighten( $linkColor, 20% ); +$selectionBackgroundColor: rgba(0, 0, 0, 0.99); + +// Change text colors against dark slide backgrounds +@include dark-bg-text-color(#fff); + + +// Theme template ------------------------------ +@import "../template/theme"; +// --------------------------------------------- \ No newline at end of file diff --git a/static/presentations/2021-11-13/garage/css/theme/source/sky.scss b/static/presentations/2021-11-13/garage/css/theme/source/sky.scss new file mode 100644 index 0000000..c83b9c0 --- /dev/null +++ b/static/presentations/2021-11-13/garage/css/theme/source/sky.scss @@ -0,0 +1,49 @@ +/** + * Sky theme for reveal.js. + * + * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se + */ + + +// Default mixins and settings ----------------- +@import "../template/mixins"; +@import "../template/settings"; +// --------------------------------------------- + + + +// Include theme-specific fonts +@import url(https://fonts.googleapis.com/css?family=Quicksand:400,700,400italic,700italic); +@import url(https://fonts.googleapis.com/css?family=Open+Sans:400italic,700italic,400,700); + + +// Override theme settings (see ../template/settings.scss) +$mainFont: 'Open Sans', sans-serif; +$mainColor: #333; +$headingFont: 'Quicksand', sans-serif; +$headingColor: #333; +$headingLetterSpacing: -0.08em; +$headingTextShadow: none; +$backgroundColor: #f7fbfc; +$linkColor: #3b759e; +$linkColorHover: lighten( $linkColor, 20% ); +$selectionBackgroundColor: #134674; + +// Fix links so they are not cut off +.reveal a { + line-height: 1.3em; +} + +// Background generator +@mixin bodyBackground() { + @include radial-gradient( #add9e4, #f7fbfc ); +} + +// Change text colors against dark slide backgrounds +@include dark-bg-text-color(#fff); + + + +// Theme template ------------------------------ +@import "../template/theme"; +// --------------------------------------------- diff --git a/static/presentations/2021-11-13/garage/css/theme/source/solarized.scss b/static/presentations/2021-11-13/garage/css/theme/source/solarized.scss new file mode 100644 index 0000000..8bdf1eb --- /dev/null +++ b/static/presentations/2021-11-13/garage/css/theme/source/solarized.scss @@ -0,0 +1,63 @@ +/** + * Solarized Light theme for reveal.js. + * Author: Achim Staebler + */ + + +// Default mixins and settings ----------------- +@import "../template/mixins"; +@import "../template/settings"; +// --------------------------------------------- + + + +// Include theme-specific fonts +@import url(./fonts/league-gothic/league-gothic.css); +@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic); + + +/** + * Solarized colors by Ethan Schoonover + */ +html * { + color-profile: sRGB; + rendering-intent: auto; +} + +// Solarized colors +$base03: #002b36; +$base02: #073642; +$base01: #586e75; +$base00: #657b83; +$base0: #839496; +$base1: #93a1a1; +$base2: #eee8d5; +$base3: #fdf6e3; +$yellow: #b58900; +$orange: #cb4b16; +$red: #dc322f; +$magenta: #d33682; +$violet: #6c71c4; +$blue: #268bd2; +$cyan: #2aa198; +$green: #859900; + +// Override theme settings (see ../template/settings.scss) +$mainColor: $base00; +$headingColor: $base01; +$headingTextShadow: none; +$backgroundColor: $base3; +$linkColor: $blue; +$linkColorHover: lighten( $linkColor, 20% ); +$selectionBackgroundColor: $magenta; + +// Background generator +// @mixin bodyBackground() { +// @include radial-gradient( rgba($base3,1), rgba(lighten($base3, 20%),1) ); +// } + + + +// Theme template ------------------------------ +@import "../template/theme"; +// --------------------------------------------- diff --git a/static/presentations/2021-11-13/garage/css/theme/source/white.scss b/static/presentations/2021-11-13/garage/css/theme/source/white.scss new file mode 100644 index 0000000..443d30a --- /dev/null +++ b/static/presentations/2021-11-13/garage/css/theme/source/white.scss @@ -0,0 +1,46 @@ +/** + * White theme for reveal.js. This is the opposite of the 'black' theme. + * + * By Hakim El Hattab, http://hakim.se + */ + + +// Default mixins and settings ----------------- +@import "../template/mixins"; +@import "../template/settings"; +// --------------------------------------------- + + +// Include theme-specific fonts +@import url(./fonts/source-sans-pro/source-sans-pro.css); + + +// Override theme settings (see ../template/settings.scss) +$backgroundColor: #fff; + +$mainColor: #222; +$headingColor: #222; + +$mainFontSize: 42px; +$mainFont: 'Source Sans Pro', Helvetica, sans-serif; +$headingFont: 'Source Sans Pro', Helvetica, sans-serif; +$headingTextShadow: none; +$headingLetterSpacing: normal; +$headingTextTransform: uppercase; +$headingFontWeight: 600; +$linkColor: #2a76dd; +$linkColorHover: lighten( $linkColor, 15% ); +$selectionBackgroundColor: lighten( $linkColor, 25% ); + +$heading1Size: 2.5em; +$heading2Size: 1.6em; +$heading3Size: 1.3em; +$heading4Size: 1.0em; + +// Change text colors against dark slide backgrounds +@include dark-bg-text-color(#fff); + + +// Theme template ------------------------------ +@import "../template/theme"; +// --------------------------------------------- diff --git a/static/presentations/2021-11-13/garage/css/theme/template/exposer.scss b/static/presentations/2021-11-13/garage/css/theme/template/exposer.scss new file mode 100644 index 0000000..4aec3e8 --- /dev/null +++ b/static/presentations/2021-11-13/garage/css/theme/template/exposer.scss @@ -0,0 +1,28 @@ +// Exposes theme's variables for easy re-use in CSS for plugin authors + +:root { + --r-background-color: #{$backgroundColor}; + --r-main-font: #{$mainFont}; + --r-main-font-size: #{$mainFontSize}; + --r-main-color: #{$mainColor}; + --r-block-margin: #{$blockMargin}; + --r-heading-margin: #{$headingMargin}; + --r-heading-font: #{$headingFont}; + --r-heading-color: #{$headingColor}; + --r-heading-line-height: #{$headingLineHeight}; + --r-heading-letter-spacing: #{$headingLetterSpacing}; + --r-heading-text-transform: #{$headingTextTransform}; + --r-heading-text-shadow: #{$headingTextShadow}; + --r-heading-font-weight: #{$headingFontWeight}; + --r-heading1-text-shadow: #{$heading1TextShadow}; + --r-heading1-size: #{$heading1Size}; + --r-heading2-size: #{$heading2Size}; + --r-heading3-size: #{$heading3Size}; + --r-heading4-size: #{$heading4Size}; + --r-code-font: #{$codeFont}; + --r-link-color: #{$linkColor}; + --r-link-color-dark: #{darken($linkColor , 15% )}; + --r-link-color-hover: #{$linkColorHover}; + --r-selection-background-color: #{$selectionBackgroundColor}; + --r-selection-color: #{$selectionColor}; +} diff --git a/static/presentations/2021-11-13/garage/css/theme/template/mixins.scss b/static/presentations/2021-11-13/garage/css/theme/template/mixins.scss new file mode 100644 index 0000000..17a3db5 --- /dev/null +++ b/static/presentations/2021-11-13/garage/css/theme/template/mixins.scss @@ -0,0 +1,45 @@ +@mixin vertical-gradient( $top, $bottom ) { + background: $top; + background: -moz-linear-gradient( top, $top 0%, $bottom 100% ); + background: -webkit-gradient( linear, left top, left bottom, color-stop(0%,$top), color-stop(100%,$bottom) ); + background: -webkit-linear-gradient( top, $top 0%, $bottom 100% ); + background: -o-linear-gradient( top, $top 0%, $bottom 100% ); + background: -ms-linear-gradient( top, $top 0%, $bottom 100% ); + background: linear-gradient( top, $top 0%, $bottom 100% ); +} + +@mixin horizontal-gradient( $top, $bottom ) { + background: $top; + background: -moz-linear-gradient( left, $top 0%, $bottom 100% ); + background: -webkit-gradient( linear, left top, right top, color-stop(0%,$top), color-stop(100%,$bottom) ); + background: -webkit-linear-gradient( left, $top 0%, $bottom 100% ); + background: -o-linear-gradient( left, $top 0%, $bottom 100% ); + background: -ms-linear-gradient( left, $top 0%, $bottom 100% ); + background: linear-gradient( left, $top 0%, $bottom 100% ); +} + +@mixin radial-gradient( $outer, $inner, $type: circle ) { + background: $outer; + background: -moz-radial-gradient( center, $type cover, $inner 0%, $outer 100% ); + background: -webkit-gradient( radial, center center, 0px, center center, 100%, color-stop(0%,$inner), color-stop(100%,$outer) ); + background: -webkit-radial-gradient( center, $type cover, $inner 0%, $outer 100% ); + background: -o-radial-gradient( center, $type cover, $inner 0%, $outer 100% ); + background: -ms-radial-gradient( center, $type cover, $inner 0%, $outer 100% ); + background: radial-gradient( center, $type cover, $inner 0%, $outer 100% ); +} + +@mixin light-bg-text-color( $color ) { + section.has-light-background { + &, h1, h2, h3, h4, h5, h6 { + color: $color; + } + } +} + +@mixin dark-bg-text-color( $color ) { + section.has-dark-background { + &, h1, h2, h3, h4, h5, h6 { + color: $color; + } + } +} \ No newline at end of file diff --git a/static/presentations/2021-11-13/garage/css/theme/template/settings.scss b/static/presentations/2021-11-13/garage/css/theme/template/settings.scss new file mode 100644 index 0000000..5a917f8 --- /dev/null +++ b/static/presentations/2021-11-13/garage/css/theme/template/settings.scss @@ -0,0 +1,45 @@ +// Base settings for all themes that can optionally be +// overridden by the super-theme + +// Background of the presentation +$backgroundColor: #2b2b2b; + +// Primary/body text +$mainFont: 'Lato', sans-serif; +$mainFontSize: 40px; +$mainColor: #eee; + +// Vertical spacing between blocks of text +$blockMargin: 20px; + +// Headings +$headingMargin: 0 0 $blockMargin 0; +$headingFont: 'League Gothic', Impact, sans-serif; +$headingColor: #eee; +$headingLineHeight: 1.2; +$headingLetterSpacing: normal; +$headingTextTransform: uppercase; +$headingTextShadow: none; +$headingFontWeight: normal; +$heading1TextShadow: $headingTextShadow; + +$heading1Size: 3.77em; +$heading2Size: 2.11em; +$heading3Size: 1.55em; +$heading4Size: 1.00em; + +$codeFont: monospace; + +// Links and actions +$linkColor: #13DAEC; +$linkColorHover: lighten( $linkColor, 20% ); + +// Text selection +$selectionBackgroundColor: #FF5E99; +$selectionColor: #fff; + +// Generates the presentation background, can be overridden +// to return a background image or gradient +@mixin bodyBackground() { + background: $backgroundColor; +} diff --git a/static/presentations/2021-11-13/garage/css/theme/template/theme.scss b/static/presentations/2021-11-13/garage/css/theme/template/theme.scss new file mode 100644 index 0000000..bc377d3 --- /dev/null +++ b/static/presentations/2021-11-13/garage/css/theme/template/theme.scss @@ -0,0 +1,331 @@ +// Base theme template for reveal.js + +/********************************************* + * GLOBAL STYLES + *********************************************/ + +@import "./exposer"; + +.reveal-viewport { + @include bodyBackground(); + background-color: var(--r-background-color); +} + +.reveal { + font-family: var(--r-main-font); + font-size: var(--r-main-font-size); + font-weight: normal; + color: var(--r-main-color); +} + +.reveal ::selection { + color: var(--r-selection-color); + background: var(--r-selection-background-color); + text-shadow: none; +} + +.reveal ::-moz-selection { + color: var(--r-selection-color); + background: var(--r-selection-background-color); + text-shadow: none; +} + +.reveal .slides section, +.reveal .slides section>section { + line-height: 1.3; + font-weight: inherit; +} + +/********************************************* + * HEADERS + *********************************************/ + +.reveal h1, +.reveal h2, +.reveal h3, +.reveal h4, +.reveal h5, +.reveal h6 { + margin: var(--r-heading-margin); + color: var(--r-heading-color); + + font-family: var(--r-heading-font); + font-weight: var(--r-heading-font-weight); + line-height: var(--r-heading-line-height); + letter-spacing: var(--r-heading-letter-spacing); + + text-transform: var(--r-heading-text-transform); + text-shadow: var(--r-heading-text-shadow); + + word-wrap: break-word; +} + +.reveal h1 {font-size: var(--r-heading1-size); } +.reveal h2 {font-size: var(--r-heading2-size); } +.reveal h3 {font-size: var(--r-heading3-size); } +.reveal h4 {font-size: var(--r-heading4-size); } + +.reveal h1 { + text-shadow: var(--r-heading1-text-shadow); +} + + +/********************************************* + * OTHER + *********************************************/ + +.reveal p { + margin: var(--r-block-margin) 0; + line-height: 1.3; +} + +/* Remove trailing margins after titles */ +.reveal h1:last-child, +.reveal h2:last-child, +.reveal h3:last-child, +.reveal h4:last-child, +.reveal h5:last-child, +.reveal h6:last-child { + margin-bottom: 0; +} + +/* Ensure certain elements are never larger than the slide itself */ +.reveal img, +.reveal video, +.reveal iframe { + max-width: 95%; + max-height: 95%; +} +.reveal strong, +.reveal b { + font-weight: bold; +} + +.reveal em { + font-style: italic; +} + +.reveal ol, +.reveal dl, +.reveal ul { + display: inline-block; + + text-align: left; + margin: 0 0 0 1em; +} + +.reveal ol { + list-style-type: decimal; +} + +.reveal ul { + list-style-type: disc; +} + +.reveal ul ul { + list-style-type: square; +} + +.reveal ul ul ul { + list-style-type: circle; +} + +.reveal ul ul, +.reveal ul ol, +.reveal ol ol, +.reveal ol ul { + display: block; + margin-left: 40px; +} + +.reveal dt { + font-weight: bold; +} + +.reveal dd { + margin-left: 40px; +} + +.reveal blockquote { + display: block; + position: relative; + width: 70%; + margin: var(--r-block-margin) auto; + padding: 5px; + + font-style: italic; + background: rgba(255, 255, 255, 0.05); + box-shadow: 0px 0px 2px rgba(0,0,0,0.2); +} + .reveal blockquote p:first-child, + .reveal blockquote p:last-child { + display: inline-block; + } + +.reveal q { + font-style: italic; +} + +.reveal pre { + display: block; + position: relative; + width: 90%; + margin: var(--r-block-margin) auto; + + text-align: left; + font-size: 0.55em; + font-family: var(--r-code-font); + line-height: 1.2em; + + word-wrap: break-word; + + box-shadow: 0px 5px 15px rgba(0, 0, 0, 0.15); +} + +.reveal code { + font-family: var(--r-code-font); + text-transform: none; + tab-size: 2; +} + +.reveal pre code { + display: block; + padding: 5px; + overflow: auto; + max-height: 400px; + word-wrap: normal; +} + +.reveal .code-wrapper { + white-space: normal; +} + +.reveal .code-wrapper code { + white-space: pre; +} + +.reveal table { + margin: auto; + border-collapse: collapse; + border-spacing: 0; +} + +.reveal table th { + font-weight: bold; +} + +.reveal table th, +.reveal table td { + text-align: left; + padding: 0.2em 0.5em 0.2em 0.5em; + border-bottom: 1px solid; +} + +.reveal table th[align="center"], +.reveal table td[align="center"] { + text-align: center; +} + +.reveal table th[align="right"], +.reveal table td[align="right"] { + text-align: right; +} + +.reveal table tbody tr:last-child th, +.reveal table tbody tr:last-child td { + border-bottom: none; +} + +.reveal sup { + vertical-align: super; + font-size: smaller; +} +.reveal sub { + vertical-align: sub; + font-size: smaller; +} + +.reveal small { + display: inline-block; + font-size: 0.6em; + line-height: 1.2em; + vertical-align: top; +} + +.reveal small * { + vertical-align: top; +} + +.reveal img { + margin: var(--r-block-margin) 0; +} + + +/********************************************* + * LINKS + *********************************************/ + +.reveal a { + color: var(--r-link-color); + text-decoration: none; + transition: color .15s ease; +} + .reveal a:hover { + color: var(--r-link-color-hover); + text-shadow: none; + border: none; + } + +.reveal .roll span:after { + color: #fff; + // background: darken( var(--r-link-color), 15% ); + background: var(--r-link-color-dark); + +} + + +/********************************************* + * Frame helper + *********************************************/ + +.reveal .r-frame { + border: 4px solid var(--r-main-color); + box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); +} + +.reveal a .r-frame { + transition: all .15s linear; +} + +.reveal a:hover .r-frame { + border-color: var(--r-link-color); + box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); +} + + +/********************************************* + * NAVIGATION CONTROLS + *********************************************/ + +.reveal .controls { + color: var(--r-link-color); +} + + +/********************************************* + * PROGRESS BAR + *********************************************/ + +.reveal .progress { + background: rgba(0,0,0,0.2); + color: var(--r-link-color); +} + +/********************************************* + * PRINT BACKGROUND + *********************************************/ + @media print { + .backgrounds { + background-color: var(--r-background-color); + } +} diff --git a/static/presentations/2021-11-13/garage/demo.html b/static/presentations/2021-11-13/garage/demo.html new file mode 100644 index 0000000..807bc05 --- /dev/null +++ b/static/presentations/2021-11-13/garage/demo.html @@ -0,0 +1,476 @@ + + + + + + + reveal.js – The HTML Presentation Framework + + + + + + + + + + + + + + + + + + + +
+ + +
+
+ + + +

The HTML Presentation Framework

+

+ Created by Hakim El Hattab and contributors +

+
+ +
+

Hello There

+

+ reveal.js enables you to create beautiful interactive slide decks using HTML. This presentation will show you examples of what it can do. +

+
+ + +
+
+

Vertical Slides

+

Slides can be nested inside of each other.

+

Use the Space key to navigate through all slides.

+
+ + Down arrow + +
+
+

Basement Level 1

+

Nested slides are useful for adding additional detail underneath a high level horizontal slide.

+
+
+

Basement Level 2

+

That's it, time to go back up.

+
+ + Up arrow + +
+
+ +
+

Slides

+

+ Not a coder? Not a problem. There's a fully-featured visual editor for authoring these, try it out at https://slides.com. +

+
+ +
+

Hidden Slides

+

+ This slide is visible in the source, but hidden when the presentation is viewed. You can show all hidden slides by setting the `showHiddenSlides` config option to `true`. +

+
+ +
+

Pretty Code

+

+						import React, { useState } from 'react';
+
+						function Example() {
+						  const [count, setCount] = useState(0);
+
+						  return (
+						    ...
+						  );
+						}
+					
+

Code syntax highlighting courtesy of highlight.js.

+
+ +
+

With animations

+
+
+ +
+

Point of View

+

+ Press ESC to enter the slide overview. +

+

+ Hold down the alt key (ctrl in Linux) and click on any element to zoom towards it using zoom.js. Click again to zoom back out. +

+

+ (NOTE: Use ctrl + click in Linux.) +

+
+ +
+

Auto-Animate

+

Automatically animate matching elements across slides with Auto-Animate.

+
+
+
+
+
+
+
+
+
+
+
+
+

Auto-Animate

+
+
+
+
+
+
+
+

Auto-Animate

+
+ +
+

Touch Optimized

+

+ Presentations look great on touch devices, like mobile phones and tablets. Simply swipe through your slides. +

+
+ +
+ +
+ +
+

Add the r-fit-text class to auto-size text

+

FIT TEXT

+
+ +
+
+

Fragments

+

Hit the next arrow...

+

... to step through ...

+

... a fragmented slide.

+ + +
+
+

Fragment Styles

+

There's different types of fragments, like:

+

grow

+

shrink

+

fade-out

+

+ fade-right, + up, + down, + left +

+

fade-in-then-out

+

fade-in-then-semi-out

+

Highlight red blue green

+
+
+ +
+

Transition Styles

+

+ You can select from different transitions, like:
+ None - + Fade - + Slide - + Convex - + Concave - + Zoom +

+
+ +
+

Themes

+

+ reveal.js comes with a few themes built in:
+ + Black (default) - + White - + League - + Sky - + Beige - + Simple
+ Serif - + Blood - + Night - + Moon - + Solarized +

+
+ +
+
+

Slide Backgrounds

+

+ Set data-background="#dddddd" on a slide to change the background color. All CSS color formats are supported. +

+ + Down arrow + +
+
+

Image Backgrounds

+
<section data-background="image.png">
+
+
+

Tiled Backgrounds

+
<section data-background="image.png" data-background-repeat="repeat" data-background-size="100px">
+
+
+
+

Video Backgrounds

+
<section data-background-video="video.mp4,video.webm">
+
+
+
+

... and GIFs!

+
+
+ +
+

Background Transitions

+

+ Different background transitions are available via the backgroundTransition option. This one's called "zoom". +

+
Reveal.configure({ backgroundTransition: 'zoom' })
+
+ +
+

Background Transitions

+

+ You can override background transitions per-slide. +

+
<section data-background-transition="zoom">
+
+ +
+
+

Iframe Backgrounds

+

Since reveal.js runs on the web, you can easily embed other web content. Try interacting with the page in the background.

+
+
+ +
+

Marvelous List

+
    +
  • No order here
  • +
  • Or here
  • +
  • Or here
  • +
  • Or here
  • +
+
+ +
+

Fantastic Ordered List

+
    +
  1. One is smaller than...
  2. +
  3. Two is smaller than...
  4. +
  5. Three!
  6. +
+
+ +
+

Tabular Tables

+ + + + + + + + + + + + + + + + + + + + + + + + + +
ItemValueQuantity
Apples$17
Lemonade$218
Bread$32
+
+ +
+

Clever Quotes

+

+ These guys come in two forms, inline: The nice thing about standards is that there are so many to choose from and block: +

+
+ “For years there has been a theory that millions of monkeys typing at random on millions of typewriters would + reproduce the entire works of Shakespeare. The Internet has proven this theory to be untrue.” +
+
+ +
+

Intergalactic Interconnections

+

+ You can link between slides internally, + like this. +

+
+ +
+

Speaker View

+

There's a speaker view. It includes a timer, preview of the upcoming slide as well as your speaker notes.

+

Press the S key to try it out.

+ + +
+ +
+

Export to PDF

+

Presentations can be exported to PDF, here's an example:

+ +
+ +
+

Global State

+

+ Set data-state="something" on a slide and "something" + will be added as a class to the document element when the slide is open. This lets you + apply broader style changes, like switching the page background. +

+
+ +
+

State Events

+

+ Additionally custom events can be triggered on a per slide basis by binding to the data-state name. +

+

+Reveal.on( 'customevent', function() {
+	console.log( '"customevent" has fired' );
+} );
+					
+
+ +
+

Take a Moment

+

+ Press B or . on your keyboard to pause the presentation. This is helpful when you're on stage and want to take distracting slides off the screen. +

+
+ +
+

Much more

+ +
+ +
+

THE END

+

+ - Try the online editor
+ - Source code & documentation +

+
+ +
+ +
+ + + + + + + + + + + diff --git a/static/presentations/2021-11-13/garage/dist/reset.css b/static/presentations/2021-11-13/garage/dist/reset.css new file mode 100644 index 0000000..e238539 --- /dev/null +++ b/static/presentations/2021-11-13/garage/dist/reset.css @@ -0,0 +1,30 @@ +/* http://meyerweb.com/eric/tools/css/reset/ + v4.0 | 20180602 + License: none (public domain) +*/ + +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, embed, +figure, figcaption, footer, header, hgroup, +main, menu, nav, output, ruby, section, summary, +time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; +} +/* HTML5 display-role reset for older browsers */ +article, aside, details, figcaption, figure, +footer, header, hgroup, main, menu, nav, section { + display: block; +} \ No newline at end of file diff --git a/static/presentations/2021-11-13/garage/dist/reveal.css b/static/presentations/2021-11-13/garage/dist/reveal.css new file mode 100644 index 0000000..c3a2ecb --- /dev/null +++ b/static/presentations/2021-11-13/garage/dist/reveal.css @@ -0,0 +1,8 @@ +/*! +* reveal.js 4.2.0 +* https://revealjs.com +* MIT licensed +* +* Copyright (C) 2011-2021 Hakim El Hattab, https://hakim.se +*/ +.reveal .r-stretch,.reveal .stretch{max-width:none;max-height:none}.reveal pre.r-stretch code,.reveal pre.stretch code{height:100%;max-height:100%;box-sizing:border-box}.reveal .r-fit-text{display:inline-block;white-space:nowrap}.reveal .r-stack{display:grid}.reveal .r-stack>*{grid-area:1/1;margin:auto}.reveal .r-hstack,.reveal .r-vstack{display:flex}.reveal .r-hstack img,.reveal .r-hstack video,.reveal .r-vstack img,.reveal .r-vstack video{min-width:0;min-height:0;-o-object-fit:contain;object-fit:contain}.reveal .r-vstack{flex-direction:column;align-items:center;justify-content:center}.reveal .r-hstack{flex-direction:row;align-items:center;justify-content:center}.reveal .items-stretch{align-items:stretch}.reveal .items-start{align-items:flex-start}.reveal .items-center{align-items:center}.reveal .items-end{align-items:flex-end}.reveal .justify-between{justify-content:space-between}.reveal .justify-around{justify-content:space-around}.reveal .justify-start{justify-content:flex-start}.reveal .justify-center{justify-content:center}.reveal .justify-end{justify-content:flex-end}html.reveal-full-page{width:100%;height:100%;height:100vh;height:calc(var(--vh,1vh) * 100);overflow:hidden}.reveal-viewport{height:100%;overflow:hidden;position:relative;line-height:1;margin:0;background-color:#fff;color:#000}.reveal .slides section .fragment{opacity:0;visibility:hidden;transition:all .2s ease;will-change:opacity}.reveal .slides section .fragment.visible{opacity:1;visibility:inherit}.reveal .slides section .fragment.disabled{transition:none}.reveal .slides section .fragment.grow{opacity:1;visibility:inherit}.reveal .slides section .fragment.grow.visible{transform:scale(1.3)}.reveal .slides section .fragment.shrink{opacity:1;visibility:inherit}.reveal .slides section .fragment.shrink.visible{transform:scale(.7)}.reveal .slides section .fragment.zoom-in{transform:scale(.1)}.reveal .slides section .fragment.zoom-in.visible{transform:none}.reveal .slides section .fragment.fade-out{opacity:1;visibility:inherit}.reveal .slides section .fragment.fade-out.visible{opacity:0;visibility:hidden}.reveal .slides section .fragment.semi-fade-out{opacity:1;visibility:inherit}.reveal .slides section .fragment.semi-fade-out.visible{opacity:.5;visibility:inherit}.reveal .slides section .fragment.strike{opacity:1;visibility:inherit}.reveal .slides section .fragment.strike.visible{text-decoration:line-through}.reveal .slides section .fragment.fade-up{transform:translate(0,40px)}.reveal .slides section .fragment.fade-up.visible{transform:translate(0,0)}.reveal .slides section .fragment.fade-down{transform:translate(0,-40px)}.reveal .slides section .fragment.fade-down.visible{transform:translate(0,0)}.reveal .slides section .fragment.fade-right{transform:translate(-40px,0)}.reveal .slides section .fragment.fade-right.visible{transform:translate(0,0)}.reveal .slides section .fragment.fade-left{transform:translate(40px,0)}.reveal .slides section .fragment.fade-left.visible{transform:translate(0,0)}.reveal .slides section .fragment.current-visible,.reveal .slides section .fragment.fade-in-then-out{opacity:0;visibility:hidden}.reveal .slides section .fragment.current-visible.current-fragment,.reveal .slides section .fragment.fade-in-then-out.current-fragment{opacity:1;visibility:inherit}.reveal .slides section .fragment.fade-in-then-semi-out{opacity:0;visibility:hidden}.reveal .slides section .fragment.fade-in-then-semi-out.visible{opacity:.5;visibility:inherit}.reveal .slides section .fragment.fade-in-then-semi-out.current-fragment{opacity:1;visibility:inherit}.reveal .slides section .fragment.highlight-blue,.reveal .slides section .fragment.highlight-current-blue,.reveal .slides section .fragment.highlight-current-green,.reveal .slides section .fragment.highlight-current-red,.reveal .slides section .fragment.highlight-green,.reveal .slides section .fragment.highlight-red{opacity:1;visibility:inherit}.reveal .slides section .fragment.highlight-red.visible{color:#ff2c2d}.reveal .slides section .fragment.highlight-green.visible{color:#17ff2e}.reveal .slides section .fragment.highlight-blue.visible{color:#1b91ff}.reveal .slides section .fragment.highlight-current-red.current-fragment{color:#ff2c2d}.reveal .slides section .fragment.highlight-current-green.current-fragment{color:#17ff2e}.reveal .slides section .fragment.highlight-current-blue.current-fragment{color:#1b91ff}.reveal:after{content:"";font-style:italic}.reveal iframe{z-index:1}.reveal a{position:relative}@keyframes bounce-right{0%,10%,25%,40%,50%{transform:translateX(0)}20%{transform:translateX(10px)}30%{transform:translateX(-5px)}}@keyframes bounce-left{0%,10%,25%,40%,50%{transform:translateX(0)}20%{transform:translateX(-10px)}30%{transform:translateX(5px)}}@keyframes bounce-down{0%,10%,25%,40%,50%{transform:translateY(0)}20%{transform:translateY(10px)}30%{transform:translateY(-5px)}}.reveal .controls{display:none;position:absolute;top:auto;bottom:12px;right:12px;left:auto;z-index:11;color:#000;pointer-events:none;font-size:10px}.reveal .controls button{position:absolute;padding:0;background-color:transparent;border:0;outline:0;cursor:pointer;color:currentColor;transform:scale(.9999);transition:color .2s ease,opacity .2s ease,transform .2s ease;z-index:2;pointer-events:auto;font-size:inherit;visibility:hidden;opacity:0;-webkit-appearance:none;-webkit-tap-highlight-color:transparent}.reveal .controls .controls-arrow:after,.reveal .controls .controls-arrow:before{content:"";position:absolute;top:0;left:0;width:2.6em;height:.5em;border-radius:.25em;background-color:currentColor;transition:all .15s ease,background-color .8s ease;transform-origin:.2em 50%;will-change:transform}.reveal .controls .controls-arrow{position:relative;width:3.6em;height:3.6em}.reveal .controls .controls-arrow:before{transform:translateX(.5em) translateY(1.55em) rotate(45deg)}.reveal .controls .controls-arrow:after{transform:translateX(.5em) translateY(1.55em) rotate(-45deg)}.reveal .controls .controls-arrow:hover:before{transform:translateX(.5em) translateY(1.55em) rotate(40deg)}.reveal .controls .controls-arrow:hover:after{transform:translateX(.5em) translateY(1.55em) rotate(-40deg)}.reveal .controls .controls-arrow:active:before{transform:translateX(.5em) translateY(1.55em) rotate(36deg)}.reveal .controls .controls-arrow:active:after{transform:translateX(.5em) translateY(1.55em) rotate(-36deg)}.reveal .controls .navigate-left{right:6.4em;bottom:3.2em;transform:translateX(-10px)}.reveal .controls .navigate-left.highlight{animation:bounce-left 2s 50 both ease-out}.reveal .controls .navigate-right{right:0;bottom:3.2em;transform:translateX(10px)}.reveal .controls .navigate-right .controls-arrow{transform:rotate(180deg)}.reveal .controls .navigate-right.highlight{animation:bounce-right 2s 50 both ease-out}.reveal .controls .navigate-up{right:3.2em;bottom:6.4em;transform:translateY(-10px)}.reveal .controls .navigate-up .controls-arrow{transform:rotate(90deg)}.reveal .controls .navigate-down{right:3.2em;bottom:-1.4em;padding-bottom:1.4em;transform:translateY(10px)}.reveal .controls .navigate-down .controls-arrow{transform:rotate(-90deg)}.reveal .controls .navigate-down.highlight{animation:bounce-down 2s 50 both ease-out}.reveal .controls[data-controls-back-arrows=faded] .navigate-up.enabled{opacity:.3}.reveal .controls[data-controls-back-arrows=faded] .navigate-up.enabled:hover{opacity:1}.reveal .controls[data-controls-back-arrows=hidden] .navigate-up.enabled{opacity:0;visibility:hidden}.reveal .controls .enabled{visibility:visible;opacity:.9;cursor:pointer;transform:none}.reveal .controls .enabled.fragmented{opacity:.5}.reveal .controls .enabled.fragmented:hover,.reveal .controls .enabled:hover{opacity:1}.reveal:not(.rtl) .controls[data-controls-back-arrows=faded] .navigate-left.enabled{opacity:.3}.reveal:not(.rtl) .controls[data-controls-back-arrows=faded] .navigate-left.enabled:hover{opacity:1}.reveal:not(.rtl) .controls[data-controls-back-arrows=hidden] .navigate-left.enabled{opacity:0;visibility:hidden}.reveal.rtl .controls[data-controls-back-arrows=faded] .navigate-right.enabled{opacity:.3}.reveal.rtl .controls[data-controls-back-arrows=faded] .navigate-right.enabled:hover{opacity:1}.reveal.rtl .controls[data-controls-back-arrows=hidden] .navigate-right.enabled{opacity:0;visibility:hidden}.reveal[data-navigation-mode=linear].has-horizontal-slides .navigate-down,.reveal[data-navigation-mode=linear].has-horizontal-slides .navigate-up{display:none}.reveal:not(.has-vertical-slides) .controls .navigate-left,.reveal[data-navigation-mode=linear].has-horizontal-slides .navigate-left{bottom:1.4em;right:5.5em}.reveal:not(.has-vertical-slides) .controls .navigate-right,.reveal[data-navigation-mode=linear].has-horizontal-slides .navigate-right{bottom:1.4em;right:.5em}.reveal:not(.has-horizontal-slides) .controls .navigate-up{right:1.4em;bottom:5em}.reveal:not(.has-horizontal-slides) .controls .navigate-down{right:1.4em;bottom:.5em}.reveal.has-dark-background .controls{color:#fff}.reveal.has-light-background .controls{color:#000}.reveal.no-hover .controls .controls-arrow:active:before,.reveal.no-hover .controls .controls-arrow:hover:before{transform:translateX(.5em) translateY(1.55em) rotate(45deg)}.reveal.no-hover .controls .controls-arrow:active:after,.reveal.no-hover .controls .controls-arrow:hover:after{transform:translateX(.5em) translateY(1.55em) rotate(-45deg)}@media screen and (min-width:500px){.reveal .controls[data-controls-layout=edges]{top:0;right:0;bottom:0;left:0}.reveal .controls[data-controls-layout=edges] .navigate-down,.reveal .controls[data-controls-layout=edges] .navigate-left,.reveal .controls[data-controls-layout=edges] .navigate-right,.reveal .controls[data-controls-layout=edges] .navigate-up{bottom:auto;right:auto}.reveal .controls[data-controls-layout=edges] .navigate-left{top:50%;left:.8em;margin-top:-1.8em}.reveal .controls[data-controls-layout=edges] .navigate-right{top:50%;right:.8em;margin-top:-1.8em}.reveal .controls[data-controls-layout=edges] .navigate-up{top:.8em;left:50%;margin-left:-1.8em}.reveal .controls[data-controls-layout=edges] .navigate-down{bottom:-.3em;left:50%;margin-left:-1.8em}}.reveal .progress{position:absolute;display:none;height:3px;width:100%;bottom:0;left:0;z-index:10;background-color:rgba(0,0,0,.2);color:#fff}.reveal .progress:after{content:"";display:block;position:absolute;height:10px;width:100%;top:-10px}.reveal .progress span{display:block;height:100%;width:100%;background-color:currentColor;transition:transform .8s cubic-bezier(.26,.86,.44,.985);transform-origin:0 0;transform:scaleX(0)}.reveal .slide-number{position:absolute;display:block;right:8px;bottom:8px;z-index:31;font-family:Helvetica,sans-serif;font-size:12px;line-height:1;color:#fff;background-color:rgba(0,0,0,.4);padding:5px}.reveal .slide-number a{color:currentColor}.reveal .slide-number-delimiter{margin:0 3px}.reveal{position:relative;width:100%;height:100%;overflow:hidden;touch-action:pinch-zoom}.reveal.embedded{touch-action:pan-y}.reveal .slides{position:absolute;width:100%;height:100%;top:0;right:0;bottom:0;left:0;margin:auto;pointer-events:none;overflow:visible;z-index:1;text-align:center;perspective:600px;perspective-origin:50% 40%}.reveal .slides>section{perspective:600px}.reveal .slides>section,.reveal .slides>section>section{display:none;position:absolute;width:100%;pointer-events:auto;z-index:10;transform-style:flat;transition:transform-origin .8s cubic-bezier(.26,.86,.44,.985),transform .8s cubic-bezier(.26,.86,.44,.985),visibility .8s cubic-bezier(.26,.86,.44,.985),opacity .8s cubic-bezier(.26,.86,.44,.985)}.reveal[data-transition-speed=fast] .slides section{transition-duration:.4s}.reveal[data-transition-speed=slow] .slides section{transition-duration:1.2s}.reveal .slides section[data-transition-speed=fast]{transition-duration:.4s}.reveal .slides section[data-transition-speed=slow]{transition-duration:1.2s}.reveal .slides>section.stack{padding-top:0;padding-bottom:0;pointer-events:none;height:100%}.reveal .slides>section.present,.reveal .slides>section>section.present{display:block;z-index:11;opacity:1}.reveal .slides>section:empty,.reveal .slides>section>section:empty,.reveal .slides>section>section[data-background-interactive],.reveal .slides>section[data-background-interactive]{pointer-events:none}.reveal.center,.reveal.center .slides,.reveal.center .slides section{min-height:0!important}.reveal .slides>section:not(.present),.reveal .slides>section>section:not(.present){pointer-events:none}.reveal.overview .slides>section,.reveal.overview .slides>section>section{pointer-events:auto}.reveal .slides>section.future,.reveal .slides>section.past,.reveal .slides>section>section.future,.reveal .slides>section>section.past{opacity:0}.reveal.slide section{-webkit-backface-visibility:hidden;backface-visibility:hidden}.reveal .slides>section[data-transition=slide].past,.reveal .slides>section[data-transition~=slide-out].past,.reveal.slide .slides>section:not([data-transition]).past{transform:translate(-150%,0)}.reveal .slides>section[data-transition=slide].future,.reveal .slides>section[data-transition~=slide-in].future,.reveal.slide .slides>section:not([data-transition]).future{transform:translate(150%,0)}.reveal .slides>section>section[data-transition=slide].past,.reveal .slides>section>section[data-transition~=slide-out].past,.reveal.slide .slides>section>section:not([data-transition]).past{transform:translate(0,-150%)}.reveal .slides>section>section[data-transition=slide].future,.reveal .slides>section>section[data-transition~=slide-in].future,.reveal.slide .slides>section>section:not([data-transition]).future{transform:translate(0,150%)}.reveal.linear section{-webkit-backface-visibility:hidden;backface-visibility:hidden}.reveal .slides>section[data-transition=linear].past,.reveal .slides>section[data-transition~=linear-out].past,.reveal.linear .slides>section:not([data-transition]).past{transform:translate(-150%,0)}.reveal .slides>section[data-transition=linear].future,.reveal .slides>section[data-transition~=linear-in].future,.reveal.linear .slides>section:not([data-transition]).future{transform:translate(150%,0)}.reveal .slides>section>section[data-transition=linear].past,.reveal .slides>section>section[data-transition~=linear-out].past,.reveal.linear .slides>section>section:not([data-transition]).past{transform:translate(0,-150%)}.reveal .slides>section>section[data-transition=linear].future,.reveal .slides>section>section[data-transition~=linear-in].future,.reveal.linear .slides>section>section:not([data-transition]).future{transform:translate(0,150%)}.reveal .slides section[data-transition=default].stack,.reveal.default .slides section.stack{transform-style:preserve-3d}.reveal .slides>section[data-transition=default].past,.reveal .slides>section[data-transition~=default-out].past,.reveal.default .slides>section:not([data-transition]).past{transform:translate3d(-100%,0,0) rotateY(-90deg) translate3d(-100%,0,0)}.reveal .slides>section[data-transition=default].future,.reveal .slides>section[data-transition~=default-in].future,.reveal.default .slides>section:not([data-transition]).future{transform:translate3d(100%,0,0) rotateY(90deg) translate3d(100%,0,0)}.reveal .slides>section>section[data-transition=default].past,.reveal .slides>section>section[data-transition~=default-out].past,.reveal.default .slides>section>section:not([data-transition]).past{transform:translate3d(0,-300px,0) rotateX(70deg) translate3d(0,-300px,0)}.reveal .slides>section>section[data-transition=default].future,.reveal .slides>section>section[data-transition~=default-in].future,.reveal.default .slides>section>section:not([data-transition]).future{transform:translate3d(0,300px,0) rotateX(-70deg) translate3d(0,300px,0)}.reveal .slides section[data-transition=convex].stack,.reveal.convex .slides section.stack{transform-style:preserve-3d}.reveal .slides>section[data-transition=convex].past,.reveal .slides>section[data-transition~=convex-out].past,.reveal.convex .slides>section:not([data-transition]).past{transform:translate3d(-100%,0,0) rotateY(-90deg) translate3d(-100%,0,0)}.reveal .slides>section[data-transition=convex].future,.reveal .slides>section[data-transition~=convex-in].future,.reveal.convex .slides>section:not([data-transition]).future{transform:translate3d(100%,0,0) rotateY(90deg) translate3d(100%,0,0)}.reveal .slides>section>section[data-transition=convex].past,.reveal .slides>section>section[data-transition~=convex-out].past,.reveal.convex .slides>section>section:not([data-transition]).past{transform:translate3d(0,-300px,0) rotateX(70deg) translate3d(0,-300px,0)}.reveal .slides>section>section[data-transition=convex].future,.reveal .slides>section>section[data-transition~=convex-in].future,.reveal.convex .slides>section>section:not([data-transition]).future{transform:translate3d(0,300px,0) rotateX(-70deg) translate3d(0,300px,0)}.reveal .slides section[data-transition=concave].stack,.reveal.concave .slides section.stack{transform-style:preserve-3d}.reveal .slides>section[data-transition=concave].past,.reveal .slides>section[data-transition~=concave-out].past,.reveal.concave .slides>section:not([data-transition]).past{transform:translate3d(-100%,0,0) rotateY(90deg) translate3d(-100%,0,0)}.reveal .slides>section[data-transition=concave].future,.reveal .slides>section[data-transition~=concave-in].future,.reveal.concave .slides>section:not([data-transition]).future{transform:translate3d(100%,0,0) rotateY(-90deg) translate3d(100%,0,0)}.reveal .slides>section>section[data-transition=concave].past,.reveal .slides>section>section[data-transition~=concave-out].past,.reveal.concave .slides>section>section:not([data-transition]).past{transform:translate3d(0,-80%,0) rotateX(-70deg) translate3d(0,-80%,0)}.reveal .slides>section>section[data-transition=concave].future,.reveal .slides>section>section[data-transition~=concave-in].future,.reveal.concave .slides>section>section:not([data-transition]).future{transform:translate3d(0,80%,0) rotateX(70deg) translate3d(0,80%,0)}.reveal .slides section[data-transition=zoom],.reveal.zoom .slides section:not([data-transition]){transition-timing-function:ease}.reveal .slides>section[data-transition=zoom].past,.reveal .slides>section[data-transition~=zoom-out].past,.reveal.zoom .slides>section:not([data-transition]).past{visibility:hidden;transform:scale(16)}.reveal .slides>section[data-transition=zoom].future,.reveal .slides>section[data-transition~=zoom-in].future,.reveal.zoom .slides>section:not([data-transition]).future{visibility:hidden;transform:scale(.2)}.reveal .slides>section>section[data-transition=zoom].past,.reveal .slides>section>section[data-transition~=zoom-out].past,.reveal.zoom .slides>section>section:not([data-transition]).past{transform:scale(16)}.reveal .slides>section>section[data-transition=zoom].future,.reveal .slides>section>section[data-transition~=zoom-in].future,.reveal.zoom .slides>section>section:not([data-transition]).future{transform:scale(.2)}.reveal.cube .slides{perspective:1300px}.reveal.cube .slides section{padding:30px;min-height:700px;-webkit-backface-visibility:hidden;backface-visibility:hidden;box-sizing:border-box;transform-style:preserve-3d}.reveal.center.cube .slides section{min-height:0}.reveal.cube .slides section:not(.stack):before{content:"";position:absolute;display:block;width:100%;height:100%;left:0;top:0;background:rgba(0,0,0,.1);border-radius:4px;transform:translateZ(-20px)}.reveal.cube .slides section:not(.stack):after{content:"";position:absolute;display:block;width:90%;height:30px;left:5%;bottom:0;background:0 0;z-index:1;border-radius:4px;box-shadow:0 95px 25px rgba(0,0,0,.2);transform:translateZ(-90px) rotateX(65deg)}.reveal.cube .slides>section.stack{padding:0;background:0 0}.reveal.cube .slides>section.past{transform-origin:100% 0;transform:translate3d(-100%,0,0) rotateY(-90deg)}.reveal.cube .slides>section.future{transform-origin:0 0;transform:translate3d(100%,0,0) rotateY(90deg)}.reveal.cube .slides>section>section.past{transform-origin:0 100%;transform:translate3d(0,-100%,0) rotateX(90deg)}.reveal.cube .slides>section>section.future{transform-origin:0 0;transform:translate3d(0,100%,0) rotateX(-90deg)}.reveal.page .slides{perspective-origin:0 50%;perspective:3000px}.reveal.page .slides section{padding:30px;min-height:700px;box-sizing:border-box;transform-style:preserve-3d}.reveal.page .slides section.past{z-index:12}.reveal.page .slides section:not(.stack):before{content:"";position:absolute;display:block;width:100%;height:100%;left:0;top:0;background:rgba(0,0,0,.1);transform:translateZ(-20px)}.reveal.page .slides section:not(.stack):after{content:"";position:absolute;display:block;width:90%;height:30px;left:5%;bottom:0;background:0 0;z-index:1;border-radius:4px;box-shadow:0 95px 25px rgba(0,0,0,.2);-webkit-transform:translateZ(-90px) rotateX(65deg)}.reveal.page .slides>section.stack{padding:0;background:0 0}.reveal.page .slides>section.past{transform-origin:0 0;transform:translate3d(-40%,0,0) rotateY(-80deg)}.reveal.page .slides>section.future{transform-origin:100% 0;transform:translate3d(0,0,0)}.reveal.page .slides>section>section.past{transform-origin:0 0;transform:translate3d(0,-40%,0) rotateX(80deg)}.reveal.page .slides>section>section.future{transform-origin:0 100%;transform:translate3d(0,0,0)}.reveal .slides section[data-transition=fade],.reveal.fade .slides section:not([data-transition]),.reveal.fade .slides>section>section:not([data-transition]){transform:none;transition:opacity .5s}.reveal.fade.overview .slides section,.reveal.fade.overview .slides>section>section{transition:none}.reveal .slides section[data-transition=none],.reveal.none .slides section:not([data-transition]){transform:none;transition:none}.reveal .pause-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background:#000;visibility:hidden;opacity:0;z-index:100;transition:all 1s ease}.reveal .pause-overlay .resume-button{position:absolute;bottom:20px;right:20px;color:#ccc;border-radius:2px;padding:6px 14px;border:2px solid #ccc;font-size:16px;background:0 0;cursor:pointer}.reveal .pause-overlay .resume-button:hover{color:#fff;border-color:#fff}.reveal.paused .pause-overlay{visibility:visible;opacity:1}.reveal .no-transition,.reveal .no-transition *,.reveal .slides.disable-slide-transitions section{transition:none!important}.reveal .slides.disable-slide-transitions section{transform:none!important}.reveal .backgrounds{position:absolute;width:100%;height:100%;top:0;left:0;perspective:600px}.reveal .slide-background{display:none;position:absolute;width:100%;height:100%;opacity:0;visibility:hidden;overflow:hidden;background-color:rgba(0,0,0,0);transition:all .8s cubic-bezier(.26,.86,.44,.985)}.reveal .slide-background-content{position:absolute;width:100%;height:100%;background-position:50% 50%;background-repeat:no-repeat;background-size:cover}.reveal .slide-background.stack{display:block}.reveal .slide-background.present{opacity:1;visibility:visible;z-index:2}.print-pdf .reveal .slide-background{opacity:1!important;visibility:visible!important}.reveal .slide-background video{position:absolute;width:100%;height:100%;max-width:none;max-height:none;top:0;left:0;-o-object-fit:cover;object-fit:cover}.reveal .slide-background[data-background-size=contain] video{-o-object-fit:contain;object-fit:contain}.reveal>.backgrounds .slide-background[data-background-transition=none],.reveal[data-background-transition=none]>.backgrounds .slide-background:not([data-background-transition]){transition:none}.reveal>.backgrounds .slide-background[data-background-transition=slide],.reveal[data-background-transition=slide]>.backgrounds .slide-background:not([data-background-transition]){opacity:1;-webkit-backface-visibility:hidden;backface-visibility:hidden}.reveal>.backgrounds .slide-background.past[data-background-transition=slide],.reveal[data-background-transition=slide]>.backgrounds .slide-background.past:not([data-background-transition]){transform:translate(-100%,0)}.reveal>.backgrounds .slide-background.future[data-background-transition=slide],.reveal[data-background-transition=slide]>.backgrounds .slide-background.future:not([data-background-transition]){transform:translate(100%,0)}.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=slide],.reveal[data-background-transition=slide]>.backgrounds .slide-background>.slide-background.past:not([data-background-transition]){transform:translate(0,-100%)}.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=slide],.reveal[data-background-transition=slide]>.backgrounds .slide-background>.slide-background.future:not([data-background-transition]){transform:translate(0,100%)}.reveal>.backgrounds .slide-background.past[data-background-transition=convex],.reveal[data-background-transition=convex]>.backgrounds .slide-background.past:not([data-background-transition]){opacity:0;transform:translate3d(-100%,0,0) rotateY(-90deg) translate3d(-100%,0,0)}.reveal>.backgrounds .slide-background.future[data-background-transition=convex],.reveal[data-background-transition=convex]>.backgrounds .slide-background.future:not([data-background-transition]){opacity:0;transform:translate3d(100%,0,0) rotateY(90deg) translate3d(100%,0,0)}.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=convex],.reveal[data-background-transition=convex]>.backgrounds .slide-background>.slide-background.past:not([data-background-transition]){opacity:0;transform:translate3d(0,-100%,0) rotateX(90deg) translate3d(0,-100%,0)}.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=convex],.reveal[data-background-transition=convex]>.backgrounds .slide-background>.slide-background.future:not([data-background-transition]){opacity:0;transform:translate3d(0,100%,0) rotateX(-90deg) translate3d(0,100%,0)}.reveal>.backgrounds .slide-background.past[data-background-transition=concave],.reveal[data-background-transition=concave]>.backgrounds .slide-background.past:not([data-background-transition]){opacity:0;transform:translate3d(-100%,0,0) rotateY(90deg) translate3d(-100%,0,0)}.reveal>.backgrounds .slide-background.future[data-background-transition=concave],.reveal[data-background-transition=concave]>.backgrounds .slide-background.future:not([data-background-transition]){opacity:0;transform:translate3d(100%,0,0) rotateY(-90deg) translate3d(100%,0,0)}.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=concave],.reveal[data-background-transition=concave]>.backgrounds .slide-background>.slide-background.past:not([data-background-transition]){opacity:0;transform:translate3d(0,-100%,0) rotateX(-90deg) translate3d(0,-100%,0)}.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=concave],.reveal[data-background-transition=concave]>.backgrounds .slide-background>.slide-background.future:not([data-background-transition]){opacity:0;transform:translate3d(0,100%,0) rotateX(90deg) translate3d(0,100%,0)}.reveal>.backgrounds .slide-background[data-background-transition=zoom],.reveal[data-background-transition=zoom]>.backgrounds .slide-background:not([data-background-transition]){transition-timing-function:ease}.reveal>.backgrounds .slide-background.past[data-background-transition=zoom],.reveal[data-background-transition=zoom]>.backgrounds .slide-background.past:not([data-background-transition]){opacity:0;visibility:hidden;transform:scale(16)}.reveal>.backgrounds .slide-background.future[data-background-transition=zoom],.reveal[data-background-transition=zoom]>.backgrounds .slide-background.future:not([data-background-transition]){opacity:0;visibility:hidden;transform:scale(.2)}.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=zoom],.reveal[data-background-transition=zoom]>.backgrounds .slide-background>.slide-background.past:not([data-background-transition]){opacity:0;visibility:hidden;transform:scale(16)}.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=zoom],.reveal[data-background-transition=zoom]>.backgrounds .slide-background>.slide-background.future:not([data-background-transition]){opacity:0;visibility:hidden;transform:scale(.2)}.reveal[data-transition-speed=fast]>.backgrounds .slide-background{transition-duration:.4s}.reveal[data-transition-speed=slow]>.backgrounds .slide-background{transition-duration:1.2s}.reveal [data-auto-animate-target^=unmatched]{will-change:opacity}.reveal section[data-auto-animate]:not(.stack):not([data-auto-animate=running]) [data-auto-animate-target^=unmatched]{opacity:0}.reveal.overview{perspective-origin:50% 50%;perspective:700px}.reveal.overview .slides{-moz-transform-style:preserve-3d}.reveal.overview .slides section{height:100%;top:0!important;opacity:1!important;overflow:hidden;visibility:visible!important;cursor:pointer;box-sizing:border-box}.reveal.overview .slides section.present,.reveal.overview .slides section:hover{outline:10px solid rgba(150,150,150,.4);outline-offset:10px}.reveal.overview .slides section .fragment{opacity:1;transition:none}.reveal.overview .slides section:after,.reveal.overview .slides section:before{display:none!important}.reveal.overview .slides>section.stack{padding:0;top:0!important;background:0 0;outline:0;overflow:visible}.reveal.overview .backgrounds{perspective:inherit;-moz-transform-style:preserve-3d}.reveal.overview .backgrounds .slide-background{opacity:1;visibility:visible;outline:10px solid rgba(150,150,150,.1);outline-offset:10px}.reveal.overview .backgrounds .slide-background.stack{overflow:visible}.reveal.overview .slides section,.reveal.overview-deactivating .slides section{transition:none}.reveal.overview .backgrounds .slide-background,.reveal.overview-deactivating .backgrounds .slide-background{transition:none}.reveal.rtl .slides,.reveal.rtl .slides h1,.reveal.rtl .slides h2,.reveal.rtl .slides h3,.reveal.rtl .slides h4,.reveal.rtl .slides h5,.reveal.rtl .slides h6{direction:rtl;font-family:sans-serif}.reveal.rtl code,.reveal.rtl pre{direction:ltr}.reveal.rtl ol,.reveal.rtl ul{text-align:right}.reveal.rtl .progress span{transform-origin:100% 0}.reveal.has-parallax-background .backgrounds{transition:all .8s ease}.reveal.has-parallax-background[data-transition-speed=fast] .backgrounds{transition-duration:.4s}.reveal.has-parallax-background[data-transition-speed=slow] .backgrounds{transition-duration:1.2s}.reveal>.overlay{position:absolute;top:0;left:0;width:100%;height:100%;z-index:1000;background:rgba(0,0,0,.9);transition:all .3s ease}.reveal>.overlay .spinner{position:absolute;display:block;top:50%;left:50%;width:32px;height:32px;margin:-16px 0 0 -16px;z-index:10;background-image:url(data:image/gif;base64,R0lGODlhIAAgAPMAAJmZmf%2F%2F%2F6%2Bvr8nJybW1tcDAwOjo6Nvb26ioqKOjo7Ozs%2FLy8vz8%2FAAAAAAAAAAAACH%2FC05FVFNDQVBFMi4wAwEAAAAh%2FhpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh%2BQQJCgAAACwAAAAAIAAgAAAE5xDISWlhperN52JLhSSdRgwVo1ICQZRUsiwHpTJT4iowNS8vyW2icCF6k8HMMBkCEDskxTBDAZwuAkkqIfxIQyhBQBFvAQSDITM5VDW6XNE4KagNh6Bgwe60smQUB3d4Rz1ZBApnFASDd0hihh12BkE9kjAJVlycXIg7CQIFA6SlnJ87paqbSKiKoqusnbMdmDC2tXQlkUhziYtyWTxIfy6BE8WJt5YJvpJivxNaGmLHT0VnOgSYf0dZXS7APdpB309RnHOG5gDqXGLDaC457D1zZ%2FV%2FnmOM82XiHRLYKhKP1oZmADdEAAAh%2BQQJCgAAACwAAAAAIAAgAAAE6hDISWlZpOrNp1lGNRSdRpDUolIGw5RUYhhHukqFu8DsrEyqnWThGvAmhVlteBvojpTDDBUEIFwMFBRAmBkSgOrBFZogCASwBDEY%2FCZSg7GSE0gSCjQBMVG023xWBhklAnoEdhQEfyNqMIcKjhRsjEdnezB%2BA4k8gTwJhFuiW4dokXiloUepBAp5qaKpp6%2BHo7aWW54wl7obvEe0kRuoplCGepwSx2jJvqHEmGt6whJpGpfJCHmOoNHKaHx61WiSR92E4lbFoq%2BB6QDtuetcaBPnW6%2BO7wDHpIiK9SaVK5GgV543tzjgGcghAgAh%2BQQJCgAAACwAAAAAIAAgAAAE7hDISSkxpOrN5zFHNWRdhSiVoVLHspRUMoyUakyEe8PTPCATW9A14E0UvuAKMNAZKYUZCiBMuBakSQKG8G2FzUWox2AUtAQFcBKlVQoLgQReZhQlCIJesQXI5B0CBnUMOxMCenoCfTCEWBsJColTMANldx15BGs8B5wlCZ9Po6OJkwmRpnqkqnuSrayqfKmqpLajoiW5HJq7FL1Gr2mMMcKUMIiJgIemy7xZtJsTmsM4xHiKv5KMCXqfyUCJEonXPN2rAOIAmsfB3uPoAK%2B%2BG%2Bw48edZPK%2BM6hLJpQg484enXIdQFSS1u6UhksENEQAAIfkECQoAAAAsAAAAACAAIAAABOcQyEmpGKLqzWcZRVUQnZYg1aBSh2GUVEIQ2aQOE%2BG%2BcD4ntpWkZQj1JIiZIogDFFyHI0UxQwFugMSOFIPJftfVAEoZLBbcLEFhlQiqGp1Vd140AUklUN3eCA51C1EWMzMCezCBBmkxVIVHBWd3HHl9JQOIJSdSnJ0TDKChCwUJjoWMPaGqDKannasMo6WnM562R5YluZRwur0wpgqZE7NKUm%2BFNRPIhjBJxKZteWuIBMN4zRMIVIhffcgojwCF117i4nlLnY5ztRLsnOk%2BaV%2BoJY7V7m76PdkS4trKcdg0Zc0tTcKkRAAAIfkECQoAAAAsAAAAACAAIAAABO4QyEkpKqjqzScpRaVkXZWQEximw1BSCUEIlDohrft6cpKCk5xid5MNJTaAIkekKGQkWyKHkvhKsR7ARmitkAYDYRIbUQRQjWBwJRzChi9CRlBcY1UN4g0%2FVNB0AlcvcAYHRyZPdEQFYV8ccwR5HWxEJ02YmRMLnJ1xCYp0Y5idpQuhopmmC2KgojKasUQDk5BNAwwMOh2RtRq5uQuPZKGIJQIGwAwGf6I0JXMpC8C7kXWDBINFMxS4DKMAWVWAGYsAdNqW5uaRxkSKJOZKaU3tPOBZ4DuK2LATgJhkPJMgTwKCdFjyPHEnKxFCDhEAACH5BAkKAAAALAAAAAAgACAAAATzEMhJaVKp6s2nIkolIJ2WkBShpkVRWqqQrhLSEu9MZJKK9y1ZrqYK9WiClmvoUaF8gIQSNeF1Er4MNFn4SRSDARWroAIETg1iVwuHjYB1kYc1mwruwXKC9gmsJXliGxc%2BXiUCby9ydh1sOSdMkpMTBpaXBzsfhoc5l58Gm5yToAaZhaOUqjkDgCWNHAULCwOLaTmzswadEqggQwgHuQsHIoZCHQMMQgQGubVEcxOPFAcMDAYUA85eWARmfSRQCdcMe0zeP1AAygwLlJtPNAAL19DARdPzBOWSm1brJBi45soRAWQAAkrQIykShQ9wVhHCwCQCACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiRMDjI0Fd30%2FiI2UA5GSS5UDj2l6NoqgOgN4gksEBgYFf0FDqKgHnyZ9OX8HrgYHdHpcHQULXAS2qKpENRg7eAMLC7kTBaixUYFkKAzWAAnLC7FLVxLWDBLKCwaKTULgEwbLA4hJtOkSBNqITT3xEgfLpBtzE%2FjiuL04RGEBgwWhShRgQExHBAAh%2BQQJCgAAACwAAAAAIAAgAAAE7xDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfZiCqGk5dTESJeaOAlClzsJsqwiJwiqnFrb2nS9kmIcgEsjQydLiIlHehhpejaIjzh9eomSjZR%2BipslWIRLAgMDOR2DOqKogTB9pCUJBagDBXR6XB0EBkIIsaRsGGMMAxoDBgYHTKJiUYEGDAzHC9EACcUGkIgFzgwZ0QsSBcXHiQvOwgDdEwfFs0sDzt4S6BK4xYjkDOzn0unFeBzOBijIm1Dgmg5YFQwsCMjp1oJ8LyIAACH5BAkKAAAALAAAAAAgACAAAATwEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GGl6NoiPOH16iZKNlH6KmyWFOggHhEEvAwwMA0N9GBsEC6amhnVcEwavDAazGwIDaH1ipaYLBUTCGgQDA8NdHz0FpqgTBwsLqAbWAAnIA4FWKdMLGdYGEgraigbT0OITBcg5QwPT4xLrROZL6AuQAPUS7bxLpoWidY0JtxLHKhwwMJBTHgPKdEQAACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GAULDJCRiXo1CpGXDJOUjY%2BYip9DhToJA4RBLwMLCwVDfRgbBAaqqoZ1XBMHswsHtxtFaH1iqaoGNgAIxRpbFAgfPQSqpbgGBqUD1wBXeCYp1AYZ19JJOYgH1KwA4UBvQwXUBxPqVD9L3sbp2BNk2xvvFPJd%2BMFCN6HAAIKgNggY0KtEBAAh%2BQQJCgAAACwAAAAAIAAgAAAE6BDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfYIDMaAFdTESJeaEDAIMxYFqrOUaNW4E4ObYcCXaiBVEgULe0NJaxxtYksjh2NLkZISgDgJhHthkpU4mW6blRiYmZOlh4JWkDqILwUGBnE6TYEbCgevr0N1gH4At7gHiRpFaLNrrq8HNgAJA70AWxQIH1%2BvsYMDAzZQPC9VCNkDWUhGkuE5PxJNwiUK4UfLzOlD4WvzAHaoG9nxPi5d%2BjYUqfAhhykOFwJWiAAAIfkECQoAAAAsAAAAACAAIAAABPAQyElpUqnqzaciSoVkXVUMFaFSwlpOCcMYlErAavhOMnNLNo8KsZsMZItJEIDIFSkLGQoQTNhIsFehRww2CQLKF0tYGKYSg%2BygsZIuNqJksKgbfgIGepNo2cIUB3V1B3IvNiBYNQaDSTtfhhx0CwVPI0UJe0%2Bbm4g5VgcGoqOcnjmjqDSdnhgEoamcsZuXO1aWQy8KAwOAuTYYGwi7w5h%2BKr0SJ8MFihpNbx%2B4Erq7BYBuzsdiH1jCAzoSfl0rVirNbRXlBBlLX%2BBP0XJLAPGzTkAuAOqb0WT5AH7OcdCm5B8TgRwSRKIHQtaLCwg1RAAAOwAAAAAAAAAAAA%3D%3D);visibility:visible;opacity:.6;transition:all .3s ease}.reveal>.overlay header{position:absolute;left:0;top:0;width:100%;padding:5px;z-index:2;box-sizing:border-box}.reveal>.overlay header a{display:inline-block;width:40px;height:40px;line-height:36px;padding:0 10px;float:right;opacity:.6;box-sizing:border-box}.reveal>.overlay header a:hover{opacity:1}.reveal>.overlay header a .icon{display:inline-block;width:20px;height:20px;background-position:50% 50%;background-size:100%;background-repeat:no-repeat}.reveal>.overlay header a.close .icon{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABkklEQVRYR8WX4VHDMAxG6wnoJrABZQPYBCaBTWAD2g1gE5gg6OOsXuxIlr40d81dfrSJ9V4c2VLK7spHuTJ/5wpM07QXuXc5X0opX2tEJcadjHuV80li/FgxTIEK/5QBCICBD6xEhSMGHgQPgBgLiYVAB1dpSqKDawxTohFw4JSEA3clzgIBPCURwE2JucBR7rhPJJv5OpJwDX+SfDjgx1wACQeJG1aChP9K/IMmdZ8DtESV1WyP3Bt4MwM6sj4NMxMYiqUWHQu4KYA/SYkIjOsm3BXYWMKFDwU2khjCQ4ELJUJ4SmClRArOCmSXGuKma0fYD5CbzHxFpCSGAhfAVSSUGDUk2BWZaff2g6GE15BsBQ9nwmpIGDiyHQddwNTMKkbZaf9fajXQca1EX44puJZUsnY0ObGmITE3GVLCbEhQUjGVt146j6oasWN+49Vph2w1pZ5EansNZqKBm1txbU57iRRcZ86RWMDdWtBJUHBHwoQPi1GV+JCbntmvok7iTX4/Up9mgyTc/FJYDTcndgH/AA5A/CHsyEkVAAAAAElFTkSuQmCC)}.reveal>.overlay header a.external .icon{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAcElEQVRYR+2WSQoAIQwEzf8f7XiOMkUQxUPlGkM3hVmiQfQR9GYnH1SsAQlI4DiBqkCMoNb9y2e90IAEJPAcgdznU9+engMaeJ7Azh5Y1U67gAho4DqBqmB1buAf0MB1AlVBek83ZPkmJMGc1wAR+AAqod/B97TRpQAAAABJRU5ErkJggg==)}.reveal>.overlay .viewport{position:absolute;display:flex;top:50px;right:0;bottom:0;left:0}.reveal>.overlay.overlay-preview .viewport iframe{width:100%;height:100%;max-width:100%;max-height:100%;border:0;opacity:0;visibility:hidden;transition:all .3s ease}.reveal>.overlay.overlay-preview.loaded .viewport iframe{opacity:1;visibility:visible}.reveal>.overlay.overlay-preview.loaded .viewport-inner{position:absolute;z-index:-1;left:0;top:45%;width:100%;text-align:center;letter-spacing:normal}.reveal>.overlay.overlay-preview .x-frame-error{opacity:0;transition:opacity .3s ease .3s}.reveal>.overlay.overlay-preview.loaded .x-frame-error{opacity:1}.reveal>.overlay.overlay-preview.loaded .spinner{opacity:0;visibility:hidden;transform:scale(.2)}.reveal>.overlay.overlay-help .viewport{overflow:auto;color:#fff}.reveal>.overlay.overlay-help .viewport .viewport-inner{width:600px;margin:auto;padding:20px 20px 80px 20px;text-align:center;letter-spacing:normal}.reveal>.overlay.overlay-help .viewport .viewport-inner .title{font-size:20px}.reveal>.overlay.overlay-help .viewport .viewport-inner table{border:1px solid #fff;border-collapse:collapse;font-size:16px}.reveal>.overlay.overlay-help .viewport .viewport-inner table td,.reveal>.overlay.overlay-help .viewport .viewport-inner table th{width:200px;padding:14px;border:1px solid #fff;vertical-align:middle}.reveal>.overlay.overlay-help .viewport .viewport-inner table th{padding-top:20px;padding-bottom:20px}.reveal .playback{position:absolute;left:15px;bottom:20px;z-index:30;cursor:pointer;transition:all .4s ease;-webkit-tap-highlight-color:transparent}.reveal.overview .playback{opacity:0;visibility:hidden}.reveal .hljs{min-height:100%}.reveal .hljs table{margin:initial}.reveal .hljs-ln-code,.reveal .hljs-ln-numbers{padding:0;border:0}.reveal .hljs-ln-numbers{opacity:.6;padding-right:.75em;text-align:right;vertical-align:top}.reveal .hljs.has-highlights tr:not(.highlight-line){opacity:.4}.reveal .hljs:not(:first-child).fragment{position:absolute;top:0;left:0;width:100%;box-sizing:border-box}.reveal pre[data-auto-animate-target]{overflow:hidden}.reveal pre[data-auto-animate-target] code{height:100%}.reveal .roll{display:inline-block;line-height:1.2;overflow:hidden;vertical-align:top;perspective:400px;perspective-origin:50% 50%}.reveal .roll:hover{background:0 0;text-shadow:none}.reveal .roll span{display:block;position:relative;padding:0 2px;pointer-events:none;transition:all .4s ease;transform-origin:50% 0;transform-style:preserve-3d;-webkit-backface-visibility:hidden;backface-visibility:hidden}.reveal .roll:hover span{background:rgba(0,0,0,.5);transform:translate3d(0,0,-45px) rotateX(90deg)}.reveal .roll span:after{content:attr(data-title);display:block;position:absolute;left:0;top:0;padding:0 2px;-webkit-backface-visibility:hidden;backface-visibility:hidden;transform-origin:50% 0;transform:translate3d(0,110%,0) rotateX(-90deg)}.reveal aside.notes{display:none}.reveal .speaker-notes{display:none;position:absolute;width:33.3333333333%;height:100%;top:0;left:100%;padding:14px 18px 14px 18px;z-index:1;font-size:18px;line-height:1.4;border:1px solid rgba(0,0,0,.05);color:#222;background-color:#f5f5f5;overflow:auto;box-sizing:border-box;text-align:left;font-family:Helvetica,sans-serif;-webkit-overflow-scrolling:touch}.reveal .speaker-notes .notes-placeholder{color:#ccc;font-style:italic}.reveal .speaker-notes:focus{outline:0}.reveal .speaker-notes:before{content:"Speaker notes";display:block;margin-bottom:10px;opacity:.5}.reveal.show-notes{max-width:75%;overflow:visible}.reveal.show-notes .speaker-notes{display:block}@media screen and (min-width:1600px){.reveal .speaker-notes{font-size:20px}}@media screen and (max-width:1024px){.reveal.show-notes{border-left:0;max-width:none;max-height:70%;max-height:70vh;overflow:visible}.reveal.show-notes .speaker-notes{top:100%;left:0;width:100%;height:42.8571428571%;height:30vh;border:0}}@media screen and (max-width:600px){.reveal.show-notes{max-height:60%;max-height:60vh}.reveal.show-notes .speaker-notes{top:100%;height:66.6666666667%;height:40vh}.reveal .speaker-notes{font-size:14px}}.zoomed .reveal *,.zoomed .reveal :after,.zoomed .reveal :before{-webkit-backface-visibility:visible!important;backface-visibility:visible!important}.zoomed .reveal .controls,.zoomed .reveal .progress{opacity:0}.zoomed .reveal .roll span{background:0 0}.zoomed .reveal .roll span:after{visibility:hidden}html.print-pdf *{-webkit-print-color-adjust:exact}html.print-pdf{width:100%;height:100%;overflow:visible}html.print-pdf body{margin:0 auto!important;border:0;padding:0;float:none!important;overflow:visible}html.print-pdf .nestedarrow,html.print-pdf .reveal .controls,html.print-pdf .reveal .playback,html.print-pdf .reveal .progress,html.print-pdf .reveal.overview,html.print-pdf .state-background{display:none!important}html.print-pdf .reveal pre code{overflow:hidden!important;font-family:Courier,"Courier New",monospace!important}html.print-pdf .reveal{width:auto!important;height:auto!important;overflow:hidden!important}html.print-pdf .reveal .slides{position:static;width:100%!important;height:auto!important;zoom:1!important;pointer-events:initial;left:auto;top:auto;margin:0!important;padding:0!important;overflow:visible;display:block;perspective:none;perspective-origin:50% 50%}html.print-pdf .reveal .slides .pdf-page{position:relative;overflow:hidden;z-index:1;page-break-after:always}html.print-pdf .reveal .slides section{visibility:visible!important;display:block!important;position:absolute!important;margin:0!important;padding:0!important;box-sizing:border-box!important;min-height:1px;opacity:1!important;transform-style:flat!important;transform:none!important}html.print-pdf .reveal section.stack{position:relative!important;margin:0!important;padding:0!important;page-break-after:avoid!important;height:auto!important;min-height:auto!important}html.print-pdf .reveal img{box-shadow:none}html.print-pdf .reveal .backgrounds{display:none}html.print-pdf .reveal .slide-background{display:block!important;position:absolute;top:0;left:0;width:100%;height:100%;z-index:auto!important}html.print-pdf .reveal.show-notes{max-width:none;max-height:none}html.print-pdf .reveal .speaker-notes-pdf{display:block;width:100%;height:auto;max-height:none;top:auto;right:auto;bottom:auto;left:auto;z-index:100}html.print-pdf .reveal .speaker-notes-pdf[data-layout=separate-page]{position:relative;color:inherit;background-color:transparent;padding:20px;page-break-after:always;border:0}html.print-pdf .reveal .slide-number-pdf{display:block;position:absolute;font-size:14px}html.print-pdf .aria-status{display:none}@media print{html:not(.print-pdf){background:#fff;width:auto;height:auto;overflow:visible}html:not(.print-pdf) body{background:#fff;font-size:20pt;width:auto;height:auto;border:0;margin:0 5%;padding:0;overflow:visible;float:none!important}html:not(.print-pdf) .controls,html:not(.print-pdf) .fork-reveal,html:not(.print-pdf) .nestedarrow,html:not(.print-pdf) .reveal .backgrounds,html:not(.print-pdf) .reveal .progress,html:not(.print-pdf) .reveal .slide-number,html:not(.print-pdf) .share-reveal,html:not(.print-pdf) .state-background{display:none!important}html:not(.print-pdf) body,html:not(.print-pdf) li,html:not(.print-pdf) p,html:not(.print-pdf) td{font-size:20pt!important;color:#000}html:not(.print-pdf) h1,html:not(.print-pdf) h2,html:not(.print-pdf) h3,html:not(.print-pdf) h4,html:not(.print-pdf) h5,html:not(.print-pdf) h6{color:#000!important;height:auto;line-height:normal;text-align:left;letter-spacing:normal}html:not(.print-pdf) h1{font-size:28pt!important}html:not(.print-pdf) h2{font-size:24pt!important}html:not(.print-pdf) h3{font-size:22pt!important}html:not(.print-pdf) h4{font-size:22pt!important;font-variant:small-caps}html:not(.print-pdf) h5{font-size:21pt!important}html:not(.print-pdf) h6{font-size:20pt!important;font-style:italic}html:not(.print-pdf) a:link,html:not(.print-pdf) a:visited{color:#000!important;font-weight:700;text-decoration:underline}html:not(.print-pdf) div,html:not(.print-pdf) ol,html:not(.print-pdf) p,html:not(.print-pdf) ul{visibility:visible;position:static;width:auto;height:auto;display:block;overflow:visible;margin:0;text-align:left!important}html:not(.print-pdf) .reveal pre,html:not(.print-pdf) .reveal table{margin-left:0;margin-right:0}html:not(.print-pdf) .reveal pre code{padding:20px}html:not(.print-pdf) .reveal blockquote{margin:20px 0}html:not(.print-pdf) .reveal .slides{position:static!important;width:auto!important;height:auto!important;left:0!important;top:0!important;margin-left:0!important;margin-top:0!important;padding:0!important;zoom:1!important;transform:none!important;overflow:visible!important;display:block!important;text-align:left!important;perspective:none;perspective-origin:50% 50%}html:not(.print-pdf) .reveal .slides section{visibility:visible!important;position:static!important;width:auto!important;height:auto!important;display:block!important;overflow:visible!important;left:0!important;top:0!important;margin-left:0!important;margin-top:0!important;padding:60px 20px!important;z-index:auto!important;opacity:1!important;page-break-after:always!important;transform-style:flat!important;transform:none!important;transition:none!important}html:not(.print-pdf) .reveal .slides section.stack{padding:0!important}html:not(.print-pdf) .reveal section:last-of-type{page-break-after:avoid!important}html:not(.print-pdf) .reveal section .fragment{opacity:1!important;visibility:visible!important;transform:none!important}html:not(.print-pdf) .reveal section img{display:block;margin:15px 0;background:#fff;border:1px solid #666;box-shadow:none}html:not(.print-pdf) .reveal section small{font-size:.8em}html:not(.print-pdf) .reveal .hljs{max-height:100%;white-space:pre-wrap;word-wrap:break-word;word-break:break-word;font-size:15pt}html:not(.print-pdf) .reveal .hljs .hljs-ln-numbers{white-space:nowrap}html:not(.print-pdf) .reveal .hljs td{font-size:inherit!important;color:inherit!important}} \ No newline at end of file diff --git a/static/presentations/2021-11-13/garage/dist/reveal.esm.js b/static/presentations/2021-11-13/garage/dist/reveal.esm.js new file mode 100644 index 0000000..a7bdd52 --- /dev/null +++ b/static/presentations/2021-11-13/garage/dist/reveal.esm.js @@ -0,0 +1,9 @@ +/*! +* reveal.js 4.2.0 +* https://revealjs.com +* MIT licensed +* +* Copyright (C) 2011-2021 Hakim El Hattab, https://hakim.se +*/ +const e=/registerPlugin|registerKeyboardShortcut|addKeyBinding|addEventListener/,t=/fade-(down|up|right|left|out|in-then-out|in-then-semi-out)|semi-fade-out|current-visible|shrink|grow/,i=(e,t)=>{for(let i in t)e[i]=t[i];return e},a=(e,t)=>Array.from(e.querySelectorAll(t)),n=(e,t,i)=>{i?e.classList.add(t):e.classList.remove(t)},s=e=>{if("string"==typeof e){if("null"===e)return null;if("true"===e)return!0;if("false"===e)return!1;if(e.match(/^-?[\d\.]+$/))return parseFloat(e)}return e},r=(e,t)=>{e.style.transform=t},o=(e,t)=>{let i=e.matches||e.matchesSelector||e.msMatchesSelector;return!(!i||!i.call(e,t))},l=(e,t)=>{if("function"==typeof e.closest)return e.closest(t);for(;e;){if(o(e,t))return e;e=e.parentNode}return null},d=(e,t,i,a="")=>{let n=e.querySelectorAll("."+i);for(let t=0;t{let t=document.createElement("style");return t.type="text/css",e&&e.length>0&&(t.styleSheet?t.styleSheet.cssText=e:t.appendChild(document.createTextNode(e))),document.head.appendChild(t),t},h=()=>{let e={};location.search.replace(/[A-Z0-9]+?=([\w\.%-]*)/gi,(t=>{e[t.split("=").shift()]=t.split("=").pop()}));for(let t in e){let i=e[t];e[t]=s(unescape(i))}return void 0!==e.dependencies&&delete e.dependencies,e},u=(e,t=0)=>{if(e){let i,a=e.style.height;return e.style.height="0px",e.parentNode.style.height="auto",i=t-e.parentNode.offsetHeight,e.style.height=a+"px",e.parentNode.style.removeProperty("height"),i}return t},g=navigator.userAgent,v=document.createElement("div"),p=/(iphone|ipod|ipad|android)/gi.test(g)||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1,m=/chrome/i.test(g)&&!/edge/i.test(g),f=/android/gi.test(g),b="zoom"in v.style&&!p&&(m||/Version\/[\d\.]+.*Safari/.test(g));var y={};Object.defineProperty(y,"__esModule",{value:!0});var w=Object.assign||function(e){for(var t=1;t1&&void 0!==arguments[1]?arguments[1]:{};return"string"==typeof e?C(t(document.querySelectorAll(e)),i):C([e],i)[0]}}("undefined"==typeof window?null:window);class S{constructor(e){this.Reveal=e,this.startEmbeddedIframe=this.startEmbeddedIframe.bind(this)}shouldPreload(e){let t=this.Reveal.getConfig().preloadIframes;return"boolean"!=typeof t&&(t=e.hasAttribute("data-preload")),t}load(e,t={}){e.style.display=this.Reveal.getConfig().display,a(e,"img[data-src], video[data-src], audio[data-src], iframe[data-src]").forEach((e=>{("IFRAME"!==e.tagName||this.shouldPreload(e))&&(e.setAttribute("src",e.getAttribute("data-src")),e.setAttribute("data-lazy-loaded",""),e.removeAttribute("data-src"))})),a(e,"video, audio").forEach((e=>{let t=0;a(e,"source[data-src]").forEach((e=>{e.setAttribute("src",e.getAttribute("data-src")),e.removeAttribute("data-src"),e.setAttribute("data-lazy-loaded",""),t+=1})),p&&"VIDEO"===e.tagName&&e.setAttribute("playsinline",""),t>0&&e.load()}));let i=e.slideBackgroundElement;if(i){i.style.display="block";let a=e.slideBackgroundContentElement,n=e.getAttribute("data-background-iframe");if(!1===i.hasAttribute("data-loaded")){i.setAttribute("data-loaded","true");let s=e.getAttribute("data-background-image"),r=e.getAttribute("data-background-video"),o=e.hasAttribute("data-background-video-loop"),l=e.hasAttribute("data-background-video-muted");if(s)/^data:/.test(s.trim())?a.style.backgroundImage=`url(${s.trim()})`:a.style.backgroundImage=s.split(",").map((e=>`url(${encodeURI(e.trim())})`)).join(",");else if(r&&!this.Reveal.isSpeakerNotes()){let e=document.createElement("video");o&&e.setAttribute("loop",""),l&&(e.muted=!0),p&&(e.muted=!0,e.setAttribute("playsinline","")),r.split(",").forEach((t=>{e.innerHTML+=''})),a.appendChild(e)}else if(n&&!0!==t.excludeIframes){let e=document.createElement("iframe");e.setAttribute("allowfullscreen",""),e.setAttribute("mozallowfullscreen",""),e.setAttribute("webkitallowfullscreen",""),e.setAttribute("allow","autoplay"),e.setAttribute("data-src",n),e.style.width="100%",e.style.height="100%",e.style.maxHeight="100%",e.style.maxWidth="100%",a.appendChild(e)}}let s=a.querySelector("iframe[data-src]");s&&this.shouldPreload(i)&&!/autoplay=(1|true|yes)/gi.test(n)&&s.getAttribute("src")!==n&&s.setAttribute("src",n)}this.layout(e)}layout(e){Array.from(e.querySelectorAll(".r-fit-text")).forEach((e=>{R(e,{minSize:24,maxSize:.8*this.Reveal.getConfig().height,observeMutations:!1,observeWindow:!1})}))}unload(e){e.style.display="none";let t=this.Reveal.getSlideBackground(e);t&&(t.style.display="none",a(t,"iframe[src]").forEach((e=>{e.removeAttribute("src")}))),a(e,"video[data-lazy-loaded][src], audio[data-lazy-loaded][src], iframe[data-lazy-loaded][src]").forEach((e=>{e.setAttribute("data-src",e.getAttribute("src")),e.removeAttribute("src")})),a(e,"video[data-lazy-loaded] source[src], audio source[src]").forEach((e=>{e.setAttribute("data-src",e.getAttribute("src")),e.removeAttribute("src")}))}formatEmbeddedContent(){let e=(e,t,i)=>{a(this.Reveal.getSlidesElement(),"iframe["+e+'*="'+t+'"]').forEach((t=>{let a=t.getAttribute(e);a&&-1===a.indexOf(i)&&t.setAttribute(e,a+(/\?/.test(a)?"&":"?")+i)}))};e("src","youtube.com/embed/","enablejsapi=1"),e("data-src","youtube.com/embed/","enablejsapi=1"),e("src","player.vimeo.com/","api=1"),e("data-src","player.vimeo.com/","api=1")}startEmbeddedContent(e){e&&!this.Reveal.isSpeakerNotes()&&(a(e,'img[src$=".gif"]').forEach((e=>{e.setAttribute("src",e.getAttribute("src"))})),a(e,"video, audio").forEach((e=>{if(l(e,".fragment")&&!l(e,".fragment.visible"))return;let t=this.Reveal.getConfig().autoPlayMedia;if("boolean"!=typeof t&&(t=e.hasAttribute("data-autoplay")||!!l(e,".slide-background")),t&&"function"==typeof e.play)if(e.readyState>1)this.startEmbeddedMedia({target:e});else if(p){let t=e.play();t&&"function"==typeof t.catch&&!1===e.controls&&t.catch((()=>{e.controls=!0,e.addEventListener("play",(()=>{e.controls=!1}))}))}else e.removeEventListener("loadeddata",this.startEmbeddedMedia),e.addEventListener("loadeddata",this.startEmbeddedMedia)})),a(e,"iframe[src]").forEach((e=>{l(e,".fragment")&&!l(e,".fragment.visible")||this.startEmbeddedIframe({target:e})})),a(e,"iframe[data-src]").forEach((e=>{l(e,".fragment")&&!l(e,".fragment.visible")||e.getAttribute("src")!==e.getAttribute("data-src")&&(e.removeEventListener("load",this.startEmbeddedIframe),e.addEventListener("load",this.startEmbeddedIframe),e.setAttribute("src",e.getAttribute("data-src")))})))}startEmbeddedMedia(e){let t=!!l(e.target,"html"),i=!!l(e.target,".present");t&&i&&(e.target.currentTime=0,e.target.play()),e.target.removeEventListener("loadeddata",this.startEmbeddedMedia)}startEmbeddedIframe(e){let t=e.target;if(t&&t.contentWindow){let i=!!l(e.target,"html"),a=!!l(e.target,".present");if(i&&a){let e=this.Reveal.getConfig().autoPlayMedia;"boolean"!=typeof e&&(e=t.hasAttribute("data-autoplay")||!!l(t,".slide-background")),/youtube\.com\/embed\//.test(t.getAttribute("src"))&&e?t.contentWindow.postMessage('{"event":"command","func":"playVideo","args":""}',"*"):/player\.vimeo\.com\//.test(t.getAttribute("src"))&&e?t.contentWindow.postMessage('{"method":"play"}',"*"):t.contentWindow.postMessage("slide:start","*")}}}stopEmbeddedContent(e,t={}){t=i({unloadIframes:!0},t),e&&e.parentNode&&(a(e,"video, audio").forEach((e=>{e.hasAttribute("data-ignore")||"function"!=typeof e.pause||(e.setAttribute("data-paused-by-reveal",""),e.pause())})),a(e,"iframe").forEach((e=>{e.contentWindow&&e.contentWindow.postMessage("slide:stop","*"),e.removeEventListener("load",this.startEmbeddedIframe)})),a(e,'iframe[src*="youtube.com/embed/"]').forEach((e=>{!e.hasAttribute("data-ignore")&&e.contentWindow&&"function"==typeof e.contentWindow.postMessage&&e.contentWindow.postMessage('{"event":"command","func":"pauseVideo","args":""}',"*")})),a(e,'iframe[src*="player.vimeo.com/"]').forEach((e=>{!e.hasAttribute("data-ignore")&&e.contentWindow&&"function"==typeof e.contentWindow.postMessage&&e.contentWindow.postMessage('{"method":"pause"}',"*")})),!0===t.unloadIframes&&a(e,"iframe[data-src]").forEach((e=>{e.setAttribute("src","about:blank"),e.removeAttribute("src")})))}}class A{constructor(e){this.Reveal=e}render(){this.element=document.createElement("div"),this.element.className="slide-number",this.Reveal.getRevealElement().appendChild(this.element)}configure(e,t){let i="none";e.slideNumber&&!this.Reveal.isPrintingPDF()&&("all"===e.showSlideNumber||"speaker"===e.showSlideNumber&&this.Reveal.isSpeakerNotes())&&(i="block"),this.element.style.display=i}update(){this.Reveal.getConfig().slideNumber&&this.element&&(this.element.innerHTML=this.getSlideNumber())}getSlideNumber(e=this.Reveal.getCurrentSlide()){let t,i=this.Reveal.getConfig(),a="h.v";if("function"==typeof i.slideNumber)t=i.slideNumber(e);else{"string"==typeof i.slideNumber&&(a=i.slideNumber),/c/.test(a)||1!==this.Reveal.getHorizontalSlides().length||(a="c");let n=e&&"uncounted"===e.dataset.visibility?0:1;switch(t=[],a){case"c":t.push(this.Reveal.getSlidePastCount(e)+n);break;case"c/t":t.push(this.Reveal.getSlidePastCount(e)+n,"/",this.Reveal.getTotalSlides());break;default:let i=this.Reveal.getIndices(e);t.push(i.h+n);let s="h/v"===a?"/":".";this.Reveal.isVerticalSlide(e)&&t.push(s,i.v+1)}}let n="#"+this.Reveal.location.getHash(e);return this.formatNumber(t[0],t[1],t[2],n)}formatNumber(e,t,i,a="#"+this.Reveal.location.getHash()){return"number"!=typeof i||isNaN(i)?`\n\t\t\t\t\t${e}\n\t\t\t\t\t`:`\n\t\t\t\t\t${e}\n\t\t\t\t\t${t}\n\t\t\t\t\t${i}\n\t\t\t\t\t`}}const E=e=>{let t=e.match(/^#([0-9a-f]{3})$/i);if(t&&t[1])return t=t[1],{r:17*parseInt(t.charAt(0),16),g:17*parseInt(t.charAt(1),16),b:17*parseInt(t.charAt(2),16)};let i=e.match(/^#([0-9a-f]{6})$/i);if(i&&i[1])return i=i[1],{r:parseInt(i.substr(0,2),16),g:parseInt(i.substr(2,2),16),b:parseInt(i.substr(4,2),16)};let a=e.match(/^rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/i);if(a)return{r:parseInt(a[1],10),g:parseInt(a[2],10),b:parseInt(a[3],10)};let n=e.match(/^rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\,\s*([\d]+|[\d]*.[\d]+)\s*\)$/i);return n?{r:parseInt(n[1],10),g:parseInt(n[2],10),b:parseInt(n[3],10),a:parseFloat(n[4])}:null};class k{constructor(e){this.Reveal=e}render(){this.element=document.createElement("div"),this.element.className="backgrounds",this.Reveal.getRevealElement().appendChild(this.element)}create(){this.element.innerHTML="",this.element.classList.add("no-transition"),this.Reveal.getHorizontalSlides().forEach((e=>{let t=this.createBackground(e,this.element);a(e,"section").forEach((e=>{this.createBackground(e,t),t.classList.add("stack")}))})),this.Reveal.getConfig().parallaxBackgroundImage?(this.element.style.backgroundImage='url("'+this.Reveal.getConfig().parallaxBackgroundImage+'")',this.element.style.backgroundSize=this.Reveal.getConfig().parallaxBackgroundSize,this.element.style.backgroundRepeat=this.Reveal.getConfig().parallaxBackgroundRepeat,this.element.style.backgroundPosition=this.Reveal.getConfig().parallaxBackgroundPosition,setTimeout((()=>{this.Reveal.getRevealElement().classList.add("has-parallax-background")}),1)):(this.element.style.backgroundImage="",this.Reveal.getRevealElement().classList.remove("has-parallax-background"))}createBackground(e,t){let i=document.createElement("div");i.className="slide-background "+e.className.replace(/present|past|future/,"");let a=document.createElement("div");return a.className="slide-background-content",i.appendChild(a),t.appendChild(i),e.slideBackgroundElement=i,e.slideBackgroundContentElement=a,this.sync(e),i}sync(e){const t=e.slideBackgroundElement,i=e.slideBackgroundContentElement,a={background:e.getAttribute("data-background"),backgroundSize:e.getAttribute("data-background-size"),backgroundImage:e.getAttribute("data-background-image"),backgroundVideo:e.getAttribute("data-background-video"),backgroundIframe:e.getAttribute("data-background-iframe"),backgroundColor:e.getAttribute("data-background-color"),backgroundRepeat:e.getAttribute("data-background-repeat"),backgroundPosition:e.getAttribute("data-background-position"),backgroundTransition:e.getAttribute("data-background-transition"),backgroundOpacity:e.getAttribute("data-background-opacity")},n=e.hasAttribute("data-preload");e.classList.remove("has-dark-background"),e.classList.remove("has-light-background"),t.removeAttribute("data-loaded"),t.removeAttribute("data-background-hash"),t.removeAttribute("data-background-size"),t.removeAttribute("data-background-transition"),t.style.backgroundColor="",i.style.backgroundSize="",i.style.backgroundRepeat="",i.style.backgroundPosition="",i.style.backgroundImage="",i.style.opacity="",i.innerHTML="",a.background&&(/^(http|file|\/\/)/gi.test(a.background)||/\.(svg|png|jpg|jpeg|gif|bmp)([?#\s]|$)/gi.test(a.background)?e.setAttribute("data-background-image",a.background):t.style.background=a.background),(a.background||a.backgroundColor||a.backgroundImage||a.backgroundVideo||a.backgroundIframe)&&t.setAttribute("data-background-hash",a.background+a.backgroundSize+a.backgroundImage+a.backgroundVideo+a.backgroundIframe+a.backgroundColor+a.backgroundRepeat+a.backgroundPosition+a.backgroundTransition+a.backgroundOpacity),a.backgroundSize&&t.setAttribute("data-background-size",a.backgroundSize),a.backgroundColor&&(t.style.backgroundColor=a.backgroundColor),a.backgroundTransition&&t.setAttribute("data-background-transition",a.backgroundTransition),n&&t.setAttribute("data-preload",""),a.backgroundSize&&(i.style.backgroundSize=a.backgroundSize),a.backgroundRepeat&&(i.style.backgroundRepeat=a.backgroundRepeat),a.backgroundPosition&&(i.style.backgroundPosition=a.backgroundPosition),a.backgroundOpacity&&(i.style.opacity=a.backgroundOpacity);let s=a.backgroundColor;if(!s||!E(s)){let e=window.getComputedStyle(t);e&&e.backgroundColor&&(s=e.backgroundColor)}if(s){const t=E(s);t&&0!==t.a&&("string"==typeof(r=s)&&(r=E(r)),(r?(299*r.r+587*r.g+114*r.b)/1e3:null)<128?e.classList.add("has-dark-background"):e.classList.add("has-light-background"))}var r}update(e=!1){let t=this.Reveal.getCurrentSlide(),i=this.Reveal.getIndices(),n=null,s=this.Reveal.getConfig().rtl?"future":"past",r=this.Reveal.getConfig().rtl?"past":"future";if(Array.from(this.element.childNodes).forEach(((t,o)=>{t.classList.remove("past","present","future"),oi.h?t.classList.add(r):(t.classList.add("present"),n=t),(e||o===i.h)&&a(t,".slide-background").forEach(((e,t)=>{e.classList.remove("past","present","future"),ti.v?e.classList.add("future"):(e.classList.add("present"),o===i.h&&(n=e))}))})),this.previousBackground&&this.Reveal.slideContent.stopEmbeddedContent(this.previousBackground,{unloadIframes:!this.Reveal.slideContent.shouldPreload(this.previousBackground)}),n){this.Reveal.slideContent.startEmbeddedContent(n);let e=n.querySelector(".slide-background-content");if(e){let t=e.style.backgroundImage||"";/\.gif/i.test(t)&&(e.style.backgroundImage="",window.getComputedStyle(e).opacity,e.style.backgroundImage=t)}let t=this.previousBackground?this.previousBackground.getAttribute("data-background-hash"):null,i=n.getAttribute("data-background-hash");i&&i===t&&n!==this.previousBackground&&this.element.classList.add("no-transition"),this.previousBackground=n}t&&["has-light-background","has-dark-background"].forEach((e=>{t.classList.contains(e)?this.Reveal.getRevealElement().classList.add(e):this.Reveal.getRevealElement().classList.remove(e)}),this),setTimeout((()=>{this.element.classList.remove("no-transition")}),1)}updateParallax(){let e=this.Reveal.getIndices();if(this.Reveal.getConfig().parallaxBackgroundImage){let t,i,a=this.Reveal.getHorizontalSlides(),n=this.Reveal.getVerticalSlides(),s=this.element.style.backgroundSize.split(" ");1===s.length?t=i=parseInt(s[0],10):(t=parseInt(s[0],10),i=parseInt(s[1],10));let r,o,l=this.element.offsetWidth,d=a.length;r="number"==typeof this.Reveal.getConfig().parallaxBackgroundHorizontal?this.Reveal.getConfig().parallaxBackgroundHorizontal:d>1?(t-l)/(d-1):0,o=r*e.h*-1;let c,h,u=this.element.offsetHeight,g=n.length;c="number"==typeof this.Reveal.getConfig().parallaxBackgroundVertical?this.Reveal.getConfig().parallaxBackgroundVertical:(i-u)/(g-1),h=g>0?c*e.v:0,this.element.style.backgroundPosition=o+"px "+-h+"px"}}}let L=0;class x{constructor(e){this.Reveal=e}run(e,t){this.reset();let i=this.Reveal.getSlides(),a=i.indexOf(t),n=i.indexOf(e);if(e.hasAttribute("data-auto-animate")&&t.hasAttribute("data-auto-animate")&&e.getAttribute("data-auto-animate-id")===t.getAttribute("data-auto-animate-id")&&!(a>n?t:e).hasAttribute("data-auto-animate-restart")){this.autoAnimateStyleSheet=this.autoAnimateStyleSheet||c();let i=this.getAutoAnimateOptions(t);e.dataset.autoAnimate="pending",t.dataset.autoAnimate="pending",i.slideDirection=a>n?"forward":"backward";let s=this.getAutoAnimatableElements(e,t).map((e=>this.autoAnimateElements(e.from,e.to,e.options||{},i,L++)));if("false"!==t.dataset.autoAnimateUnmatched&&!0===this.Reveal.getConfig().autoAnimateUnmatched){let e=.8*i.duration,a=.2*i.duration;this.getUnmatchedAutoAnimateElements(t).forEach((e=>{let t=this.getAutoAnimateOptions(e,i),a="unmatched";t.duration===i.duration&&t.delay===i.delay||(a="unmatched-"+L++,s.push(`[data-auto-animate="running"] [data-auto-animate-target="${a}"] { transition: opacity ${t.duration}s ease ${t.delay}s; }`)),e.dataset.autoAnimateTarget=a}),this),s.push(`[data-auto-animate="running"] [data-auto-animate-target="unmatched"] { transition: opacity ${e}s ease ${a}s; }`)}this.autoAnimateStyleSheet.innerHTML=s.join(""),requestAnimationFrame((()=>{this.autoAnimateStyleSheet&&(getComputedStyle(this.autoAnimateStyleSheet).fontWeight,t.dataset.autoAnimate="running")})),this.Reveal.dispatchEvent({type:"autoanimate",data:{fromSlide:e,toSlide:t,sheet:this.autoAnimateStyleSheet}})}}reset(){a(this.Reveal.getRevealElement(),'[data-auto-animate]:not([data-auto-animate=""])').forEach((e=>{e.dataset.autoAnimate=""})),a(this.Reveal.getRevealElement(),"[data-auto-animate-target]").forEach((e=>{delete e.dataset.autoAnimateTarget})),this.autoAnimateStyleSheet&&this.autoAnimateStyleSheet.parentNode&&(this.autoAnimateStyleSheet.parentNode.removeChild(this.autoAnimateStyleSheet),this.autoAnimateStyleSheet=null)}autoAnimateElements(e,i,a,n,s){e.dataset.autoAnimateTarget="",i.dataset.autoAnimateTarget=s;let r=this.getAutoAnimateOptions(i,n);void 0!==a.delay&&(r.delay=a.delay),void 0!==a.duration&&(r.duration=a.duration),void 0!==a.easing&&(r.easing=a.easing);let o=this.getAutoAnimatableProperties("from",e,a),l=this.getAutoAnimatableProperties("to",i,a);if(i.classList.contains("fragment")&&(delete l.styles.opacity,e.classList.contains("fragment"))){(e.className.match(t)||[""])[0]===(i.className.match(t)||[""])[0]&&"forward"===n.slideDirection&&i.classList.add("visible","disabled")}if(!1!==a.translate||!1!==a.scale){let e=this.Reveal.getScale(),t={x:(o.x-l.x)/e,y:(o.y-l.y)/e,scaleX:o.width/l.width,scaleY:o.height/l.height};t.x=Math.round(1e3*t.x)/1e3,t.y=Math.round(1e3*t.y)/1e3,t.scaleX=Math.round(1e3*t.scaleX)/1e3,t.scaleX=Math.round(1e3*t.scaleX)/1e3;let i=!1!==a.translate&&(0!==t.x||0!==t.y),n=!1!==a.scale&&(0!==t.scaleX||0!==t.scaleY);if(i||n){let e=[];i&&e.push(`translate(${t.x}px, ${t.y}px)`),n&&e.push(`scale(${t.scaleX}, ${t.scaleY})`),o.styles.transform=e.join(" "),o.styles["transform-origin"]="top left",l.styles.transform="none"}}for(let e in l.styles){const t=l.styles[e],i=o.styles[e];t===i?delete l.styles[e]:(!0===t.explicitValue&&(l.styles[e]=t.value),!0===i.explicitValue&&(o.styles[e]=i.value))}let d="",c=Object.keys(l.styles);if(c.length>0){o.styles.transition="none",l.styles.transition=`all ${r.duration}s ${r.easing} ${r.delay}s`,l.styles["transition-property"]=c.join(", "),l.styles["will-change"]=c.join(", "),d='[data-auto-animate-target="'+s+'"] {'+Object.keys(o.styles).map((e=>e+": "+o.styles[e]+" !important;")).join("")+'}[data-auto-animate="running"] [data-auto-animate-target="'+s+'"] {'+Object.keys(l.styles).map((e=>e+": "+l.styles[e]+" !important;")).join("")+"}"}return d}getAutoAnimateOptions(e,t){let a={easing:this.Reveal.getConfig().autoAnimateEasing,duration:this.Reveal.getConfig().autoAnimateDuration,delay:0};if(a=i(a,t),e.parentNode){let t=l(e.parentNode,"[data-auto-animate-target]");t&&(a=this.getAutoAnimateOptions(t,a))}return e.dataset.autoAnimateEasing&&(a.easing=e.dataset.autoAnimateEasing),e.dataset.autoAnimateDuration&&(a.duration=parseFloat(e.dataset.autoAnimateDuration)),e.dataset.autoAnimateDelay&&(a.delay=parseFloat(e.dataset.autoAnimateDelay)),a}getAutoAnimatableProperties(e,t,i){let a=this.Reveal.getConfig(),n={styles:[]};if(!1!==i.translate||!1!==i.scale){let e;if("function"==typeof i.measure)e=i.measure(t);else if(a.center)e=t.getBoundingClientRect();else{let i=this.Reveal.getScale();e={x:t.offsetLeft*i,y:t.offsetTop*i,width:t.offsetWidth*i,height:t.offsetHeight*i}}n.x=e.x,n.y=e.y,n.width=e.width,n.height=e.height}const s=getComputedStyle(t);return(i.styles||a.autoAnimateStyles).forEach((t=>{let i;"string"==typeof t&&(t={property:t}),i=void 0!==t.from&&"from"===e?{value:t.from,explicitValue:!0}:void 0!==t.to&&"to"===e?{value:t.to,explicitValue:!0}:s[t.property],""!==i&&(n.styles[t.property]=i)})),n}getAutoAnimatableElements(e,t){let i=("function"==typeof this.Reveal.getConfig().autoAnimateMatcher?this.Reveal.getConfig().autoAnimateMatcher:this.getAutoAnimatePairs).call(this,e,t),a=[];return i.filter(((e,t)=>{if(-1===a.indexOf(e.to))return a.push(e.to),!0}))}getAutoAnimatePairs(e,t){let i=[];const a="h1, h2, h3, h4, h5, h6, p, li";return this.findAutoAnimateMatches(i,e,t,"[data-id]",(e=>e.nodeName+":::"+e.getAttribute("data-id"))),this.findAutoAnimateMatches(i,e,t,a,(e=>e.nodeName+":::"+e.innerText)),this.findAutoAnimateMatches(i,e,t,"img, video, iframe",(e=>e.nodeName+":::"+(e.getAttribute("src")||e.getAttribute("data-src")))),this.findAutoAnimateMatches(i,e,t,"pre",(e=>e.nodeName+":::"+e.innerText)),i.forEach((e=>{o(e.from,a)?e.options={scale:!1}:o(e.from,"pre")&&(e.options={scale:!1,styles:["width","height"]},this.findAutoAnimateMatches(i,e.from,e.to,".hljs .hljs-ln-code",(e=>e.textContent),{scale:!1,styles:[],measure:this.getLocalBoundingBox.bind(this)}),this.findAutoAnimateMatches(i,e.from,e.to,".hljs .hljs-ln-line[data-line-number]",(e=>e.getAttribute("data-line-number")),{scale:!1,styles:["width"],measure:this.getLocalBoundingBox.bind(this)}))}),this),i}getLocalBoundingBox(e){const t=this.Reveal.getScale();return{x:Math.round(e.offsetLeft*t*100)/100,y:Math.round(e.offsetTop*t*100)/100,width:Math.round(e.offsetWidth*t*100)/100,height:Math.round(e.offsetHeight*t*100)/100}}findAutoAnimateMatches(e,t,i,a,n,s){let r={},o={};[].slice.call(t.querySelectorAll(a)).forEach(((e,t)=>{const i=n(e);"string"==typeof i&&i.length&&(r[i]=r[i]||[],r[i].push(e))})),[].slice.call(i.querySelectorAll(a)).forEach(((t,i)=>{const a=n(t);let l;if(o[a]=o[a]||[],o[a].push(t),r[a]){const e=o[a].length-1,t=r[a].length-1;r[a][e]?(l=r[a][e],r[a][e]=null):r[a][t]&&(l=r[a][t],r[a][t]=null)}l&&e.push({from:l,to:t,options:s})}))}getUnmatchedAutoAnimateElements(e){return[].slice.call(e.children).reduce(((e,t)=>{const i=t.querySelector("[data-auto-animate-target]");return t.hasAttribute("data-auto-animate-target")||i||e.push(t),t.querySelector("[data-auto-animate-target]")&&(e=e.concat(this.getUnmatchedAutoAnimateElements(t))),e}),[])}}class C{constructor(e){this.Reveal=e}configure(e,t){!1===e.fragments?this.disable():!1===t.fragments&&this.enable()}disable(){a(this.Reveal.getSlidesElement(),".fragment").forEach((e=>{e.classList.add("visible"),e.classList.remove("current-fragment")}))}enable(){a(this.Reveal.getSlidesElement(),".fragment").forEach((e=>{e.classList.remove("visible"),e.classList.remove("current-fragment")}))}availableRoutes(){let e=this.Reveal.getCurrentSlide();if(e&&this.Reveal.getConfig().fragments){let t=e.querySelectorAll(".fragment:not(.disabled)"),i=e.querySelectorAll(".fragment:not(.disabled):not(.visible)");return{prev:t.length-i.length>0,next:!!i.length}}return{prev:!1,next:!1}}sort(e,t=!1){e=Array.from(e);let i=[],a=[],n=[];e.forEach((e=>{if(e.hasAttribute("data-fragment-index")){let t=parseInt(e.getAttribute("data-fragment-index"),10);i[t]||(i[t]=[]),i[t].push(e)}else a.push([e])})),i=i.concat(a);let s=0;return i.forEach((e=>{e.forEach((e=>{n.push(e),e.setAttribute("data-fragment-index",s)})),s++})),!0===t?i:n}sortAll(){this.Reveal.getHorizontalSlides().forEach((e=>{let t=a(e,"section");t.forEach(((e,t)=>{this.sort(e.querySelectorAll(".fragment"))}),this),0===t.length&&this.sort(e.querySelectorAll(".fragment"))}))}update(e,t){let i={shown:[],hidden:[]},a=this.Reveal.getCurrentSlide();if(a&&this.Reveal.getConfig().fragments&&(t=t||this.sort(a.querySelectorAll(".fragment"))).length){let n=0;if("number"!=typeof e){let t=this.sort(a.querySelectorAll(".fragment.visible")).pop();t&&(e=parseInt(t.getAttribute("data-fragment-index")||0,10))}Array.from(t).forEach(((t,a)=>{if(t.hasAttribute("data-fragment-index")&&(a=parseInt(t.getAttribute("data-fragment-index"),10)),n=Math.max(n,a),a<=e){let n=t.classList.contains("visible");t.classList.add("visible"),t.classList.remove("current-fragment"),a===e&&(this.Reveal.announceStatus(this.Reveal.getStatusText(t)),t.classList.add("current-fragment"),this.Reveal.slideContent.startEmbeddedContent(t)),n||(i.shown.push(t),this.Reveal.dispatchEvent({target:t,type:"visible",bubbles:!1}))}else{let e=t.classList.contains("visible");t.classList.remove("visible"),t.classList.remove("current-fragment"),e&&(this.Reveal.slideContent.stopEmbeddedContent(t),i.hidden.push(t),this.Reveal.dispatchEvent({target:t,type:"hidden",bubbles:!1}))}})),e="number"==typeof e?e:-1,e=Math.max(Math.min(e,n),-1),a.setAttribute("data-fragment",e)}return i}sync(e=this.Reveal.getCurrentSlide()){return this.sort(e.querySelectorAll(".fragment"))}goto(e,t=0){let i=this.Reveal.getCurrentSlide();if(i&&this.Reveal.getConfig().fragments){let a=this.sort(i.querySelectorAll(".fragment:not(.disabled)"));if(a.length){if("number"!=typeof e){let t=this.sort(i.querySelectorAll(".fragment:not(.disabled).visible")).pop();e=t?parseInt(t.getAttribute("data-fragment-index")||0,10):-1}e+=t;let n=this.update(e,a);return n.hidden.length&&this.Reveal.dispatchEvent({type:"fragmenthidden",data:{fragment:n.hidden[0],fragments:n.hidden}}),n.shown.length&&this.Reveal.dispatchEvent({type:"fragmentshown",data:{fragment:n.shown[0],fragments:n.shown}}),this.Reveal.controls.update(),this.Reveal.progress.update(),this.Reveal.getConfig().fragmentInURL&&this.Reveal.location.writeURL(),!(!n.shown.length&&!n.hidden.length)}}return!1}next(){return this.goto(null,1)}prev(){return this.goto(null,-1)}}class P{constructor(e){this.Reveal=e,this.active=!1,this.onSlideClicked=this.onSlideClicked.bind(this)}activate(){if(this.Reveal.getConfig().overview&&!this.isActive()){this.active=!0,this.Reveal.getRevealElement().classList.add("overview"),this.Reveal.cancelAutoSlide(),this.Reveal.getSlidesElement().appendChild(this.Reveal.getBackgroundsElement()),a(this.Reveal.getRevealElement(),".slides section").forEach((e=>{e.classList.contains("stack")||e.addEventListener("click",this.onSlideClicked,!0)}));const e=70,t=this.Reveal.getComputedSlideSize();this.overviewSlideWidth=t.width+e,this.overviewSlideHeight=t.height+e,this.Reveal.getConfig().rtl&&(this.overviewSlideWidth=-this.overviewSlideWidth),this.Reveal.updateSlidesVisibility(),this.layout(),this.update(),this.Reveal.layout();const i=this.Reveal.getIndices();this.Reveal.dispatchEvent({type:"overviewshown",data:{indexh:i.h,indexv:i.v,currentSlide:this.Reveal.getCurrentSlide()}})}}layout(){this.Reveal.getHorizontalSlides().forEach(((e,t)=>{e.setAttribute("data-index-h",t),r(e,"translate3d("+t*this.overviewSlideWidth+"px, 0, 0)"),e.classList.contains("stack")&&a(e,"section").forEach(((e,i)=>{e.setAttribute("data-index-h",t),e.setAttribute("data-index-v",i),r(e,"translate3d(0, "+i*this.overviewSlideHeight+"px, 0)")}))})),Array.from(this.Reveal.getBackgroundsElement().childNodes).forEach(((e,t)=>{r(e,"translate3d("+t*this.overviewSlideWidth+"px, 0, 0)"),a(e,".slide-background").forEach(((e,t)=>{r(e,"translate3d(0, "+t*this.overviewSlideHeight+"px, 0)")}))}))}update(){const e=Math.min(window.innerWidth,window.innerHeight),t=Math.max(e/5,150)/e,i=this.Reveal.getIndices();this.Reveal.transformSlides({overview:["scale("+t+")","translateX("+-i.h*this.overviewSlideWidth+"px)","translateY("+-i.v*this.overviewSlideHeight+"px)"].join(" ")})}deactivate(){if(this.Reveal.getConfig().overview){this.active=!1,this.Reveal.getRevealElement().classList.remove("overview"),this.Reveal.getRevealElement().classList.add("overview-deactivating"),setTimeout((()=>{this.Reveal.getRevealElement().classList.remove("overview-deactivating")}),1),this.Reveal.getRevealElement().appendChild(this.Reveal.getBackgroundsElement()),a(this.Reveal.getRevealElement(),".slides section").forEach((e=>{r(e,""),e.removeEventListener("click",this.onSlideClicked,!0)})),a(this.Reveal.getBackgroundsElement(),".slide-background").forEach((e=>{r(e,"")})),this.Reveal.transformSlides({overview:""});const e=this.Reveal.getIndices();this.Reveal.slide(e.h,e.v),this.Reveal.layout(),this.Reveal.cueAutoSlide(),this.Reveal.dispatchEvent({type:"overviewhidden",data:{indexh:e.h,indexv:e.v,currentSlide:this.Reveal.getCurrentSlide()}})}}toggle(e){"boolean"==typeof e?e?this.activate():this.deactivate():this.isActive()?this.deactivate():this.activate()}isActive(){return this.active}onSlideClicked(e){if(this.isActive()){e.preventDefault();let t=e.target;for(;t&&!t.nodeName.match(/section/gi);)t=t.parentNode;if(t&&!t.classList.contains("disabled")&&(this.deactivate(),t.nodeName.match(/section/gi))){let e=parseInt(t.getAttribute("data-index-h"),10),i=parseInt(t.getAttribute("data-index-v"),10);this.Reveal.slide(e,i)}}}}class N{constructor(e){this.Reveal=e,this.shortcuts={},this.bindings={},this.onDocumentKeyDown=this.onDocumentKeyDown.bind(this),this.onDocumentKeyPress=this.onDocumentKeyPress.bind(this)}configure(e,t){"linear"===e.navigationMode?(this.shortcuts["→ , ↓ , SPACE , N , L , J"]="Next slide",this.shortcuts["← , ↑ , P , H , K"]="Previous slide"):(this.shortcuts["N , SPACE"]="Next slide",this.shortcuts["P , Shift SPACE"]="Previous slide",this.shortcuts["← , H"]="Navigate left",this.shortcuts["→ , L"]="Navigate right",this.shortcuts["↑ , K"]="Navigate up",this.shortcuts["↓ , J"]="Navigate down"),this.shortcuts["Alt + ←/↑/→/↓"]="Navigate without fragments",this.shortcuts["Shift + ←/↑/→/↓"]="Jump to first/last slide",this.shortcuts["B , ."]="Pause",this.shortcuts.F="Fullscreen",this.shortcuts["ESC, O"]="Slide overview"}bind(){document.addEventListener("keydown",this.onDocumentKeyDown,!1),document.addEventListener("keypress",this.onDocumentKeyPress,!1)}unbind(){document.removeEventListener("keydown",this.onDocumentKeyDown,!1),document.removeEventListener("keypress",this.onDocumentKeyPress,!1)}addKeyBinding(e,t){"object"==typeof e&&e.keyCode?this.bindings[e.keyCode]={callback:t,key:e.key,description:e.description}:this.bindings[e]={callback:t,key:null,description:null}}removeKeyBinding(e){delete this.bindings[e]}triggerKey(e){this.onDocumentKeyDown({keyCode:e})}registerKeyboardShortcut(e,t){this.shortcuts[e]=t}getShortcuts(){return this.shortcuts}getBindings(){return this.bindings}onDocumentKeyPress(e){e.shiftKey&&63===e.charCode&&this.Reveal.toggleHelp()}onDocumentKeyDown(e){let t=this.Reveal.getConfig();if("function"==typeof t.keyboardCondition&&!1===t.keyboardCondition(e))return!0;if("focused"===t.keyboardCondition&&!this.Reveal.isFocused())return!0;let i=e.keyCode,a=!this.Reveal.isAutoSliding();this.Reveal.onUserInput(e);let n=document.activeElement&&!0===document.activeElement.isContentEditable,s=document.activeElement&&document.activeElement.tagName&&/input|textarea/i.test(document.activeElement.tagName),r=document.activeElement&&document.activeElement.className&&/speaker-notes/i.test(document.activeElement.className),o=!(-1!==[32,37,38,39,40,78,80].indexOf(e.keyCode)&&e.shiftKey||e.altKey)&&(e.shiftKey||e.altKey||e.ctrlKey||e.metaKey);if(n||s||r||o)return;let l,d=[66,86,190,191];if("object"==typeof t.keyboard)for(l in t.keyboard)"togglePause"===t.keyboard[l]&&d.push(parseInt(l,10));if(this.Reveal.isPaused()&&-1===d.indexOf(i))return!1;let c="linear"===t.navigationMode||!this.Reveal.hasHorizontalSlides()||!this.Reveal.hasVerticalSlides(),h=!1;if("object"==typeof t.keyboard)for(l in t.keyboard)if(parseInt(l,10)===i){let i=t.keyboard[l];"function"==typeof i?i.apply(null,[e]):"string"==typeof i&&"function"==typeof this.Reveal[i]&&this.Reveal[i].call(),h=!0}if(!1===h)for(l in this.bindings)if(parseInt(l,10)===i){let t=this.bindings[l].callback;"function"==typeof t?t.apply(null,[e]):"string"==typeof t&&"function"==typeof this.Reveal[t]&&this.Reveal[t].call(),h=!0}!1===h&&(h=!0,80===i||33===i?this.Reveal.prev({skipFragments:e.altKey}):78===i||34===i?this.Reveal.next({skipFragments:e.altKey}):72===i||37===i?e.shiftKey?this.Reveal.slide(0):!this.Reveal.overview.isActive()&&c?this.Reveal.prev({skipFragments:e.altKey}):this.Reveal.left({skipFragments:e.altKey}):76===i||39===i?e.shiftKey?this.Reveal.slide(this.Reveal.getHorizontalSlides().length-1):!this.Reveal.overview.isActive()&&c?this.Reveal.next({skipFragments:e.altKey}):this.Reveal.right({skipFragments:e.altKey}):75===i||38===i?e.shiftKey?this.Reveal.slide(void 0,0):!this.Reveal.overview.isActive()&&c?this.Reveal.prev({skipFragments:e.altKey}):this.Reveal.up({skipFragments:e.altKey}):74===i||40===i?e.shiftKey?this.Reveal.slide(void 0,Number.MAX_VALUE):!this.Reveal.overview.isActive()&&c?this.Reveal.next({skipFragments:e.altKey}):this.Reveal.down({skipFragments:e.altKey}):36===i?this.Reveal.slide(0):35===i?this.Reveal.slide(this.Reveal.getHorizontalSlides().length-1):32===i?(this.Reveal.overview.isActive()&&this.Reveal.overview.deactivate(),e.shiftKey?this.Reveal.prev({skipFragments:e.altKey}):this.Reveal.next({skipFragments:e.altKey})):58===i||59===i||66===i||86===i||190===i||191===i?this.Reveal.togglePause():70===i?(e=>{let t=(e=e||document.documentElement).requestFullscreen||e.webkitRequestFullscreen||e.webkitRequestFullScreen||e.mozRequestFullScreen||e.msRequestFullscreen;t&&t.apply(e)})(t.embedded?this.Reveal.getViewportElement():document.documentElement):65===i?t.autoSlideStoppable&&this.Reveal.toggleAutoSlide(a):h=!1),h?e.preventDefault&&e.preventDefault():27!==i&&79!==i||(!1===this.Reveal.closeOverlay()&&this.Reveal.overview.toggle(),e.preventDefault&&e.preventDefault()),this.Reveal.cueAutoSlide()}}class M{constructor(e){this.Reveal=e,this.writeURLTimeout=0,this.onWindowHashChange=this.onWindowHashChange.bind(this)}bind(){window.addEventListener("hashchange",this.onWindowHashChange,!1)}unbind(){window.removeEventListener("hashchange",this.onWindowHashChange,!1)}getIndicesFromHash(e=window.location.hash){let t=e.replace(/^#\/?/,""),i=t.split("/");if(/^[0-9]*$/.test(i[0])||!t.length){const e=this.Reveal.getConfig();let t,a=e.hashOneBasedIndex?1:0,n=parseInt(i[0],10)-a||0,s=parseInt(i[1],10)-a||0;return e.fragmentInURL&&(t=parseInt(i[2],10),isNaN(t)&&(t=void 0)),{h:n,v:s,f:t}}{let e,i;/\/[-\d]+$/g.test(t)&&(i=parseInt(t.split("/").pop(),10),i=isNaN(i)?void 0:i,t=t.split("/").shift());try{e=document.getElementById(decodeURIComponent(t))}catch(e){}if(e)return{...this.Reveal.getIndices(e),f:i}}return null}readURL(){const e=this.Reveal.getIndices(),t=this.getIndicesFromHash();!t||t.h===e.h&&t.v===e.v&&void 0===t.f?this.Reveal.slide(e.h||0,e.v||0):this.Reveal.slide(t.h,t.v,t.f)}writeURL(e){let t=this.Reveal.getConfig(),i=this.Reveal.getCurrentSlide();if(clearTimeout(this.writeURLTimeout),"number"==typeof e)this.writeURLTimeout=setTimeout(this.writeURL,e);else if(i){let e=this.getHash();t.history?window.location.hash=e:t.hash&&("/"===e?window.history.replaceState(null,null,window.location.pathname+window.location.search):window.history.replaceState(null,null,"#"+e))}}getHash(e){let t="/",i=e||this.Reveal.getCurrentSlide(),a=i?i.getAttribute("id"):null;a&&(a=encodeURIComponent(a));let n=this.Reveal.getIndices(e);if(this.Reveal.getConfig().fragmentInURL||(n.f=void 0),"string"==typeof a&&a.length)t="/"+a,n.f>=0&&(t+="/"+n.f);else{let e=this.Reveal.getConfig().hashOneBasedIndex?1:0;(n.h>0||n.v>0||n.f>=0)&&(t+=n.h+e),(n.v>0||n.f>=0)&&(t+="/"+(n.v+e)),n.f>=0&&(t+="/"+n.f)}return t}onWindowHashChange(e){this.readURL()}}class D{constructor(e){this.Reveal=e,this.onNavigateLeftClicked=this.onNavigateLeftClicked.bind(this),this.onNavigateRightClicked=this.onNavigateRightClicked.bind(this),this.onNavigateUpClicked=this.onNavigateUpClicked.bind(this),this.onNavigateDownClicked=this.onNavigateDownClicked.bind(this),this.onNavigatePrevClicked=this.onNavigatePrevClicked.bind(this),this.onNavigateNextClicked=this.onNavigateNextClicked.bind(this)}render(){const e=this.Reveal.getConfig().rtl,t=this.Reveal.getRevealElement();this.element=document.createElement("aside"),this.element.className="controls",this.element.innerHTML=`\n\t\t\t\n\t\t\t\n\t\t\t`,this.Reveal.getRevealElement().appendChild(this.element),this.controlsLeft=a(t,".navigate-left"),this.controlsRight=a(t,".navigate-right"),this.controlsUp=a(t,".navigate-up"),this.controlsDown=a(t,".navigate-down"),this.controlsPrev=a(t,".navigate-prev"),this.controlsNext=a(t,".navigate-next"),this.controlsRightArrow=this.element.querySelector(".navigate-right"),this.controlsLeftArrow=this.element.querySelector(".navigate-left"),this.controlsDownArrow=this.element.querySelector(".navigate-down")}configure(e,t){this.element.style.display=e.controls?"block":"none",this.element.setAttribute("data-controls-layout",e.controlsLayout),this.element.setAttribute("data-controls-back-arrows",e.controlsBackArrows)}bind(){let e=["touchstart","click"];f&&(e=["touchstart"]),e.forEach((e=>{this.controlsLeft.forEach((t=>t.addEventListener(e,this.onNavigateLeftClicked,!1))),this.controlsRight.forEach((t=>t.addEventListener(e,this.onNavigateRightClicked,!1))),this.controlsUp.forEach((t=>t.addEventListener(e,this.onNavigateUpClicked,!1))),this.controlsDown.forEach((t=>t.addEventListener(e,this.onNavigateDownClicked,!1))),this.controlsPrev.forEach((t=>t.addEventListener(e,this.onNavigatePrevClicked,!1))),this.controlsNext.forEach((t=>t.addEventListener(e,this.onNavigateNextClicked,!1)))}))}unbind(){["touchstart","click"].forEach((e=>{this.controlsLeft.forEach((t=>t.removeEventListener(e,this.onNavigateLeftClicked,!1))),this.controlsRight.forEach((t=>t.removeEventListener(e,this.onNavigateRightClicked,!1))),this.controlsUp.forEach((t=>t.removeEventListener(e,this.onNavigateUpClicked,!1))),this.controlsDown.forEach((t=>t.removeEventListener(e,this.onNavigateDownClicked,!1))),this.controlsPrev.forEach((t=>t.removeEventListener(e,this.onNavigatePrevClicked,!1))),this.controlsNext.forEach((t=>t.removeEventListener(e,this.onNavigateNextClicked,!1)))}))}update(){let e=this.Reveal.availableRoutes();[...this.controlsLeft,...this.controlsRight,...this.controlsUp,...this.controlsDown,...this.controlsPrev,...this.controlsNext].forEach((e=>{e.classList.remove("enabled","fragmented"),e.setAttribute("disabled","disabled")})),e.left&&this.controlsLeft.forEach((e=>{e.classList.add("enabled"),e.removeAttribute("disabled")})),e.right&&this.controlsRight.forEach((e=>{e.classList.add("enabled"),e.removeAttribute("disabled")})),e.up&&this.controlsUp.forEach((e=>{e.classList.add("enabled"),e.removeAttribute("disabled")})),e.down&&this.controlsDown.forEach((e=>{e.classList.add("enabled"),e.removeAttribute("disabled")})),(e.left||e.up)&&this.controlsPrev.forEach((e=>{e.classList.add("enabled"),e.removeAttribute("disabled")})),(e.right||e.down)&&this.controlsNext.forEach((e=>{e.classList.add("enabled"),e.removeAttribute("disabled")}));let t=this.Reveal.getCurrentSlide();if(t){let e=this.Reveal.fragments.availableRoutes();e.prev&&this.controlsPrev.forEach((e=>{e.classList.add("fragmented","enabled"),e.removeAttribute("disabled")})),e.next&&this.controlsNext.forEach((e=>{e.classList.add("fragmented","enabled"),e.removeAttribute("disabled")})),this.Reveal.isVerticalSlide(t)?(e.prev&&this.controlsUp.forEach((e=>{e.classList.add("fragmented","enabled"),e.removeAttribute("disabled")})),e.next&&this.controlsDown.forEach((e=>{e.classList.add("fragmented","enabled"),e.removeAttribute("disabled")}))):(e.prev&&this.controlsLeft.forEach((e=>{e.classList.add("fragmented","enabled"),e.removeAttribute("disabled")})),e.next&&this.controlsRight.forEach((e=>{e.classList.add("fragmented","enabled"),e.removeAttribute("disabled")})))}if(this.Reveal.getConfig().controlsTutorial){let t=this.Reveal.getIndices();!this.Reveal.hasNavigatedVertically()&&e.down?this.controlsDownArrow.classList.add("highlight"):(this.controlsDownArrow.classList.remove("highlight"),this.Reveal.getConfig().rtl?!this.Reveal.hasNavigatedHorizontally()&&e.left&&0===t.v?this.controlsLeftArrow.classList.add("highlight"):this.controlsLeftArrow.classList.remove("highlight"):!this.Reveal.hasNavigatedHorizontally()&&e.right&&0===t.v?this.controlsRightArrow.classList.add("highlight"):this.controlsRightArrow.classList.remove("highlight"))}}onNavigateLeftClicked(e){e.preventDefault(),this.Reveal.onUserInput(),"linear"===this.Reveal.getConfig().navigationMode?this.Reveal.prev():this.Reveal.left()}onNavigateRightClicked(e){e.preventDefault(),this.Reveal.onUserInput(),"linear"===this.Reveal.getConfig().navigationMode?this.Reveal.next():this.Reveal.right()}onNavigateUpClicked(e){e.preventDefault(),this.Reveal.onUserInput(),this.Reveal.up()}onNavigateDownClicked(e){e.preventDefault(),this.Reveal.onUserInput(),this.Reveal.down()}onNavigatePrevClicked(e){e.preventDefault(),this.Reveal.onUserInput(),this.Reveal.prev()}onNavigateNextClicked(e){e.preventDefault(),this.Reveal.onUserInput(),this.Reveal.next()}}class I{constructor(e){this.Reveal=e,this.onProgressClicked=this.onProgressClicked.bind(this)}render(){this.element=document.createElement("div"),this.element.className="progress",this.Reveal.getRevealElement().appendChild(this.element),this.bar=document.createElement("span"),this.element.appendChild(this.bar)}configure(e,t){this.element.style.display=e.progress?"block":"none"}bind(){this.Reveal.getConfig().progress&&this.element&&this.element.addEventListener("click",this.onProgressClicked,!1)}unbind(){this.Reveal.getConfig().progress&&this.element&&this.element.removeEventListener("click",this.onProgressClicked,!1)}update(){if(this.Reveal.getConfig().progress&&this.bar){let e=this.Reveal.getProgress();this.Reveal.getTotalSlides()<2&&(e=0),this.bar.style.transform="scaleX("+e+")"}}getMaxWidth(){return this.Reveal.getRevealElement().offsetWidth}onProgressClicked(e){this.Reveal.onUserInput(e),e.preventDefault();let t=this.Reveal.getSlides(),i=t.length,a=Math.floor(e.clientX/this.getMaxWidth()*i);this.Reveal.getConfig().rtl&&(a=i-a);let n=this.Reveal.getIndices(t[a]);this.Reveal.slide(n.h,n.v)}}class T{constructor(e){this.Reveal=e,this.lastMouseWheelStep=0,this.cursorHidden=!1,this.cursorInactiveTimeout=0,this.onDocumentCursorActive=this.onDocumentCursorActive.bind(this),this.onDocumentMouseScroll=this.onDocumentMouseScroll.bind(this)}configure(e,t){e.mouseWheel?(document.addEventListener("DOMMouseScroll",this.onDocumentMouseScroll,!1),document.addEventListener("mousewheel",this.onDocumentMouseScroll,!1)):(document.removeEventListener("DOMMouseScroll",this.onDocumentMouseScroll,!1),document.removeEventListener("mousewheel",this.onDocumentMouseScroll,!1)),e.hideInactiveCursor?(document.addEventListener("mousemove",this.onDocumentCursorActive,!1),document.addEventListener("mousedown",this.onDocumentCursorActive,!1)):(this.showCursor(),document.removeEventListener("mousemove",this.onDocumentCursorActive,!1),document.removeEventListener("mousedown",this.onDocumentCursorActive,!1))}showCursor(){this.cursorHidden&&(this.cursorHidden=!1,this.Reveal.getRevealElement().style.cursor="")}hideCursor(){!1===this.cursorHidden&&(this.cursorHidden=!0,this.Reveal.getRevealElement().style.cursor="none")}onDocumentCursorActive(e){this.showCursor(),clearTimeout(this.cursorInactiveTimeout),this.cursorInactiveTimeout=setTimeout(this.hideCursor.bind(this),this.Reveal.getConfig().hideCursorTime)}onDocumentMouseScroll(e){if(Date.now()-this.lastMouseWheelStep>1e3){this.lastMouseWheelStep=Date.now();let t=e.detail||-e.wheelDelta;t>0?this.Reveal.next():t<0&&this.Reveal.prev()}}}const z=(e,t)=>{const i=document.createElement("script");i.type="text/javascript",i.async=!1,i.defer=!1,i.src=e,"function"==typeof t&&(i.onload=i.onreadystatechange=e=>{("load"===e.type||/loaded|complete/.test(i.readyState))&&(i.onload=i.onreadystatechange=i.onerror=null,t())},i.onerror=e=>{i.onload=i.onreadystatechange=i.onerror=null,t(new Error("Failed loading script: "+i.src+"\n"+e))});const a=document.querySelector("head");a.insertBefore(i,a.lastChild)};class F{constructor(e){this.Reveal=e,this.state="idle",this.registeredPlugins={},this.asyncDependencies=[]}load(e,t){return this.state="loading",e.forEach(this.registerPlugin.bind(this)),new Promise((e=>{let i=[],a=0;if(t.forEach((e=>{e.condition&&!e.condition()||(e.async?this.asyncDependencies.push(e):i.push(e))})),i.length){a=i.length;const t=t=>{t&&"function"==typeof t.callback&&t.callback(),0==--a&&this.initPlugins().then(e)};i.forEach((e=>{"string"==typeof e.id?(this.registerPlugin(e),t(e)):"string"==typeof e.src?z(e.src,(()=>t(e))):(console.warn("Unrecognized plugin format",e),t())}))}else this.initPlugins().then(e)}))}initPlugins(){return new Promise((e=>{let t=Object.values(this.registeredPlugins),i=t.length;if(0===i)this.loadAsync().then(e);else{let a,n=()=>{0==--i?this.loadAsync().then(e):a()},s=0;a=()=>{let e=t[s++];if("function"==typeof e.init){let t=e.init(this.Reveal);t&&"function"==typeof t.then?t.then(n):n()}else n()},a()}}))}loadAsync(){return this.state="loaded",this.asyncDependencies.length&&this.asyncDependencies.forEach((e=>{z(e.src,e.callback)})),Promise.resolve()}registerPlugin(e){2===arguments.length&&"string"==typeof arguments[0]?(e=arguments[1]).id=arguments[0]:"function"==typeof e&&(e=e());let t=e.id;"string"!=typeof t?console.warn("Unrecognized plugin format; can't find plugin.id",e):void 0===this.registeredPlugins[t]?(this.registeredPlugins[t]=e,"loaded"===this.state&&"function"==typeof e.init&&e.init(this.Reveal)):console.warn('reveal.js: "'+t+'" plugin has already been registered')}hasPlugin(e){return!!this.registeredPlugins[e]}getPlugin(e){return this.registeredPlugins[e]}getRegisteredPlugins(){return this.registeredPlugins}}class H{constructor(e){this.Reveal=e}async setupPDF(){const e=this.Reveal.getConfig(),t=a(this.Reveal.getRevealElement(),".slides section"),i=e.slideNumber&&/all|print/i.test(e.showSlideNumber),n=this.Reveal.getComputedSlideSize(window.innerWidth,window.innerHeight),s=Math.floor(n.width*(1+e.margin)),r=Math.floor(n.height*(1+e.margin)),o=n.width,l=n.height;await new Promise(requestAnimationFrame),c("@page{size:"+s+"px "+r+"px; margin: 0px;}"),c(".reveal section>img, .reveal section>video, .reveal section>iframe{max-width: "+o+"px; max-height:"+l+"px}"),document.documentElement.classList.add("print-pdf"),document.body.style.width=s+"px",document.body.style.height=r+"px",await new Promise(requestAnimationFrame),this.Reveal.layoutSlideContents(o,l),t.forEach((e=>this.Reveal.slideContent.layout(e))),await new Promise(requestAnimationFrame);const d=t.map((e=>e.scrollHeight)),h=[],u=t[0].parentNode;t.forEach((function(t,n){if(!1===t.classList.contains("stack")){let c=(s-o)/2,u=(r-l)/2;const g=d[n];let v=Math.max(Math.ceil(g/r),1);v=Math.min(v,e.pdfMaxPagesPerSlide),(1===v&&e.center||t.classList.contains("center"))&&(u=Math.max((r-g)/2,0));const p=document.createElement("div");if(h.push(p),p.className="pdf-page",p.style.height=(r+e.pdfPageHeightOffset)*v+"px",p.appendChild(t),t.style.left=c+"px",t.style.top=u+"px",t.style.width=o+"px",t.slideBackgroundElement&&p.insertBefore(t.slideBackgroundElement,t),e.showNotes){const i=this.Reveal.getSlideNotes(t);if(i){const t=8,a="string"==typeof e.showNotes?e.showNotes:"inline",n=document.createElement("div");n.classList.add("speaker-notes"),n.classList.add("speaker-notes-pdf"),n.setAttribute("data-layout",a),n.innerHTML=i,"separate-page"===a?h.push(n):(n.style.left=t+"px",n.style.bottom=t+"px",n.style.width=s-2*t+"px",p.appendChild(n))}}if(i){const e=n+1,t=document.createElement("div");t.classList.add("slide-number"),t.classList.add("slide-number-pdf"),t.innerHTML=e,p.appendChild(t)}if(e.pdfSeparateFragments){const e=this.Reveal.fragments.sort(p.querySelectorAll(".fragment"),!0);let t;e.forEach((function(e){t&&t.forEach((function(e){e.classList.remove("current-fragment")})),e.forEach((function(e){e.classList.add("visible","current-fragment")}),this);const i=p.cloneNode(!0);h.push(i),t=e}),this),e.forEach((function(e){e.forEach((function(e){e.classList.remove("visible","current-fragment")}))}))}else a(p,".fragment:not(.fade-out)").forEach((function(e){e.classList.add("visible")}))}}),this),await new Promise(requestAnimationFrame),h.forEach((e=>u.appendChild(e))),this.Reveal.dispatchEvent({type:"pdf-ready"})}isPrintingPDF(){return/print-pdf/gi.test(window.location.search)}}class B{constructor(e){this.Reveal=e,this.touchStartX=0,this.touchStartY=0,this.touchStartCount=0,this.touchCaptured=!1,this.onPointerDown=this.onPointerDown.bind(this),this.onPointerMove=this.onPointerMove.bind(this),this.onPointerUp=this.onPointerUp.bind(this),this.onTouchStart=this.onTouchStart.bind(this),this.onTouchMove=this.onTouchMove.bind(this),this.onTouchEnd=this.onTouchEnd.bind(this)}bind(){let e=this.Reveal.getRevealElement();"onpointerdown"in window?(e.addEventListener("pointerdown",this.onPointerDown,!1),e.addEventListener("pointermove",this.onPointerMove,!1),e.addEventListener("pointerup",this.onPointerUp,!1)):window.navigator.msPointerEnabled?(e.addEventListener("MSPointerDown",this.onPointerDown,!1),e.addEventListener("MSPointerMove",this.onPointerMove,!1),e.addEventListener("MSPointerUp",this.onPointerUp,!1)):(e.addEventListener("touchstart",this.onTouchStart,!1),e.addEventListener("touchmove",this.onTouchMove,!1),e.addEventListener("touchend",this.onTouchEnd,!1))}unbind(){let e=this.Reveal.getRevealElement();e.removeEventListener("pointerdown",this.onPointerDown,!1),e.removeEventListener("pointermove",this.onPointerMove,!1),e.removeEventListener("pointerup",this.onPointerUp,!1),e.removeEventListener("MSPointerDown",this.onPointerDown,!1),e.removeEventListener("MSPointerMove",this.onPointerMove,!1),e.removeEventListener("MSPointerUp",this.onPointerUp,!1),e.removeEventListener("touchstart",this.onTouchStart,!1),e.removeEventListener("touchmove",this.onTouchMove,!1),e.removeEventListener("touchend",this.onTouchEnd,!1)}isSwipePrevented(e){if(o(e,"video, audio"))return!0;for(;e&&"function"==typeof e.hasAttribute;){if(e.hasAttribute("data-prevent-swipe"))return!0;e=e.parentNode}return!1}onTouchStart(e){if(this.isSwipePrevented(e.target))return!0;this.touchStartX=e.touches[0].clientX,this.touchStartY=e.touches[0].clientY,this.touchStartCount=e.touches.length}onTouchMove(e){if(this.isSwipePrevented(e.target))return!0;let t=this.Reveal.getConfig();if(this.touchCaptured)f&&e.preventDefault();else{this.Reveal.onUserInput(e);let i=e.touches[0].clientX,a=e.touches[0].clientY;if(1===e.touches.length&&2!==this.touchStartCount){let n=this.Reveal.availableRoutes({includeFragments:!0}),s=i-this.touchStartX,r=a-this.touchStartY;s>40&&Math.abs(s)>Math.abs(r)?(this.touchCaptured=!0,"linear"===t.navigationMode?t.rtl?this.Reveal.next():this.Reveal.prev():this.Reveal.left()):s<-40&&Math.abs(s)>Math.abs(r)?(this.touchCaptured=!0,"linear"===t.navigationMode?t.rtl?this.Reveal.prev():this.Reveal.next():this.Reveal.right()):r>40&&n.up?(this.touchCaptured=!0,"linear"===t.navigationMode?this.Reveal.prev():this.Reveal.up()):r<-40&&n.down&&(this.touchCaptured=!0,"linear"===t.navigationMode?this.Reveal.next():this.Reveal.down()),t.embedded?(this.touchCaptured||this.Reveal.isVerticalSlide())&&e.preventDefault():e.preventDefault()}}}onTouchEnd(e){this.touchCaptured=!1}onPointerDown(e){e.pointerType!==e.MSPOINTER_TYPE_TOUCH&&"touch"!==e.pointerType||(e.touches=[{clientX:e.clientX,clientY:e.clientY}],this.onTouchStart(e))}onPointerMove(e){e.pointerType!==e.MSPOINTER_TYPE_TOUCH&&"touch"!==e.pointerType||(e.touches=[{clientX:e.clientX,clientY:e.clientY}],this.onTouchMove(e))}onPointerUp(e){e.pointerType!==e.MSPOINTER_TYPE_TOUCH&&"touch"!==e.pointerType||(e.touches=[{clientX:e.clientX,clientY:e.clientY}],this.onTouchEnd(e))}}class q{constructor(e){this.Reveal=e,this.onRevealPointerDown=this.onRevealPointerDown.bind(this),this.onDocumentPointerDown=this.onDocumentPointerDown.bind(this)}configure(e,t){e.embedded?this.blur():(this.focus(),this.unbind())}bind(){this.Reveal.getConfig().embedded&&this.Reveal.getRevealElement().addEventListener("pointerdown",this.onRevealPointerDown,!1)}unbind(){this.Reveal.getRevealElement().removeEventListener("pointerdown",this.onRevealPointerDown,!1),document.removeEventListener("pointerdown",this.onDocumentPointerDown,!1)}focus(){"focus"!==this.state&&(this.Reveal.getRevealElement().classList.add("focused"),document.addEventListener("pointerdown",this.onDocumentPointerDown,!1)),this.state="focus"}blur(){"blur"!==this.state&&(this.Reveal.getRevealElement().classList.remove("focused"),document.removeEventListener("pointerdown",this.onDocumentPointerDown,!1)),this.state="blur"}isFocused(){return"focus"===this.state}onRevealPointerDown(e){this.focus()}onDocumentPointerDown(e){let t=l(e.target,".reveal");t&&t===this.Reveal.getRevealElement()||this.blur()}}class U{constructor(e){this.Reveal=e}render(){this.element=document.createElement("div"),this.element.className="speaker-notes",this.element.setAttribute("data-prevent-swipe",""),this.element.setAttribute("tabindex","0"),this.Reveal.getRevealElement().appendChild(this.element)}configure(e,t){e.showNotes&&this.element.setAttribute("data-layout","string"==typeof e.showNotes?e.showNotes:"inline")}update(){this.Reveal.getConfig().showNotes&&this.element&&this.Reveal.getCurrentSlide()&&!this.Reveal.print.isPrintingPDF()&&(this.element.innerHTML=this.getSlideNotes()||'No notes on this slide.')}updateVisibility(){this.Reveal.getConfig().showNotes&&this.hasNotes()&&!this.Reveal.print.isPrintingPDF()?this.Reveal.getRevealElement().classList.add("show-notes"):this.Reveal.getRevealElement().classList.remove("show-notes")}hasNotes(){return this.Reveal.getSlidesElement().querySelectorAll("[data-notes], aside.notes").length>0}isSpeakerNotesWindow(){return!!window.location.search.match(/receiver/gi)}getSlideNotes(e=this.Reveal.getCurrentSlide()){if(e.hasAttribute("data-notes"))return e.getAttribute("data-notes");let t=e.querySelector("aside.notes");return t?t.innerHTML:null}}class O{constructor(e,t){this.diameter=100,this.diameter2=this.diameter/2,this.thickness=6,this.playing=!1,this.progress=0,this.progressOffset=1,this.container=e,this.progressCheck=t,this.canvas=document.createElement("canvas"),this.canvas.className="playback",this.canvas.width=this.diameter,this.canvas.height=this.diameter,this.canvas.style.width=this.diameter2+"px",this.canvas.style.height=this.diameter2+"px",this.context=this.canvas.getContext("2d"),this.container.appendChild(this.canvas),this.render()}setPlaying(e){const t=this.playing;this.playing=e,!t&&this.playing?this.animate():this.render()}animate(){const e=this.progress;this.progress=this.progressCheck(),e>.8&&this.progress<.2&&(this.progressOffset=this.progress),this.render(),this.playing&&requestAnimationFrame(this.animate.bind(this))}render(){let e=this.playing?this.progress:0,t=this.diameter2-this.thickness,i=this.diameter2,a=this.diameter2,n=28;this.progressOffset+=.1*(1-this.progressOffset);const s=-Math.PI/2+e*(2*Math.PI),r=-Math.PI/2+this.progressOffset*(2*Math.PI);this.context.save(),this.context.clearRect(0,0,this.diameter,this.diameter),this.context.beginPath(),this.context.arc(i,a,t+4,0,2*Math.PI,!1),this.context.fillStyle="rgba( 0, 0, 0, 0.4 )",this.context.fill(),this.context.beginPath(),this.context.arc(i,a,t,0,2*Math.PI,!1),this.context.lineWidth=this.thickness,this.context.strokeStyle="rgba( 255, 255, 255, 0.2 )",this.context.stroke(),this.playing&&(this.context.beginPath(),this.context.arc(i,a,t,r,s,!1),this.context.lineWidth=this.thickness,this.context.strokeStyle="#fff",this.context.stroke()),this.context.translate(i-14,a-14),this.playing?(this.context.fillStyle="#fff",this.context.fillRect(0,0,10,n),this.context.fillRect(18,0,10,n)):(this.context.beginPath(),this.context.translate(4,0),this.context.moveTo(0,0),this.context.lineTo(24,14),this.context.lineTo(0,n),this.context.fillStyle="#fff",this.context.fill()),this.context.restore()}on(e,t){this.canvas.addEventListener(e,t,!1)}off(e,t){this.canvas.removeEventListener(e,t,!1)}destroy(){this.playing=!1,this.canvas.parentNode&&this.container.removeChild(this.canvas)}}var W={width:960,height:700,margin:.04,minScale:.2,maxScale:2,controls:!0,controlsTutorial:!0,controlsLayout:"bottom-right",controlsBackArrows:"faded",progress:!0,slideNumber:!1,showSlideNumber:"all",hashOneBasedIndex:!1,hash:!1,respondToHashChanges:!0,history:!1,keyboard:!0,keyboardCondition:null,disableLayout:!1,overview:!0,center:!0,touch:!0,loop:!1,rtl:!1,navigationMode:"default",shuffle:!1,fragments:!0,fragmentInURL:!0,embedded:!1,help:!0,pause:!0,showNotes:!1,showHiddenSlides:!1,autoPlayMedia:null,preloadIframes:null,autoAnimate:!0,autoAnimateMatcher:null,autoAnimateEasing:"ease",autoAnimateDuration:1,autoAnimateUnmatched:!0,autoAnimateStyles:["opacity","color","background-color","padding","font-size","line-height","letter-spacing","border-width","border-color","border-radius","outline","outline-offset"],autoSlide:0,autoSlideStoppable:!0,autoSlideMethod:null,defaultTiming:null,mouseWheel:!1,previewLinks:!1,postMessage:!0,postMessageEvents:!1,focusBodyOnPageVisibilityChange:!0,transition:"slide",transitionSpeed:"default",backgroundTransition:"fade",parallaxBackgroundImage:"",parallaxBackgroundSize:"",parallaxBackgroundRepeat:"",parallaxBackgroundPosition:"",parallaxBackgroundHorizontal:null,parallaxBackgroundVertical:null,pdfMaxPagesPerSlide:Number.POSITIVE_INFINITY,pdfSeparateFragments:!0,pdfPageHeightOffset:-1,viewDistance:3,mobileViewDistance:2,display:"block",hideInactiveCursor:!0,hideCursorTime:5e3,dependencies:[],plugins:[]};function K(t,o){arguments.length<2&&(o=arguments[0],t=document.querySelector(".reveal"));const c={};let g,v,m,f,y,w={},R=!1,E={hasNavigatedHorizontally:!1,hasNavigatedVertically:!1},L=[],z=1,K={layout:"",overview:""},V={},$="idle",j=0,X=0,Y=-1,_=!1,J=new S(c),Q=new A(c),Z=new x(c),G=new k(c),ee=new C(c),te=new P(c),ie=new N(c),ae=new M(c),ne=new D(c),se=new I(c),re=new T(c),oe=new F(c),le=new H(c),de=new q(c),ce=new B(c),he=new U(c);function ue(e){if(!t)throw'Unable to find presentation root (
).';if(V.wrapper=t,V.slides=t.querySelector(".slides"),!V.slides)throw'Unable to find slides container (
).';return w={...W,...w,...o,...e,...h()},ge(),window.addEventListener("load",Fe,!1),oe.load(w.plugins,w.dependencies).then(ve),new Promise((e=>c.on("ready",e)))}function ge(){!0===w.embedded?V.viewport=l(t,".reveal-viewport")||t:(V.viewport=document.body,document.documentElement.classList.add("reveal-full-page")),V.viewport.classList.add("reveal-viewport")}function ve(){R=!0,pe(),me(),Re(),we(),et(),Se(),ae.readURL(),G.update(!0),setTimeout((()=>{V.slides.classList.remove("no-transition"),V.wrapper.classList.add("ready"),Ce({type:"ready",data:{indexh:g,indexv:v,currentSlide:f}})}),1),le.isPrintingPDF()&&(Ee(),"complete"===document.readyState?le.setupPDF():window.addEventListener("load",(()=>{le.setupPDF()})))}function pe(){w.showHiddenSlides||a(V.wrapper,'section[data-visibility="hidden"]').forEach((e=>{e.parentNode.removeChild(e)}))}function me(){V.slides.classList.add("no-transition"),p?V.wrapper.classList.add("no-hover"):V.wrapper.classList.remove("no-hover"),G.render(),Q.render(),ne.render(),se.render(),he.render(),V.pauseOverlay=d(V.wrapper,"div","pause-overlay",w.controls?'':null),V.statusElement=fe(),V.wrapper.setAttribute("role","application")}function fe(){let e=V.wrapper.querySelector(".aria-status");return e||(e=document.createElement("div"),e.style.position="absolute",e.style.height="1px",e.style.width="1px",e.style.overflow="hidden",e.style.clip="rect( 1px, 1px, 1px, 1px )",e.classList.add("aria-status"),e.setAttribute("aria-live","polite"),e.setAttribute("aria-atomic","true"),V.wrapper.appendChild(e)),e}function be(e){V.statusElement.textContent=e}function ye(e){let t="";if(3===e.nodeType)t+=e.textContent;else if(1===e.nodeType){let i=e.getAttribute("aria-hidden"),a="none"===window.getComputedStyle(e).display;"true"===i||a||Array.from(e.childNodes).forEach((e=>{t+=ye(e)}))}return t=t.trim(),""===t?"":t+" "}function we(){setInterval((()=>{0===V.wrapper.scrollTop&&0===V.wrapper.scrollLeft||(V.wrapper.scrollTop=0,V.wrapper.scrollLeft=0)}),1e3)}function Re(){w.postMessage&&window.addEventListener("message",(t=>{let i=t.data;if("string"==typeof i&&"{"===i.charAt(0)&&"}"===i.charAt(i.length-1)&&(i=JSON.parse(i),i.method&&"function"==typeof c[i.method]))if(!1===e.test(i.method)){const e=c[i.method].apply(c,i.args);Pe("callback",{method:i.method,result:e})}else console.warn('reveal.js: "'+i.method+'" is is blacklisted from the postMessage API')}),!1)}function Se(e){const t={...w};if("object"==typeof e&&i(w,e),!1===c.isReady())return;const a=V.wrapper.querySelectorAll(".slides section").length;V.wrapper.classList.remove(t.transition),V.wrapper.classList.add(w.transition),V.wrapper.setAttribute("data-transition-speed",w.transitionSpeed),V.wrapper.setAttribute("data-background-transition",w.backgroundTransition),V.viewport.style.setProperty("--slide-width",w.width+"px"),V.viewport.style.setProperty("--slide-height",w.height+"px"),w.shuffle&&tt(),n(V.wrapper,"embedded",w.embedded),n(V.wrapper,"rtl",w.rtl),n(V.wrapper,"center",w.center),!1===w.pause&&je(),w.previewLinks?(Ne(),Me("[data-preview-link=false]")):(Me(),Ne("[data-preview-link]:not([data-preview-link=false])")),Z.reset(),y&&(y.destroy(),y=null),a>1&&w.autoSlide&&w.autoSlideStoppable&&(y=new O(V.wrapper,(()=>Math.min(Math.max((Date.now()-Y)/j,0),1))),y.on("click",Ft),_=!1),"default"!==w.navigationMode?V.wrapper.setAttribute("data-navigation-mode",w.navigationMode):V.wrapper.removeAttribute("data-navigation-mode"),he.configure(w,t),de.configure(w,t),re.configure(w,t),ne.configure(w,t),se.configure(w,t),ie.configure(w,t),ee.configure(w,t),Q.configure(w,t),Ze()}function Ae(){window.addEventListener("resize",It,!1),w.touch&&ce.bind(),w.keyboard&&ie.bind(),w.progress&&se.bind(),w.respondToHashChanges&&ae.bind(),ne.bind(),de.bind(),V.slides.addEventListener("click",Dt,!1),V.slides.addEventListener("transitionend",Mt,!1),V.pauseOverlay.addEventListener("click",je,!1),w.focusBodyOnPageVisibilityChange&&document.addEventListener("visibilitychange",Tt,!1)}function Ee(){ce.unbind(),de.unbind(),ie.unbind(),ne.unbind(),se.unbind(),ae.unbind(),window.removeEventListener("resize",It,!1),V.slides.removeEventListener("click",Dt,!1),V.slides.removeEventListener("transitionend",Mt,!1),V.pauseOverlay.removeEventListener("click",je,!1)}function ke(e,i,a){t.addEventListener(e,i,a)}function Le(e,i,a){t.removeEventListener(e,i,a)}function xe(e){"string"==typeof e.layout&&(K.layout=e.layout),"string"==typeof e.overview&&(K.overview=e.overview),K.layout?r(V.slides,K.layout+" "+K.overview):r(V.slides,K.overview)}function Ce({target:e=V.wrapper,type:t,data:a,bubbles:n=!0}){let s=document.createEvent("HTMLEvents",1,2);return s.initEvent(t,n,!0),i(s,a),e.dispatchEvent(s),e===V.wrapper&&Pe(t),s}function Pe(e,t){if(w.postMessageEvents&&window.parent!==window.self){let a={namespace:"reveal",eventName:e,state:bt()};i(a,t),window.parent.postMessage(JSON.stringify(a),"*")}}function Ne(e="a"){Array.from(V.wrapper.querySelectorAll(e)).forEach((e=>{/^(http|www)/gi.test(e.getAttribute("href"))&&e.addEventListener("click",zt,!1)}))}function Me(e="a"){Array.from(V.wrapper.querySelectorAll(e)).forEach((e=>{/^(http|www)/gi.test(e.getAttribute("href"))&&e.removeEventListener("click",zt,!1)}))}function De(e){ze(),V.overlay=document.createElement("div"),V.overlay.classList.add("overlay"),V.overlay.classList.add("overlay-preview"),V.wrapper.appendChild(V.overlay),V.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
`,V.overlay.querySelector("iframe").addEventListener("load",(e=>{V.overlay.classList.add("loaded")}),!1),V.overlay.querySelector(".close").addEventListener("click",(e=>{ze(),e.preventDefault()}),!1),V.overlay.querySelector(".external").addEventListener("click",(e=>{ze()}),!1)}function Ie(e){"boolean"==typeof e?e?Te():ze():V.overlay?ze():Te()}function Te(){if(w.help){ze(),V.overlay=document.createElement("div"),V.overlay.classList.add("overlay"),V.overlay.classList.add("overlay-help"),V.wrapper.appendChild(V.overlay);let e='

Keyboard Shortcuts


',t=ie.getShortcuts(),i=ie.getBindings();e+="";for(let i in t)e+=``;for(let t in i)i[t].key&&i[t].description&&(e+=``);e+="
KEYACTION
${i}${t[i]}
${i[t].key}${i[t].description}
",V.overlay.innerHTML=`\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
${e}
\n\t\t\t\t
\n\t\t\t`,V.overlay.querySelector(".close").addEventListener("click",(e=>{ze(),e.preventDefault()}),!1)}}function ze(){return!!V.overlay&&(V.overlay.parentNode.removeChild(V.overlay),V.overlay=null,!0)}function Fe(){if(V.wrapper&&!le.isPrintingPDF()){if(!w.disableLayout){p&&!w.embedded&&document.documentElement.style.setProperty("--vh",.01*window.innerHeight+"px");const e=Be(),t=z;He(w.width,w.height),V.slides.style.width=e.width+"px",V.slides.style.height=e.height+"px",z=Math.min(e.presentationWidth/e.width,e.presentationHeight/e.height),z=Math.max(z,w.minScale),z=Math.min(z,w.maxScale),1===z?(V.slides.style.zoom="",V.slides.style.left="",V.slides.style.top="",V.slides.style.bottom="",V.slides.style.right="",xe({layout:""})):z>1&&b&&window.devicePixelRatio<2?(V.slides.style.zoom=z,V.slides.style.left="",V.slides.style.top="",V.slides.style.bottom="",V.slides.style.right="",xe({layout:""})):(V.slides.style.zoom="",V.slides.style.left="50%",V.slides.style.top="50%",V.slides.style.bottom="auto",V.slides.style.right="auto",xe({layout:"translate(-50%, -50%) scale("+z+")"}));const i=Array.from(V.wrapper.querySelectorAll(".slides section"));for(let t=0,a=i.length;t .stretch, section > .r-stretch").forEach((i=>{let a=u(i,t);if(/(img|video)/gi.test(i.nodeName)){const t=i.naturalWidth||i.videoWidth,n=i.naturalHeight||i.videoHeight,s=Math.min(e/t,a/n);i.style.width=t*s+"px",i.style.height=n*s+"px"}else i.style.width=e+"px",i.style.height=a+"px"}))}function Be(e,t){const i={width:w.width,height:w.height,presentationWidth:e||V.wrapper.offsetWidth,presentationHeight:t||V.wrapper.offsetHeight};return i.presentationWidth-=i.presentationWidth*w.margin,i.presentationHeight-=i.presentationHeight*w.margin,"string"==typeof i.width&&/%$/.test(i.width)&&(i.width=parseInt(i.width,10)/100*i.presentationWidth),"string"==typeof i.height&&/%$/.test(i.height)&&(i.height=parseInt(i.height,10)/100*i.presentationHeight),i}function qe(e,t){"object"==typeof e&&"function"==typeof e.setAttribute&&e.setAttribute("data-previous-indexv",t||0)}function Ue(e){if("object"==typeof e&&"function"==typeof e.setAttribute&&e.classList.contains("stack")){const t=e.hasAttribute("data-start-indexv")?"data-start-indexv":"data-previous-indexv";return parseInt(e.getAttribute(t)||0,10)}return 0}function Oe(e=f){return e&&e.parentNode&&!!e.parentNode.nodeName.match(/section/i)}function We(){return!(!f||!Oe(f))&&!f.nextElementSibling}function Ke(){return 0===g&&0===v}function Ve(){return!!f&&(!f.nextElementSibling&&(!Oe(f)||!f.parentNode.nextElementSibling))}function $e(){if(w.pause){const e=V.wrapper.classList.contains("paused");Rt(),V.wrapper.classList.add("paused"),!1===e&&Ce({type:"paused"})}}function je(){const e=V.wrapper.classList.contains("paused");V.wrapper.classList.remove("paused"),wt(),e&&Ce({type:"resumed"})}function Xe(e){"boolean"==typeof e?e?$e():je():Ye()?je():$e()}function Ye(){return V.wrapper.classList.contains("paused")}function _e(e){"boolean"==typeof e?e?At():St():_?At():St()}function Je(){return!(!j||_)}function Qe(e,t,i,a){if(Ce({type:"beforeslidechange",data:{indexh:void 0===e?g:e,indexv:void 0===t?v:t,origin:a}}).defaultPrevented)return;m=f;const n=V.wrapper.querySelectorAll(".slides>section");if(0===n.length)return;void 0!==t||te.isActive()||(t=Ue(n[e])),m&&m.parentNode&&m.parentNode.classList.contains("stack")&&qe(m.parentNode,v);const s=L.concat();L.length=0;let r=g||0,o=v||0;g=it(".slides>section",void 0===e?g:e),v=it(".slides>section.present>section",void 0===t?v:t);let l=g!==r||v!==o;l||(m=null);let d=n[g],c=d.querySelectorAll("section");f=c[v]||d;let h=!1;l&&m&&f&&!te.isActive()&&(m.hasAttribute("data-auto-animate")&&f.hasAttribute("data-auto-animate")&&m.getAttribute("data-auto-animate-id")===f.getAttribute("data-auto-animate-id")&&!(g>r||v>o?f:m).hasAttribute("data-auto-animate-restart")&&(h=!0,V.slides.classList.add("disable-slide-transitions")),$="running"),at(),Fe(),te.isActive()&&te.update(),void 0!==i&&ee.goto(i),m&&m!==f&&(m.classList.remove("present"),m.setAttribute("aria-hidden","true"),Ke()&&setTimeout((()=>{ht().forEach((e=>{qe(e,0)}))}),0));e:for(let e=0,t=L.length;e{be(ye(f))})),se.update(),ne.update(),he.update(),G.update(),G.updateParallax(),Q.update(),ee.update(),ae.writeURL(),wt(),h&&(setTimeout((()=>{V.slides.classList.remove("disable-slide-transitions")}),0),w.autoAnimate&&Z.run(m,f))}function Ze(){Ee(),Ae(),Fe(),j=w.autoSlide,wt(),G.create(),ae.writeURL(),ee.sortAll(),ne.update(),se.update(),at(),he.update(),he.updateVisibility(),G.update(!0),Q.update(),J.formatEmbeddedContent(),!1===w.autoPlayMedia?J.stopEmbeddedContent(f,{unloadIframes:!1}):J.startEmbeddedContent(f),te.isActive()&&te.layout()}function Ge(e=f){G.sync(e),ee.sync(e),J.load(e),G.update(),he.update()}function et(){dt().forEach((e=>{a(e,"section").forEach(((e,t)=>{t>0&&(e.classList.remove("present"),e.classList.remove("past"),e.classList.add("future"),e.setAttribute("aria-hidden","true"))}))}))}function tt(e=dt()){e.forEach(((t,i)=>{let a=e[Math.floor(Math.random()*e.length)];a.parentNode===t.parentNode&&t.parentNode.insertBefore(t,a);let n=t.querySelectorAll("section");n.length&&tt(n)}))}function it(e,t){let i=a(V.wrapper,e),n=i.length,s=le.isPrintingPDF();if(n){w.loop&&(t%=n)<0&&(t=n+t),t=Math.max(Math.min(t,n-1),0);for(let e=0;e{e.classList.add("visible"),e.classList.remove("current-fragment")}))):e>t&&(n.classList.add(r?"past":"future"),w.fragments&&a(n,".fragment.visible").forEach((e=>{e.classList.remove("visible","current-fragment")})))}let e=i[t],r=e.classList.contains("present");e.classList.add("present"),e.removeAttribute("hidden"),e.removeAttribute("aria-hidden"),r||Ce({target:e,type:"visible",bubbles:!1});let o=e.getAttribute("data-state");o&&(L=L.concat(o.split(" ")))}else t=0;return t}function at(){let e,t,i=dt(),n=i.length;if(n&&void 0!==g){let s=te.isActive()?10:w.viewDistance;p&&(s=te.isActive()?6:w.mobileViewDistance),le.isPrintingPDF()&&(s=Number.MAX_VALUE);for(let r=0;rsection"),i=V.wrapper.querySelectorAll(".slides>section.present>section"),a={left:g>0,right:g0,down:v1&&(a.left=!0,a.right=!0),i.length>1&&(a.up=!0,a.down=!0)),t.length>1&&"linear"===w.navigationMode&&(a.right=a.right||a.down,a.left=a.left||a.up),!0===e){let e=ee.availableRoutes();a.left=a.left||e.prev,a.up=a.up||e.prev,a.down=a.down||e.next,a.right=a.right||e.next}if(w.rtl){let e=a.left;a.left=a.right,a.right=e}return a}function st(e=f){let t=dt(),i=0;e:for(let a=0;a0){let i=.9;t+=f.querySelectorAll(".fragment.visible").length/e.length*i}}return Math.min(t/(e-1),1)}function ot(e){let t,i=g,n=v;if(e){let t=Oe(e),s=t?e.parentNode:e,r=dt();i=Math.max(r.indexOf(s),0),n=void 0,t&&(n=Math.max(a(e.parentNode,"section").indexOf(e),0))}if(!e&&f){if(f.querySelectorAll(".fragment").length>0){let e=f.querySelector(".current-fragment");t=e&&e.hasAttribute("data-fragment-index")?parseInt(e.getAttribute("data-fragment-index"),10):f.querySelectorAll(".fragment.visible").length-1}}return{h:i,v:n,f:t}}function lt(){return a(V.wrapper,'.slides section:not(.stack):not([data-visibility="uncounted"])')}function dt(){return a(V.wrapper,".slides>section")}function ct(){return a(V.wrapper,".slides>section>section")}function ht(){return a(V.wrapper,".slides>section.stack")}function ut(){return dt().length>1}function gt(){return ct().length>1}function vt(){return lt().map((e=>{let t={};for(let i=0;i{e.hasAttribute("data-autoplay")&&j&&1e3*e.duration/e.playbackRate>j&&(j=1e3*e.duration/e.playbackRate+1e3)}))),!j||_||Ye()||te.isActive()||Ve()&&!ee.availableRoutes().next&&!0!==w.loop||(X=setTimeout((()=>{"function"==typeof w.autoSlideMethod?w.autoSlideMethod():Pt(),wt()}),j),Y=Date.now()),y&&y.setPlaying(-1!==X)}}function Rt(){clearTimeout(X),X=-1}function St(){j&&!_&&(_=!0,Ce({type:"autoslidepaused"}),clearTimeout(X),y&&y.setPlaying(!1))}function At(){j&&_&&(_=!1,Ce({type:"autoslideresumed"}),wt())}function Et({skipFragments:e=!1}={}){E.hasNavigatedHorizontally=!0,w.rtl?(te.isActive()||e||!1===ee.next())&&nt().left&&Qe(g+1,"grid"===w.navigationMode?v:void 0):(te.isActive()||e||!1===ee.prev())&&nt().left&&Qe(g-1,"grid"===w.navigationMode?v:void 0)}function kt({skipFragments:e=!1}={}){E.hasNavigatedHorizontally=!0,w.rtl?(te.isActive()||e||!1===ee.prev())&&nt().right&&Qe(g-1,"grid"===w.navigationMode?v:void 0):(te.isActive()||e||!1===ee.next())&&nt().right&&Qe(g+1,"grid"===w.navigationMode?v:void 0)}function Lt({skipFragments:e=!1}={}){(te.isActive()||e||!1===ee.prev())&&nt().up&&Qe(g,v-1)}function xt({skipFragments:e=!1}={}){E.hasNavigatedVertically=!0,(te.isActive()||e||!1===ee.next())&&nt().down&&Qe(g,v+1)}function Ct({skipFragments:e=!1}={}){if(e||!1===ee.prev())if(nt().up)Lt({skipFragments:e});else{let t;if(t=w.rtl?a(V.wrapper,".slides>section.future").pop():a(V.wrapper,".slides>section.past").pop(),t&&t.classList.contains("stack")){let e=t.querySelectorAll("section").length-1||void 0;Qe(g-1,e)}else Et({skipFragments:e})}}function Pt({skipFragments:e=!1}={}){if(E.hasNavigatedHorizontally=!0,E.hasNavigatedVertically=!0,e||!1===ee.next()){let t=nt();t.down&&t.right&&w.loop&&We()&&(t.down=!1),t.down?xt({skipFragments:e}):w.rtl?Et({skipFragments:e}):kt({skipFragments:e})}}function Nt(e){w.autoSlideStoppable&&St()}function Mt(e){"running"===$&&/section/gi.test(e.target.nodeName)&&($="idle",Ce({type:"slidetransitionend",data:{indexh:g,indexv:v,previousSlide:m,currentSlide:f}}))}function Dt(e){const t=l(e.target,'a[href^="#"]');if(t){const i=t.getAttribute("href"),a=ae.getIndicesFromHash(i);a&&(c.slide(a.h,a.v,a.f),e.preventDefault())}}function It(e){Fe()}function Tt(e){!1===document.hidden&&document.activeElement!==document.body&&("function"==typeof document.activeElement.blur&&document.activeElement.blur(),document.body.focus())}function zt(e){if(e.currentTarget&&e.currentTarget.hasAttribute("href")){let t=e.currentTarget.getAttribute("href");t&&(De(t),e.preventDefault())}}function Ft(e){Ve()&&!1===w.loop?(Qe(0,0),At()):_?At():St()}const Ht={VERSION:"4.2.0",initialize:ue,configure:Se,sync:Ze,syncSlide:Ge,syncFragments:ee.sync.bind(ee),slide:Qe,left:Et,right:kt,up:Lt,down:xt,prev:Ct,next:Pt,navigateLeft:Et,navigateRight:kt,navigateUp:Lt,navigateDown:xt,navigatePrev:Ct,navigateNext:Pt,navigateFragment:ee.goto.bind(ee),prevFragment:ee.prev.bind(ee),nextFragment:ee.next.bind(ee),on:ke,off:Le,addEventListener:ke,removeEventListener:Le,layout:Fe,shuffle:tt,availableRoutes:nt,availableFragments:ee.availableRoutes.bind(ee),toggleHelp:Ie,toggleOverview:te.toggle.bind(te),togglePause:Xe,toggleAutoSlide:_e,isFirstSlide:Ke,isLastSlide:Ve,isLastVerticalSlide:We,isVerticalSlide:Oe,isPaused:Ye,isAutoSliding:Je,isSpeakerNotes:he.isSpeakerNotesWindow.bind(he),isOverview:te.isActive.bind(te),isFocused:de.isFocused.bind(de),isPrintingPDF:le.isPrintingPDF.bind(le),isReady:()=>R,loadSlide:J.load.bind(J),unloadSlide:J.unload.bind(J),showPreview:De,hidePreview:ze,addEventListeners:Ae,removeEventListeners:Ee,dispatchEvent:Ce,getState:bt,setState:yt,getProgress:rt,getIndices:ot,getSlidesAttributes:vt,getSlidePastCount:st,getTotalSlides:pt,getSlide:mt,getPreviousSlide:()=>m,getCurrentSlide:()=>f,getSlideBackground:ft,getSlideNotes:he.getSlideNotes.bind(he),getSlides:lt,getHorizontalSlides:dt,getVerticalSlides:ct,hasHorizontalSlides:ut,hasVerticalSlides:gt,hasNavigatedHorizontally:()=>E.hasNavigatedHorizontally,hasNavigatedVertically:()=>E.hasNavigatedVertically,addKeyBinding:ie.addKeyBinding.bind(ie),removeKeyBinding:ie.removeKeyBinding.bind(ie),triggerKey:ie.triggerKey.bind(ie),registerKeyboardShortcut:ie.registerKeyboardShortcut.bind(ie),getComputedSlideSize:Be,getScale:()=>z,getConfig:()=>w,getQueryHash:h,getRevealElement:()=>t,getSlidesElement:()=>V.slides,getViewportElement:()=>V.viewport,getBackgroundsElement:()=>G.element,registerPlugin:oe.registerPlugin.bind(oe),hasPlugin:oe.hasPlugin.bind(oe),getPlugin:oe.getPlugin.bind(oe),getPlugins:oe.getRegisteredPlugins.bind(oe)};return i(c,{...Ht,announceStatus:be,getStatusText:ye,print:le,focus:de,progress:se,controls:ne,location:ae,overview:te,fragments:ee,slideContent:J,slideNumber:Q,onUserInput:Nt,closeOverlay:ze,updateSlidesVisibility:at,layoutSlideContents:He,transformSlides:xe,cueAutoSlide:wt,cancelAutoSlide:Rt}),Ht}let V=K,$=[];V.initialize=e=>(Object.assign(V,new K(document.querySelector(".reveal"),e)),$.map((e=>e(V))),V.initialize()),["configure","on","off","addEventListener","removeEventListener","registerPlugin"].forEach((e=>{V[e]=(...t)=>{$.push((i=>i[e].call(null,...t)))}})),V.isReady=()=>!1,V.VERSION="4.2.0";export default V; +//# sourceMappingURL=reveal.esm.js.map diff --git a/static/presentations/2021-11-13/garage/dist/reveal.js b/static/presentations/2021-11-13/garage/dist/reveal.js new file mode 100644 index 0000000..658fa99 --- /dev/null +++ b/static/presentations/2021-11-13/garage/dist/reveal.js @@ -0,0 +1,9 @@ +/*! +* reveal.js 4.2.0 +* https://revealjs.com +* MIT licensed +* +* Copyright (C) 2011-2021 Hakim El Hattab, https://hakim.se +*/ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).Reveal=t()}(this,(function(){"use strict";var e="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},t=function(e){return e&&e.Math==Math&&e},n=t("object"==typeof globalThis&&globalThis)||t("object"==typeof window&&window)||t("object"==typeof self&&self)||t("object"==typeof e&&e)||function(){return this}()||Function("return this")(),i={},r=function(e){try{return!!e()}catch(e){return!0}},a=!r((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]})),o={},s={}.propertyIsEnumerable,l=Object.getOwnPropertyDescriptor,c=l&&!s.call({1:2},1);o.f=c?function(e){var t=l(this,e);return!!t&&t.enumerable}:s;var u=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}},d={}.toString,h=function(e){return d.call(e).slice(8,-1)},f=h,v="".split,g=r((function(){return!Object("z").propertyIsEnumerable(0)}))?function(e){return"String"==f(e)?v.call(e,""):Object(e)}:Object,p=function(e){if(null==e)throw TypeError("Can't call method on "+e);return e},m=g,y=p,b=function(e){return m(y(e))},w=function(e){return"object"==typeof e?null!==e:"function"==typeof e},S=w,E=function(e,t){if(!S(e))return e;var n,i;if(t&&"function"==typeof(n=e.toString)&&!S(i=n.call(e)))return i;if("function"==typeof(n=e.valueOf)&&!S(i=n.call(e)))return i;if(!t&&"function"==typeof(n=e.toString)&&!S(i=n.call(e)))return i;throw TypeError("Can't convert object to primitive value")},k=p,A=function(e){return Object(k(e))},R=A,x={}.hasOwnProperty,L=function(e,t){return x.call(R(e),t)},P=w,C=n.document,N=P(C)&&P(C.createElement),I=function(e){return N?C.createElement(e):{}},M=I,T=!a&&!r((function(){return 7!=Object.defineProperty(M("div"),"a",{get:function(){return 7}}).a})),O=a,D=o,j=u,F=b,z=E,H=L,U=T,B=Object.getOwnPropertyDescriptor;i.f=O?B:function(e,t){if(e=F(e),t=z(t,!0),U)try{return B(e,t)}catch(e){}if(H(e,t))return j(!D.f.call(e,t),e[t])};var _={},q=w,W=function(e){if(!q(e))throw TypeError(String(e)+" is not an object");return e},V=a,K=T,Y=W,$=E,X=Object.defineProperty;_.f=V?X:function(e,t,n){if(Y(e),t=$(t,!0),Y(n),K)try{return X(e,t,n)}catch(e){}if("get"in n||"set"in n)throw TypeError("Accessors not supported");return"value"in n&&(e[t]=n.value),e};var G=_,J=u,Q=a?function(e,t,n){return G.f(e,t,J(1,n))}:function(e,t,n){return e[t]=n,e},Z={exports:{}},ee=n,te=Q,ne=function(e,t){try{te(ee,e,t)}catch(n){ee[e]=t}return t},ie=ne,re="__core-js_shared__",ae=n[re]||ie(re,{}),oe=ae,se=Function.toString;"function"!=typeof oe.inspectSource&&(oe.inspectSource=function(e){return se.call(e)});var le=oe.inspectSource,ce=le,ue=n.WeakMap,de="function"==typeof ue&&/native code/.test(ce(ue)),he={exports:{}},fe=ae;(he.exports=function(e,t){return fe[e]||(fe[e]=void 0!==t?t:{})})("versions",[]).push({version:"3.12.1",mode:"global",copyright:"© 2021 Denis Pushkarev (zloirock.ru)"});var ve,ge,pe,me=0,ye=Math.random(),be=function(e){return"Symbol("+String(void 0===e?"":e)+")_"+(++me+ye).toString(36)},we=he.exports,Se=be,Ee=we("keys"),ke=function(e){return Ee[e]||(Ee[e]=Se(e))},Ae={},Re=de,xe=w,Le=Q,Pe=L,Ce=ae,Ne=ke,Ie=Ae,Me="Object already initialized",Te=n.WeakMap;if(Re||Ce.state){var Oe=Ce.state||(Ce.state=new Te),De=Oe.get,je=Oe.has,Fe=Oe.set;ve=function(e,t){if(je.call(Oe,e))throw new TypeError(Me);return t.facade=e,Fe.call(Oe,e,t),t},ge=function(e){return De.call(Oe,e)||{}},pe=function(e){return je.call(Oe,e)}}else{var ze=Ne("state");Ie[ze]=!0,ve=function(e,t){if(Pe(e,ze))throw new TypeError(Me);return t.facade=e,Le(e,ze,t),t},ge=function(e){return Pe(e,ze)?e[ze]:{}},pe=function(e){return Pe(e,ze)}}var He={set:ve,get:ge,has:pe,enforce:function(e){return pe(e)?ge(e):ve(e,{})},getterFor:function(e){return function(t){var n;if(!xe(t)||(n=ge(t)).type!==e)throw TypeError("Incompatible receiver, "+e+" required");return n}}},Ue=n,Be=Q,_e=L,qe=ne,We=le,Ve=He.get,Ke=He.enforce,Ye=String(String).split("String");(Z.exports=function(e,t,n,i){var r,a=!!i&&!!i.unsafe,o=!!i&&!!i.enumerable,s=!!i&&!!i.noTargetGet;"function"==typeof n&&("string"!=typeof t||_e(n,"name")||Be(n,"name",t),(r=Ke(n)).source||(r.source=Ye.join("string"==typeof t?t:""))),e!==Ue?(a?!s&&e[t]&&(o=!0):delete e[t],o?e[t]=n:Be(e,t,n)):o?e[t]=n:qe(t,n)})(Function.prototype,"toString",(function(){return"function"==typeof this&&Ve(this).source||We(this)}));var $e=n,Xe=$e,Ge=n,Je=function(e){return"function"==typeof e?e:void 0},Qe=function(e,t){return arguments.length<2?Je(Xe[e])||Je(Ge[e]):Xe[e]&&Xe[e][t]||Ge[e]&&Ge[e][t]},Ze={},et=Math.ceil,tt=Math.floor,nt=function(e){return isNaN(e=+e)?0:(e>0?tt:et)(e)},it=nt,rt=Math.min,at=function(e){return e>0?rt(it(e),9007199254740991):0},ot=nt,st=Math.max,lt=Math.min,ct=function(e,t){var n=ot(e);return n<0?st(n+t,0):lt(n,t)},ut=b,dt=at,ht=ct,ft=function(e){return function(t,n,i){var r,a=ut(t),o=dt(a.length),s=ht(i,o);if(e&&n!=n){for(;o>s;)if((r=a[s++])!=r)return!0}else for(;o>s;s++)if((e||s in a)&&a[s]===n)return e||s||0;return!e&&-1}},vt={includes:ft(!0),indexOf:ft(!1)},gt=L,pt=b,mt=vt.indexOf,yt=Ae,bt=function(e,t){var n,i=pt(e),r=0,a=[];for(n in i)!gt(yt,n)&>(i,n)&&a.push(n);for(;t.length>r;)gt(i,n=t[r++])&&(~mt(a,n)||a.push(n));return a},wt=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"],St=bt,Et=wt.concat("length","prototype");Ze.f=Object.getOwnPropertyNames||function(e){return St(e,Et)};var kt={};kt.f=Object.getOwnPropertySymbols;var At=Ze,Rt=kt,xt=W,Lt=Qe("Reflect","ownKeys")||function(e){var t=At.f(xt(e)),n=Rt.f;return n?t.concat(n(e)):t},Pt=L,Ct=Lt,Nt=i,It=_,Mt=function(e,t){for(var n=Ct(t),i=It.f,r=Nt.f,a=0;ar;)for(var s,l=an(arguments[r++]),c=a?en(l).concat(a(l)):en(l),u=c.length,d=0;u>d;)s=c[d++],Qt&&!o.call(l,s)||(n[s]=l[s]);return n}:on;$t({target:"Object",stat:!0,forced:Object.assign!==ln},{assign:ln});var cn,un,dn=function(e){if("function"!=typeof e)throw TypeError(String(e)+" is not a function");return e},hn=dn,fn=function(e,t,n){if(hn(e),void 0===t)return e;switch(n){case 0:return function(){return e.call(t)};case 1:return function(n){return e.call(t,n)};case 2:return function(n,i){return e.call(t,n,i)};case 3:return function(n,i,r){return e.call(t,n,i,r)}}return function(){return e.apply(t,arguments)}},vn=h,gn=Array.isArray||function(e){return"Array"==vn(e)},pn=Qe("navigator","userAgent")||"",mn=pn,yn=n.process,bn=yn&&yn.versions,wn=bn&&bn.v8;wn?un=(cn=wn.split("."))[0]<4?1:cn[0]+cn[1]:mn&&(!(cn=mn.match(/Edge\/(\d+)/))||cn[1]>=74)&&(cn=mn.match(/Chrome\/(\d+)/))&&(un=cn[1]);var Sn=un&&+un,En=Sn,kn=r,An=!!Object.getOwnPropertySymbols&&!kn((function(){return!String(Symbol())||!Symbol.sham&&En&&En<41})),Rn=An&&!Symbol.sham&&"symbol"==typeof Symbol.iterator,xn=n,Ln=he.exports,Pn=L,Cn=be,Nn=An,In=Rn,Mn=Ln("wks"),Tn=xn.Symbol,On=In?Tn:Tn&&Tn.withoutSetter||Cn,Dn=function(e){return Pn(Mn,e)&&(Nn||"string"==typeof Mn[e])||(Nn&&Pn(Tn,e)?Mn[e]=Tn[e]:Mn[e]=On("Symbol."+e)),Mn[e]},jn=w,Fn=gn,zn=Dn("species"),Hn=function(e,t){var n;return Fn(e)&&("function"!=typeof(n=e.constructor)||n!==Array&&!Fn(n.prototype)?jn(n)&&null===(n=n[zn])&&(n=void 0):n=void 0),new(void 0===n?Array:n)(0===t?0:t)},Un=fn,Bn=g,_n=A,qn=at,Wn=Hn,Vn=[].push,Kn=function(e){var t=1==e,n=2==e,i=3==e,r=4==e,a=6==e,o=7==e,s=5==e||a;return function(l,c,u,d){for(var h,f,v=_n(l),g=Bn(v),p=Un(c,u,3),m=qn(g.length),y=0,b=d||Wn,w=t?b(l,m):n||o?b(l,0):void 0;m>y;y++)if((s||y in g)&&(f=p(h=g[y],y,v),e))if(t)w[y]=f;else if(f)switch(e){case 3:return!0;case 5:return h;case 6:return y;case 2:Vn.call(w,h)}else switch(e){case 4:return!1;case 7:Vn.call(w,h)}return a?-1:i||r?r:w}},Yn={forEach:Kn(0),map:Kn(1),filter:Kn(2),some:Kn(3),every:Kn(4),find:Kn(5),findIndex:Kn(6),filterOut:Kn(7)},$n=r,Xn=Sn,Gn=Dn("species"),Jn=function(e){return Xn>=51||!$n((function(){var t=[];return(t.constructor={})[Gn]=function(){return{foo:1}},1!==t[e](Boolean).foo}))},Qn=Yn.map;$t({target:"Array",proto:!0,forced:!Jn("map")},{map:function(e){return Qn(this,e,arguments.length>1?arguments[1]:void 0)}});var Zn=E,ei=_,ti=u,ni=function(e,t,n){var i=Zn(t);i in e?ei.f(e,i,ti(0,n)):e[i]=n},ii=$t,ri=r,ai=gn,oi=w,si=A,li=at,ci=ni,ui=Hn,di=Jn,hi=Sn,fi=Dn("isConcatSpreadable"),vi=9007199254740991,gi="Maximum allowed index exceeded",pi=hi>=51||!ri((function(){var e=[];return e[fi]=!1,e.concat()[0]!==e})),mi=di("concat"),yi=function(e){if(!oi(e))return!1;var t=e[fi];return void 0!==t?!!t:ai(e)};function bi(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function wi(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,i=new Array(t);nvi)throw TypeError(gi);for(n=0;n=vi)throw TypeError(gi);ci(s,l++,a)}return s.length=l,s}});var Ci={};Ci[Dn("toStringTag")]="z";var Ni="[object z]"===String(Ci),Ii=Ni,Mi=h,Ti=Dn("toStringTag"),Oi="Arguments"==Mi(function(){return arguments}()),Di=Ii?Mi:function(e){var t,n,i;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=function(e,t){try{return e[t]}catch(e){}}(t=Object(e),Ti))?n:Oi?Mi(t):"Object"==(i=Mi(t))&&"function"==typeof t.callee?"Arguments":i},ji=Di,Fi=Ni?{}.toString:function(){return"[object "+ji(this)+"]"},zi=Ni,Hi=Z.exports,Ui=Fi;zi||Hi(Object.prototype,"toString",Ui,{unsafe:!0});var Bi=n.Promise,_i=Z.exports,qi=w,Wi=W,Vi=function(e){if(!qi(e)&&null!==e)throw TypeError("Can't set "+String(e)+" as a prototype");return e},Ki=Object.setPrototypeOf||("__proto__"in{}?function(){var e,t=!1,n={};try{(e=Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set).call(n,[]),t=n instanceof Array}catch(e){}return function(n,i){return Wi(n),Vi(i),t?e.call(n,i):n.__proto__=i,n}}():void 0),Yi=_.f,$i=L,Xi=Dn("toStringTag"),Gi=function(e,t,n){e&&!$i(e=n?e:e.prototype,Xi)&&Yi(e,Xi,{configurable:!0,value:t})},Ji=Qe,Qi=_,Zi=a,er=Dn("species"),tr={},nr=tr,ir=Dn("iterator"),rr=Array.prototype,ar=function(e){return void 0!==e&&(nr.Array===e||rr[ir]===e)},or=Di,sr=tr,lr=Dn("iterator"),cr=function(e){if(null!=e)return e[lr]||e["@@iterator"]||sr[or(e)]},ur=W,dr=function(e){var t=e.return;if(void 0!==t)return ur(t.call(e)).value},hr=W,fr=ar,vr=at,gr=fn,pr=cr,mr=dr,yr=function(e,t){this.stopped=e,this.result=t},br=Dn("iterator"),wr=!1;try{var Sr=0,Er={next:function(){return{done:!!Sr++}},return:function(){wr=!0}};Er[br]=function(){return this},Array.from(Er,(function(){throw 2}))}catch(e){}var kr,Ar,Rr,xr=function(e,t){if(!t&&!wr)return!1;var n=!1;try{var i={};i[br]=function(){return{next:function(){return{done:n=!0}}}},e(i)}catch(e){}return n},Lr=W,Pr=dn,Cr=Dn("species"),Nr=function(e,t){var n,i=Lr(e).constructor;return void 0===i||null==(n=Lr(i)[Cr])?t:Pr(n)},Ir=Qe("document","documentElement"),Mr=/(?:iphone|ipod|ipad).*applewebkit/i.test(pn),Tr="process"==h(n.process),Or=n,Dr=r,jr=fn,Fr=Ir,zr=I,Hr=Mr,Ur=Tr,Br=Or.location,_r=Or.setImmediate,qr=Or.clearImmediate,Wr=Or.process,Vr=Or.MessageChannel,Kr=Or.Dispatch,Yr=0,$r={},Xr="onreadystatechange",Gr=function(e){if($r.hasOwnProperty(e)){var t=$r[e];delete $r[e],t()}},Jr=function(e){return function(){Gr(e)}},Qr=function(e){Gr(e.data)},Zr=function(e){Or.postMessage(e+"",Br.protocol+"//"+Br.host)};_r&&qr||(_r=function(e){for(var t=[],n=1;arguments.length>n;)t.push(arguments[n++]);return $r[++Yr]=function(){("function"==typeof e?e:Function(e)).apply(void 0,t)},kr(Yr),Yr},qr=function(e){delete $r[e]},Ur?kr=function(e){Wr.nextTick(Jr(e))}:Kr&&Kr.now?kr=function(e){Kr.now(Jr(e))}:Vr&&!Hr?(Rr=(Ar=new Vr).port2,Ar.port1.onmessage=Qr,kr=jr(Rr.postMessage,Rr,1)):Or.addEventListener&&"function"==typeof postMessage&&!Or.importScripts&&Br&&"file:"!==Br.protocol&&!Dr(Zr)?(kr=Zr,Or.addEventListener("message",Qr,!1)):kr=Xr in zr("script")?function(e){Fr.appendChild(zr("script")).onreadystatechange=function(){Fr.removeChild(this),Gr(e)}}:function(e){setTimeout(Jr(e),0)});var ea,ta,na,ia,ra,aa,oa,sa,la={set:_r,clear:qr},ca=/web0s(?!.*chrome)/i.test(pn),ua=n,da=i.f,ha=la.set,fa=Mr,va=ca,ga=Tr,pa=ua.MutationObserver||ua.WebKitMutationObserver,ma=ua.document,ya=ua.process,ba=ua.Promise,wa=da(ua,"queueMicrotask"),Sa=wa&&wa.value;Sa||(ea=function(){var e,t;for(ga&&(e=ya.domain)&&e.exit();ta;){t=ta.fn,ta=ta.next;try{t()}catch(e){throw ta?ia():na=void 0,e}}na=void 0,e&&e.enter()},fa||ga||va||!pa||!ma?ba&&ba.resolve?((oa=ba.resolve(void 0)).constructor=ba,sa=oa.then,ia=function(){sa.call(oa,ea)}):ia=ga?function(){ya.nextTick(ea)}:function(){ha.call(ua,ea)}:(ra=!0,aa=ma.createTextNode(""),new pa(ea).observe(aa,{characterData:!0}),ia=function(){aa.data=ra=!ra}));var Ea=Sa||function(e){var t={fn:e,next:void 0};na&&(na.next=t),ta||(ta=t,ia()),na=t},ka={},Aa=dn,Ra=function(e){var t,n;this.promise=new e((function(e,i){if(void 0!==t||void 0!==n)throw TypeError("Bad Promise constructor");t=e,n=i})),this.resolve=Aa(t),this.reject=Aa(n)};ka.f=function(e){return new Ra(e)};var xa,La,Pa,Ca,Na=W,Ia=w,Ma=ka,Ta=n,Oa="object"==typeof window,Da=$t,ja=n,Fa=Qe,za=Bi,Ha=Z.exports,Ua=function(e,t,n){for(var i in t)_i(e,i,t[i],n);return e},Ba=Ki,_a=Gi,qa=function(e){var t=Ji(e),n=Qi.f;Zi&&t&&!t[er]&&n(t,er,{configurable:!0,get:function(){return this}})},Wa=w,Va=dn,Ka=function(e,t,n){if(!(e instanceof t))throw TypeError("Incorrect "+(n?n+" ":"")+"invocation");return e},Ya=le,$a=function(e,t,n){var i,r,a,o,s,l,c,u=n&&n.that,d=!(!n||!n.AS_ENTRIES),h=!(!n||!n.IS_ITERATOR),f=!(!n||!n.INTERRUPTED),v=gr(t,u,1+d+f),g=function(e){return i&&mr(i),new yr(!0,e)},p=function(e){return d?(hr(e),f?v(e[0],e[1],g):v(e[0],e[1])):f?v(e,g):v(e)};if(h)i=e;else{if("function"!=typeof(r=pr(e)))throw TypeError("Target is not iterable");if(fr(r)){for(a=0,o=vr(e.length);o>a;a++)if((s=p(e[a]))&&s instanceof yr)return s;return new yr(!1)}i=r.call(e)}for(l=i.next;!(c=l.call(i)).done;){try{s=p(c.value)}catch(e){throw mr(i),e}if("object"==typeof s&&s&&s instanceof yr)return s}return new yr(!1)},Xa=xr,Ga=Nr,Ja=la.set,Qa=Ea,Za=function(e,t){if(Na(e),Ia(t)&&t.constructor===e)return t;var n=Ma.f(e);return(0,n.resolve)(t),n.promise},eo=function(e,t){var n=Ta.console;n&&n.error&&(1===arguments.length?n.error(e):n.error(e,t))},to=ka,no=function(e){try{return{error:!1,value:e()}}catch(e){return{error:!0,value:e}}},io=He,ro=Ut,ao=Oa,oo=Tr,so=Sn,lo=Dn("species"),co="Promise",uo=io.get,ho=io.set,fo=io.getterFor(co),vo=za&&za.prototype,go=za,po=vo,mo=ja.TypeError,yo=ja.document,bo=ja.process,wo=to.f,So=wo,Eo=!!(yo&&yo.createEvent&&ja.dispatchEvent),ko="function"==typeof PromiseRejectionEvent,Ao="unhandledrejection",Ro=!1,xo=ro(co,(function(){var e=Ya(go)!==String(go);if(!e&&66===so)return!0;if(so>=51&&/native code/.test(go))return!1;var t=new go((function(e){e(1)})),n=function(e){e((function(){}),(function(){}))};return(t.constructor={})[lo]=n,!(Ro=t.then((function(){}))instanceof n)||!e&&ao&&!ko})),Lo=xo||!Xa((function(e){go.all(e).catch((function(){}))})),Po=function(e){var t;return!(!Wa(e)||"function"!=typeof(t=e.then))&&t},Co=function(e,t){if(!e.notified){e.notified=!0;var n=e.reactions;Qa((function(){for(var i=e.value,r=1==e.state,a=0;n.length>a;){var o,s,l,c=n[a++],u=r?c.ok:c.fail,d=c.resolve,h=c.reject,f=c.domain;try{u?(r||(2===e.rejection&&To(e),e.rejection=1),!0===u?o=i:(f&&f.enter(),o=u(i),f&&(f.exit(),l=!0)),o===c.promise?h(mo("Promise-chain cycle")):(s=Po(o))?s.call(o,d,h):d(o)):h(i)}catch(e){f&&!l&&f.exit(),h(e)}}e.reactions=[],e.notified=!1,t&&!e.rejection&&Io(e)}))}},No=function(e,t,n){var i,r;Eo?((i=yo.createEvent("Event")).promise=t,i.reason=n,i.initEvent(e,!1,!0),ja.dispatchEvent(i)):i={promise:t,reason:n},!ko&&(r=ja["on"+e])?r(i):e===Ao&&eo("Unhandled promise rejection",n)},Io=function(e){Ja.call(ja,(function(){var t,n=e.facade,i=e.value;if(Mo(e)&&(t=no((function(){oo?bo.emit("unhandledRejection",i,n):No(Ao,n,i)})),e.rejection=oo||Mo(e)?2:1,t.error))throw t.value}))},Mo=function(e){return 1!==e.rejection&&!e.parent},To=function(e){Ja.call(ja,(function(){var t=e.facade;oo?bo.emit("rejectionHandled",t):No("rejectionhandled",t,e.value)}))},Oo=function(e,t,n){return function(i){e(t,i,n)}},Do=function(e,t,n){e.done||(e.done=!0,n&&(e=n),e.value=t,e.state=2,Co(e,!0))},jo=function(e,t,n){if(!e.done){e.done=!0,n&&(e=n);try{if(e.facade===t)throw mo("Promise can't be resolved itself");var i=Po(t);i?Qa((function(){var n={done:!1};try{i.call(t,Oo(jo,n,e),Oo(Do,n,e))}catch(t){Do(n,t,e)}})):(e.value=t,e.state=1,Co(e,!1))}catch(t){Do({done:!1},t,e)}}};if(xo&&(po=(go=function(e){Ka(this,go,co),Va(e),xa.call(this);var t=uo(this);try{e(Oo(jo,t),Oo(Do,t))}catch(e){Do(t,e)}}).prototype,(xa=function(e){ho(this,{type:co,done:!1,notified:!1,parent:!1,reactions:[],rejection:!1,state:0,value:void 0})}).prototype=Ua(po,{then:function(e,t){var n=fo(this),i=wo(Ga(this,go));return i.ok="function"!=typeof e||e,i.fail="function"==typeof t&&t,i.domain=oo?bo.domain:void 0,n.parent=!0,n.reactions.push(i),0!=n.state&&Co(n,!1),i.promise},catch:function(e){return this.then(void 0,e)}}),La=function(){var e=new xa,t=uo(e);this.promise=e,this.resolve=Oo(jo,t),this.reject=Oo(Do,t)},to.f=wo=function(e){return e===go||e===Pa?new La(e):So(e)},"function"==typeof za&&vo!==Object.prototype)){Ca=vo.then,Ro||(Ha(vo,"then",(function(e,t){var n=this;return new go((function(e,t){Ca.call(n,e,t)})).then(e,t)}),{unsafe:!0}),Ha(vo,"catch",po.catch,{unsafe:!0}));try{delete vo.constructor}catch(e){}Ba&&Ba(vo,po)}Da({global:!0,wrap:!0,forced:xo},{Promise:go}),_a(go,co,!1),qa(co),Pa=Fa(co),Da({target:co,stat:!0,forced:xo},{reject:function(e){var t=wo(this);return t.reject.call(void 0,e),t.promise}}),Da({target:co,stat:!0,forced:xo},{resolve:function(e){return Za(this,e)}}),Da({target:co,stat:!0,forced:Lo},{all:function(e){var t=this,n=wo(t),i=n.resolve,r=n.reject,a=no((function(){var n=Va(t.resolve),a=[],o=0,s=1;$a(e,(function(e){var l=o++,c=!1;a.push(void 0),s++,n.call(t,e).then((function(e){c||(c=!0,a[l]=e,--s||i(a))}),r)})),--s||i(a)}));return a.error&&r(a.value),n.promise},race:function(e){var t=this,n=wo(t),i=n.reject,r=no((function(){var r=Va(t.resolve);$a(e,(function(e){r.call(t,e).then(n.resolve,i)}))}));return r.error&&i(r.value),n.promise}});var Fo=r,zo=function(e,t){var n=[][e];return!!n&&Fo((function(){n.call(null,t||function(){throw 1},1)}))},Ho=Yn.forEach,Uo=n,Bo={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0},_o=zo("forEach")?[].forEach:function(e){return Ho(this,e,arguments.length>1?arguments[1]:void 0)},qo=Q;for(var Wo in Bo){var Vo=Uo[Wo],Ko=Vo&&Vo.prototype;if(Ko&&Ko.forEach!==_o)try{qo(Ko,"forEach",_o)}catch(e){Ko.forEach=_o}}var Yo=W,$o=dr,Xo=fn,Go=A,Jo=function(e,t,n,i){try{return i?t(Yo(n)[0],n[1]):t(n)}catch(t){throw $o(e),t}},Qo=ar,Zo=at,es=ni,ts=cr,ns=function(e){var t,n,i,r,a,o,s=Go(e),l="function"==typeof this?this:Array,c=arguments.length,u=c>1?arguments[1]:void 0,d=void 0!==u,h=ts(s),f=0;if(d&&(u=Xo(u,c>2?arguments[2]:void 0,2)),null==h||l==Array&&Qo(h))for(n=new l(t=Zo(s.length));t>f;f++)o=d?u(s[f],f):s[f],es(n,f,o);else for(a=(r=h.call(s)).next,n=new l;!(i=a.call(r)).done;f++)o=d?Jo(r,u,[i.value,f],!0):i.value,es(n,f,o);return n.length=f,n};$t({target:"Array",stat:!0,forced:!xr((function(e){Array.from(e)}))},{from:ns});var is,rs,as,os=nt,ss=p,ls=function(e){return function(t,n){var i,r,a=String(ss(t)),o=os(n),s=a.length;return o<0||o>=s?e?"":void 0:(i=a.charCodeAt(o))<55296||i>56319||o+1===s||(r=a.charCodeAt(o+1))<56320||r>57343?e?a.charAt(o):i:e?a.slice(o,o+2):r-56320+(i-55296<<10)+65536}},cs={codeAt:ls(!1),charAt:ls(!0)},us=!r((function(){function e(){}return e.prototype.constructor=null,Object.getPrototypeOf(new e)!==e.prototype})),ds=L,hs=A,fs=us,vs=ke("IE_PROTO"),gs=Object.prototype,ps=fs?Object.getPrototypeOf:function(e){return e=hs(e),ds(e,vs)?e[vs]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?gs:null},ms=r,ys=ps,bs=Q,ws=L,Ss=Dn("iterator"),Es=!1;[].keys&&("next"in(as=[].keys())?(rs=ys(ys(as)))!==Object.prototype&&(is=rs):Es=!0),(null==is||ms((function(){var e={};return is[Ss].call(e)!==e})))&&(is={}),ws(is,Ss)||bs(is,Ss,(function(){return this}));var ks,As={IteratorPrototype:is,BUGGY_SAFARI_ITERATORS:Es},Rs=_,xs=W,Ls=Jt,Ps=a?Object.defineProperties:function(e,t){xs(e);for(var n,i=Ls(t),r=i.length,a=0;r>a;)Rs.f(e,n=i[a++],t[n]);return e},Cs=W,Ns=Ps,Is=wt,Ms=Ae,Ts=Ir,Os=I,Ds=ke("IE_PROTO"),js=function(){},Fs=function(e){return" + + + + + diff --git a/static/presentations/2021-11-13/garage/examples/backgrounds.html b/static/presentations/2021-11-13/garage/examples/backgrounds.html new file mode 100644 index 0000000..19d40c3 --- /dev/null +++ b/static/presentations/2021-11-13/garage/examples/backgrounds.html @@ -0,0 +1,141 @@ + + + + + + + reveal.js - Slide Backgrounds + + + + + + + + + + +
+ +
+ +
+

data-background: #00ffff

+
+ +
+

data-background: #bb00bb

+
+ +
+

data-background: lightblue

+
+ +
+
+

data-background: #ff0000

+
+
+

data-background: rgba(0, 0, 0, 0.2)

+
+
+

data-background: salmon

+
+
+ +
+
+

Background applied to stack

+
+
+

Background applied to stack

+
+
+

Background applied to slide inside of stack

+
+
+ +
+

Background image

+
+ +
+
+

Background image

+
+
+

Background image

+
+
+ +
+

Background image

+
data-background-size="100px" data-background-repeat="repeat" data-background-color="#111"
+
+ +
+

Same background twice (1/2)

+
+
+

Same background twice (2/2)

+
+ +
+

Video background

+
+ +
+

Iframe background

+
+ +
+
+

Same background twice vertical (1/2)

+
+
+

Same background twice vertical (2/2)

+
+
+ +
+

Same background from horizontal to vertical (1/3)

+
+
+
+

Same background from horizontal to vertical (2/3)

+
+
+

Same background from horizontal to vertical (3/3)

+
+
+ +
+ +
+ + + + + + diff --git a/static/presentations/2021-11-13/garage/examples/barebones.html b/static/presentations/2021-11-13/garage/examples/barebones.html new file mode 100644 index 0000000..50adcb8 --- /dev/null +++ b/static/presentations/2021-11-13/garage/examples/barebones.html @@ -0,0 +1,32 @@ + + + + + reveal.js - Barebones + + + + +
+
+ +
+

Barebones Presentation

+

This example contains the bare minimum includes and markup required to run a reveal.js presentation.

+
+ +
+

No Theme

+

There's no theme included, so it will fall back on browser defaults.

+
+ +
+
+ + + + + + diff --git a/static/presentations/2021-11-13/garage/examples/layout-helpers.html b/static/presentations/2021-11-13/garage/examples/layout-helpers.html new file mode 100644 index 0000000..a129811 --- /dev/null +++ b/static/presentations/2021-11-13/garage/examples/layout-helpers.html @@ -0,0 +1,160 @@ + + + + + + + reveal.js - Layout Helpers + + + + + + + + + + +
+ +
+ +
+

Layout Helper Examples

+ +
+ +
+

Fit Text

+

Resizes text to be as large as possible within its container.

+

+					  

FIT

+
+
+ +
+

FIT

+
+ +
+

HELLO WORLD

+

BOTH THESE TITLES USE FIT-TEXT

+
+ +
+

Stretch

+

Makes an element as tall as possible while remaining within the slide bounds.

+

+					  

Stretch Example

+ +

Image byline

+
+
+ +
+

Stretch Example

+ +

Image byline

+
+ +
+

Stack

+

Stacks multiple elements on top of each other, for use with fragments.

+

+					  
+ <img class="fragment" width="450" height="300" src="..."> + <img class="fragment" width="300" height="450" src="..."> + <img class="fragment" width="400" height="400" src="..."> +
+
+
+ +
+

Stack Example

+
+

One

+

Two

+

Three

+

Four

+
+
+ + + +
+
+ +
+

Stack Example

+

fade-in-then-out fragments

+
+ + + +
+
+ +
+

HStack

+

Stacks multiple elements horizontally.

+

+					  
+ <img width="450" height="300" src="..."> + <img width="300" height="450" src="..."> + <img width="400" height="400" src="..."> +
+
+
+ +
+

HStack Example

+
+

One

+

Two

+

Three

+
+
+ +
+

VStack

+

Stacks multiple elements vertically.

+

+					  
+ <img width="450" height="300" src="..."> + <img width="300" height="450" src="..."> + <img width="400" height="400" src="..."> +
+
+
+ +
+

VStack Example

+
+

One

+

Two

+

Three

+
+
+ +
+ +
+ + + + + + + diff --git a/static/presentations/2021-11-13/garage/examples/markdown.html b/static/presentations/2021-11-13/garage/examples/markdown.html new file mode 100644 index 0000000..e7294bc --- /dev/null +++ b/static/presentations/2021-11-13/garage/examples/markdown.html @@ -0,0 +1,142 @@ + + + + + + + reveal.js - Markdown Example + + + + + + + + + +
+ +
+ + +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ ## The Lorenz Equations + `\[\begin{aligned} + \dot{x} & = \sigma(y-x) \\ + \dot{y} & = \rho x - y - xz \\ + \dot{z} & = -\beta z + xy + \end{aligned} \]` +
+ +
+
+ + + + + + + + + + + diff --git a/static/presentations/2021-11-13/garage/examples/markdown.md b/static/presentations/2021-11-13/garage/examples/markdown.md new file mode 100644 index 0000000..1315172 --- /dev/null +++ b/static/presentations/2021-11-13/garage/examples/markdown.md @@ -0,0 +1,41 @@ +# Markdown Demo + + + +## External 1.1 + +Content 1.1 + +Note: This will only appear in the speaker notes window. + + +## External 1.2 + +Content 1.2 + + + +## External 2 + +Content 2.1 + + + +## External 3.1 + +Content 3.1 + + +## External 3.2 + +Content 3.2 + + +## External 3.3 (Image) + +![External Image](https://s3.amazonaws.com/static.slid.es/logo/v2/slides-symbol-512x512.png) + + +## External 3.4 (Math) + +`\[ J(\theta_0,\theta_1) = \sum_{i=0} \]` diff --git a/static/presentations/2021-11-13/garage/examples/math.html b/static/presentations/2021-11-13/garage/examples/math.html new file mode 100644 index 0000000..bd2e75a --- /dev/null +++ b/static/presentations/2021-11-13/garage/examples/math.html @@ -0,0 +1,206 @@ + + + + + + + reveal.js - Math Plugin + + + + + + + + + +
+ +
+ +
+

reveal.js Math Plugin

+

Render math with KaTeX, MathJax 2 or MathJax 3

+
+ +
+

The Lorenz Equations

+ + \[\begin{aligned} + \dot{x} & = \sigma(y-x) \\ + \dot{y} & = \rho x - y - xz \\ + \dot{z} & = -\beta z + xy + \end{aligned} \] +
+ +
+

The Cauchy-Schwarz Inequality

+ + +
+ +
+

A Cross Product Formula

+ + \[\mathbf{V}_1 \times \mathbf{V}_2 = \begin{vmatrix} + \mathbf{i} & \mathbf{j} & \mathbf{k} \\ + \frac{\partial X}{\partial u} & \frac{\partial Y}{\partial u} & 0 \\ + \frac{\partial X}{\partial v} & \frac{\partial Y}{\partial v} & 0 + \end{vmatrix} \] +
+ +
+

The probability of getting \(k\) heads when flipping \(n\) coins is

+ + \[P(E) = {n \choose k} p^k (1-p)^{ n-k} \] +
+ +
+

An Identity of Ramanujan

+ + \[ \frac{1}{\Bigl(\sqrt{\phi \sqrt{5}}-\phi\Bigr) e^{\frac25 \pi}} = + 1+\frac{e^{-2\pi}} {1+\frac{e^{-4\pi}} {1+\frac{e^{-6\pi}} + {1+\frac{e^{-8\pi}} {1+\ldots} } } } \] +
+ +
+

A Rogers-Ramanujan Identity

+ + \[ 1 + \frac{q^2}{(1-q)}+\frac{q^6}{(1-q)(1-q^2)}+\cdots = + \prod_{j=0}^{\infty}\frac{1}{(1-q^{5j+2})(1-q^{5j+3})}\] +
+ +
+

Maxwell’s Equations

+ + \[ \begin{aligned} + \nabla \times \vec{\mathbf{B}} -\, \frac1c\, \frac{\partial\vec{\mathbf{E}}}{\partial t} & = \frac{4\pi}{c}\vec{\mathbf{j}} \\ \nabla \cdot \vec{\mathbf{E}} & = 4 \pi \rho \\ + \nabla \times \vec{\mathbf{E}}\, +\, \frac1c\, \frac{\partial\vec{\mathbf{B}}}{\partial t} & = \vec{\mathbf{0}} \\ + \nabla \cdot \vec{\mathbf{B}} & = 0 \end{aligned} + \] +
+ +
+

TeX Macros

+ + Here is a common vector space: + \[L^2(\R) = \set{u : \R \to \R}{\int_\R |u|^2 < +\infty}\] + used in functional analysis. +
+ +
+
+

The Lorenz Equations

+ +
+ \[\begin{aligned} + \dot{x} & = \sigma(y-x) \\ + \dot{y} & = \rho x - y - xz \\ + \dot{z} & = -\beta z + xy + \end{aligned} \] +
+
+ +
+

The Cauchy-Schwarz Inequality

+ +
+ \[ \left( \sum_{k=1}^n a_k b_k \right)^2 \leq \left( \sum_{k=1}^n a_k^2 \right) \left( \sum_{k=1}^n b_k^2 \right) \] +
+
+ +
+

A Cross Product Formula

+ +
+ \[\mathbf{V}_1 \times \mathbf{V}_2 = \begin{vmatrix} + \mathbf{i} & \mathbf{j} & \mathbf{k} \\ + \frac{\partial X}{\partial u} & \frac{\partial Y}{\partial u} & 0 \\ + \frac{\partial X}{\partial v} & \frac{\partial Y}{\partial v} & 0 + \end{vmatrix} \] +
+
+ +
+

The probability of getting \(k\) heads when flipping \(n\) coins is

+ +
+ \[P(E) = {n \choose k} p^k (1-p)^{ n-k} \] +
+
+ +
+

An Identity of Ramanujan

+ +
+ \[ \frac{1}{\Bigl(\sqrt{\phi \sqrt{5}}-\phi\Bigr) e^{\frac25 \pi}} = + 1+\frac{e^{-2\pi}} {1+\frac{e^{-4\pi}} {1+\frac{e^{-6\pi}} + {1+\frac{e^{-8\pi}} {1+\ldots} } } } \] +
+
+ +
+

A Rogers-Ramanujan Identity

+ +
+ \[ 1 + \frac{q^2}{(1-q)}+\frac{q^6}{(1-q)(1-q^2)}+\cdots = + \prod_{j=0}^{\infty}\frac{1}{(1-q^{5j+2})(1-q^{5j+3})}\] +
+
+ +
+

Maxwell’s Equations

+ +
+ \[ \begin{aligned} + \nabla \times \vec{\mathbf{B}} -\, \frac1c\, \frac{\partial\vec{\mathbf{E}}}{\partial t} & = \frac{4\pi}{c}\vec{\mathbf{j}} \\ \nabla \cdot \vec{\mathbf{E}} & = 4 \pi \rho \\ + \nabla \times \vec{\mathbf{E}}\, +\, \frac1c\, \frac{\partial\vec{\mathbf{B}}}{\partial t} & = \vec{\mathbf{0}} \\ + \nabla \cdot \vec{\mathbf{B}} & = 0 \end{aligned} + \] +
+
+ +
+

TeX Macros

+ + Here is a common vector space: + \[L^2(\R) = \set{u : \R \to \R}{\int_\R |u|^2 < +\infty}\] + used in functional analysis. +
+
+ +
+ +
+ + + + + + + diff --git a/static/presentations/2021-11-13/garage/examples/media.html b/static/presentations/2021-11-13/garage/examples/media.html new file mode 100644 index 0000000..388208f --- /dev/null +++ b/static/presentations/2021-11-13/garage/examples/media.html @@ -0,0 +1,75 @@ + + + + + + + reveal.js - Video, Audio and Iframes + + + + + + + + + +
+ +
+ +
+

Examples of embedded Video, Audio and Iframes

+
+ +
+

Iframe

+ +
+ +
+

Iframe Background

+
+ +
+

Video

+ +
+ +
+

Background Video

+
+ +
+

Auto-playing audio

+ +
+ +
+

Audio inside slide fragments

+
+ Beep 1 + +
+
+ Beep 2 + +
+
+ +
+

Audio with controls

+ +
+ +
+ +
+ + + + + + diff --git a/static/presentations/2021-11-13/garage/examples/multiple-presentations.html b/static/presentations/2021-11-13/garage/examples/multiple-presentations.html new file mode 100644 index 0000000..e5347d4 --- /dev/null +++ b/static/presentations/2021-11-13/garage/examples/multiple-presentations.html @@ -0,0 +1,102 @@ + + + + + + + reveal.js - Multiple Presentations + + + + + + + + + + +
+
+
+
Deck 1, Slide 1
+
Deck 1, Slide 2
+
+

+							import React, { useState } from 'react';
+							function Example() {
+							  const [count, setCount] = useState(0);
+							}
+						
+
+
+
+ +
+
+
Deck 2, Slide 1
+
Deck 2, Slide 2
+
+ +
+
+

The Lorenz Equations

+ + \[\begin{aligned} + \dot{x} & = \sigma(y-x) \\ + \dot{y} & = \rho x - y - xz \\ + \dot{z} & = -\beta z + xy + \end{aligned} \] +
+
+
+
+ + + + + + + + + + + diff --git a/static/presentations/2021-11-13/garage/examples/transitions.html b/static/presentations/2021-11-13/garage/examples/transitions.html new file mode 100644 index 0000000..adbfd15 --- /dev/null +++ b/static/presentations/2021-11-13/garage/examples/transitions.html @@ -0,0 +1,97 @@ + + + + + + + reveal.js - Slide Transitions + + + + + + + + +
+ +
+ +
+

Default

+
+ +
+

Default

+
+ +
+

data-transition: zoom

+
+ +
+

data-transition: zoom-in fade-out

+
+ +
+

Default

+
+ +
+

data-transition: convex

+
+ +
+

data-transition: convex-in concave-out

+
+ +
+
+

Default

+
+
+

data-transition: concave

+
+
+

data-transition: convex-in fade-out

+
+
+

Default

+
+
+ +
+

data-transition: none

+
+ +
+

Default

+
+ +
+ +
+ + + + + + diff --git a/static/presentations/2021-11-13/garage/gulpfile.js b/static/presentations/2021-11-13/garage/gulpfile.js new file mode 100644 index 0000000..4321b72 --- /dev/null +++ b/static/presentations/2021-11-13/garage/gulpfile.js @@ -0,0 +1,314 @@ +const pkg = require('./package.json') +const path = require('path') +const glob = require('glob') +const yargs = require('yargs') +const colors = require('colors') +const through = require('through2'); +const qunit = require('node-qunit-puppeteer') + +const {rollup} = require('rollup') +const {terser} = require('rollup-plugin-terser') +const babel = require('@rollup/plugin-babel').default +const commonjs = require('@rollup/plugin-commonjs') +const resolve = require('@rollup/plugin-node-resolve').default +const sass = require('sass') + +const gulp = require('gulp') +const tap = require('gulp-tap') +const zip = require('gulp-zip') +const header = require('gulp-header') +const eslint = require('gulp-eslint') +const minify = require('gulp-clean-css') +const connect = require('gulp-connect') +const autoprefixer = require('gulp-autoprefixer') + +const root = yargs.argv.root || '.' +const port = yargs.argv.port || 8000 + +const banner = `/*! +* reveal.js ${pkg.version} +* ${pkg.homepage} +* MIT licensed +* +* Copyright (C) 2011-2021 Hakim El Hattab, https://hakim.se +*/\n` + +// Prevents warnings from opening too many test pages +process.setMaxListeners(20); + +const babelConfig = { + babelHelpers: 'bundled', + ignore: ['node_modules'], + compact: false, + extensions: ['.js', '.html'], + plugins: [ + 'transform-html-import-to-string' + ], + presets: [[ + '@babel/preset-env', + { + corejs: 3, + useBuiltIns: 'usage', + modules: false + } + ]] +}; + +// Our ES module bundle only targets newer browsers with +// module support. Browsers are targeted explicitly instead +// of using the "esmodule: true" target since that leads to +// polyfilling older browsers and a larger bundle. +const babelConfigESM = JSON.parse( JSON.stringify( babelConfig ) ); +babelConfigESM.presets[0][1].targets = { browsers: [ + 'last 2 Chrome versions', + 'last 2 Safari versions', + 'last 2 iOS versions', + 'last 2 Firefox versions', + 'last 2 Edge versions', +] }; + +let cache = {}; + +// Creates a bundle with broad browser support, exposed +// as UMD +gulp.task('js-es5', () => { + return rollup({ + cache: cache.umd, + input: 'js/index.js', + plugins: [ + resolve(), + commonjs(), + babel( babelConfig ), + terser() + ] + }).then( bundle => { + cache.umd = bundle.cache; + return bundle.write({ + name: 'Reveal', + file: './dist/reveal.js', + format: 'umd', + banner: banner, + sourcemap: true + }); + }); +}) + +// Creates an ES module bundle +gulp.task('js-es6', () => { + return rollup({ + cache: cache.esm, + input: 'js/index.js', + plugins: [ + resolve(), + commonjs(), + babel( babelConfigESM ), + terser() + ] + }).then( bundle => { + cache.esm = bundle.cache; + return bundle.write({ + file: './dist/reveal.esm.js', + format: 'es', + banner: banner, + sourcemap: true + }); + }); +}) +gulp.task('js', gulp.parallel('js-es5', 'js-es6')); + +// Creates a UMD and ES module bundle for each of our +// built-in plugins +gulp.task('plugins', () => { + return Promise.all([ + { name: 'RevealHighlight', input: './plugin/highlight/plugin.js', output: './plugin/highlight/highlight' }, + { name: 'RevealMarkdown', input: './plugin/markdown/plugin.js', output: './plugin/markdown/markdown' }, + { name: 'RevealSearch', input: './plugin/search/plugin.js', output: './plugin/search/search' }, + { name: 'RevealNotes', input: './plugin/notes/plugin.js', output: './plugin/notes/notes' }, + { name: 'RevealZoom', input: './plugin/zoom/plugin.js', output: './plugin/zoom/zoom' }, + { name: 'RevealMath', input: './plugin/math/plugin.js', output: './plugin/math/math' }, + ].map( plugin => { + return rollup({ + cache: cache[plugin.input], + input: plugin.input, + plugins: [ + resolve(), + commonjs(), + babel({ + ...babelConfig, + ignore: [/node_modules\/(?!(highlight\.js|marked)\/).*/], + }), + terser() + ] + }).then( bundle => { + cache[plugin.input] = bundle.cache; + bundle.write({ + file: plugin.output + '.esm.js', + name: plugin.name, + format: 'es' + }) + + bundle.write({ + file: plugin.output + '.js', + name: plugin.name, + format: 'umd' + }) + }); + } )); +}) + +// a custom pipeable step to transform Sass to CSS +function compileSass() { + return through.obj( ( vinylFile, encoding, callback ) => { + const transformedFile = vinylFile.clone(); + + sass.render({ + data: transformedFile.contents.toString(), + includePaths: ['css/', 'css/theme/template'] + }, ( err, result ) => { + if( err ) { + console.log( vinylFile.path ); + console.log( err.formatted ); + } + else { + transformedFile.extname = '.css'; + transformedFile.contents = result.css; + callback( null, transformedFile ); + } + }); + }); +} + +gulp.task('css-themes', () => gulp.src(['./css/theme/source/*.{sass,scss}']) + .pipe(compileSass()) + .pipe(gulp.dest('./dist/theme'))) + +gulp.task('css-core', () => gulp.src(['css/reveal.scss']) + .pipe(compileSass()) + .pipe(autoprefixer()) + .pipe(minify({compatibility: 'ie9'})) + .pipe(header(banner)) + .pipe(gulp.dest('./dist'))) + +gulp.task('css', gulp.parallel('css-themes', 'css-core')) + +gulp.task('qunit', () => { + + let serverConfig = { + root, + port: 8009, + host: 'localhost', + name: 'test-server' + } + + let server = connect.server( serverConfig ) + + let testFiles = glob.sync('test/*.html' ) + + let totalTests = 0; + let failingTests = 0; + + let tests = Promise.all( testFiles.map( filename => { + return new Promise( ( resolve, reject ) => { + qunit.runQunitPuppeteer({ + targetUrl: `http://${serverConfig.host}:${serverConfig.port}/${filename}`, + timeout: 20000, + redirectConsole: false, + puppeteerArgs: ['--allow-file-access-from-files'] + }) + .then(result => { + if( result.stats.failed > 0 ) { + console.log(`${'!'} ${filename} [${result.stats.passed}/${result.stats.total}] in ${result.stats.runtime}ms`.red); + // qunit.printResultSummary(result, console); + qunit.printFailedTests(result, console); + } + else { + console.log(`${'✔'} ${filename} [${result.stats.passed}/${result.stats.total}] in ${result.stats.runtime}ms`.green); + } + + totalTests += result.stats.total; + failingTests += result.stats.failed; + + resolve(); + }) + .catch(error => { + console.error(error); + reject(); + }); + } ) + } ) ); + + return new Promise( ( resolve, reject ) => { + + tests.then( () => { + if( failingTests > 0 ) { + reject( new Error(`${failingTests}/${totalTests} tests failed`.red) ); + } + else { + console.log(`${'✔'} Passed ${totalTests} tests`.green.bold); + resolve(); + } + } ) + .catch( () => { + reject(); + } ) + .finally( () => { + server.close(); + } ); + + } ); +} ) + +gulp.task('eslint', () => gulp.src(['./js/**', 'gulpfile.js']) + .pipe(eslint()) + .pipe(eslint.format())) + +gulp.task('test', gulp.series( 'eslint', 'qunit' )) + +gulp.task('default', gulp.series(gulp.parallel('js', 'css', 'plugins'), 'test')) + +gulp.task('build', gulp.parallel('js', 'css', 'plugins')) + +gulp.task('package', gulp.series('default', () => + + gulp.src([ + './index.html', + './dist/**', + './lib/**', + './images/**', + './plugin/**', + './**.md' + ]).pipe(zip('reveal-js-presentation.zip')).pipe(gulp.dest('./')) + +)) + +gulp.task('reload', () => gulp.src(['*.html', '*.md']) + .pipe(connect.reload())); + +gulp.task('serve', () => { + + connect.server({ + root: root, + port: port, + host: 'localhost', + livereload: true + }) + + gulp.watch(['*.html', '*.md'], gulp.series('reload')) + + gulp.watch(['js/**'], gulp.series('js', 'reload', 'eslint')) + + gulp.watch(['plugin/**/plugin.js'], gulp.series('plugins', 'reload')) + + gulp.watch([ + 'css/theme/source/*.{sass,scss}', + 'css/theme/template/*.{sass,scss}', + ], gulp.series('css-themes', 'reload')) + + gulp.watch([ + 'css/*.scss', + 'css/print/*.{sass,scss,css}' + ], gulp.series('css-core', 'reload')) + + gulp.watch(['test/*.html'], gulp.series('test')) + +}) \ No newline at end of file diff --git a/static/presentations/2021-11-13/garage/image/integrations.png b/static/presentations/2021-11-13/garage/image/integrations.png new file mode 100644 index 0000000000000000000000000000000000000000..b1aac280ce2a2f114ea95e080aba034207837448 GIT binary patch literal 166939 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

O#!GC+2@l4f4wCh!WzAEeS3*pdYE3z9-}rn;!p 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

CA@@A6!2N6uxHM>7*7idvrRS3u*w~j*|(< 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 literal 0 HcmV?d00001 diff --git a/static/presentations/2021-11-13/garage/index.html b/static/presentations/2021-11-13/garage/index.html new file mode 100644 index 0000000..50e6704 --- /dev/null +++ b/static/presentations/2021-11-13/garage/index.html @@ -0,0 +1,76 @@ + + + + + + + reveal.js + + + + + + + + + +

+
+
+

Garage

+

Mille et une façons de stocker vos données

+
+
+

Configuration en 5 minutes

+ +
+
+

Déployez votre site statique

+ +
+
+

Faites vos sauvegardes

+ +
+
+

Passez le stockage de Nextcloud à l'échelle

+ +
+
+

Déchargez Peertube

+ +
+
+

Merci pour votre attention

+ +
+
+
+ + + + + + + + diff --git a/static/presentations/2021-11-13/garage/js/components/playback.js b/static/presentations/2021-11-13/garage/js/components/playback.js new file mode 100644 index 0000000..06fa7ba --- /dev/null +++ b/static/presentations/2021-11-13/garage/js/components/playback.js @@ -0,0 +1,165 @@ +/** + * UI component that lets the use control auto-slide + * playback via play/pause. + */ +export default class Playback { + + /** + * @param {HTMLElement} container The component will append + * itself to this + * @param {function} progressCheck A method which will be + * called frequently to get the current playback progress on + * a range of 0-1 + */ + constructor( container, progressCheck ) { + + // Cosmetics + this.diameter = 100; + this.diameter2 = this.diameter/2; + this.thickness = 6; + + // Flags if we are currently playing + this.playing = false; + + // Current progress on a 0-1 range + this.progress = 0; + + // Used to loop the animation smoothly + this.progressOffset = 1; + + this.container = container; + this.progressCheck = progressCheck; + + this.canvas = document.createElement( 'canvas' ); + this.canvas.className = 'playback'; + this.canvas.width = this.diameter; + this.canvas.height = this.diameter; + this.canvas.style.width = this.diameter2 + 'px'; + this.canvas.style.height = this.diameter2 + 'px'; + this.context = this.canvas.getContext( '2d' ); + + this.container.appendChild( this.canvas ); + + this.render(); + + } + + setPlaying( value ) { + + const wasPlaying = this.playing; + + this.playing = value; + + // Start repainting if we weren't already + if( !wasPlaying && this.playing ) { + this.animate(); + } + else { + this.render(); + } + + } + + animate() { + + const progressBefore = this.progress; + + this.progress = this.progressCheck(); + + // When we loop, offset the progress so that it eases + // smoothly rather than immediately resetting + if( progressBefore > 0.8 && this.progress < 0.2 ) { + this.progressOffset = this.progress; + } + + this.render(); + + if( this.playing ) { + requestAnimationFrame( this.animate.bind( this ) ); + } + + } + + /** + * Renders the current progress and playback state. + */ + render() { + + let progress = this.playing ? this.progress : 0, + radius = ( this.diameter2 ) - this.thickness, + x = this.diameter2, + y = this.diameter2, + iconSize = 28; + + // Ease towards 1 + this.progressOffset += ( 1 - this.progressOffset ) * 0.1; + + const endAngle = ( - Math.PI / 2 ) + ( progress * ( Math.PI * 2 ) ); + const startAngle = ( - Math.PI / 2 ) + ( this.progressOffset * ( Math.PI * 2 ) ); + + this.context.save(); + this.context.clearRect( 0, 0, this.diameter, this.diameter ); + + // Solid background color + this.context.beginPath(); + this.context.arc( x, y, radius + 4, 0, Math.PI * 2, false ); + this.context.fillStyle = 'rgba( 0, 0, 0, 0.4 )'; + this.context.fill(); + + // Draw progress track + this.context.beginPath(); + this.context.arc( x, y, radius, 0, Math.PI * 2, false ); + this.context.lineWidth = this.thickness; + this.context.strokeStyle = 'rgba( 255, 255, 255, 0.2 )'; + this.context.stroke(); + + if( this.playing ) { + // Draw progress on top of track + this.context.beginPath(); + this.context.arc( x, y, radius, startAngle, endAngle, false ); + this.context.lineWidth = this.thickness; + this.context.strokeStyle = '#fff'; + this.context.stroke(); + } + + this.context.translate( x - ( iconSize / 2 ), y - ( iconSize / 2 ) ); + + // Draw play/pause icons + if( this.playing ) { + this.context.fillStyle = '#fff'; + this.context.fillRect( 0, 0, iconSize / 2 - 4, iconSize ); + this.context.fillRect( iconSize / 2 + 4, 0, iconSize / 2 - 4, iconSize ); + } + else { + this.context.beginPath(); + this.context.translate( 4, 0 ); + this.context.moveTo( 0, 0 ); + this.context.lineTo( iconSize - 4, iconSize / 2 ); + this.context.lineTo( 0, iconSize ); + this.context.fillStyle = '#fff'; + this.context.fill(); + } + + this.context.restore(); + + } + + on( type, listener ) { + this.canvas.addEventListener( type, listener, false ); + } + + off( type, listener ) { + this.canvas.removeEventListener( type, listener, false ); + } + + destroy() { + + this.playing = false; + + if( this.canvas.parentNode ) { + this.container.removeChild( this.canvas ); + } + + } + +} \ No newline at end of file diff --git a/static/presentations/2021-11-13/garage/js/config.js b/static/presentations/2021-11-13/garage/js/config.js new file mode 100644 index 0000000..77da305 --- /dev/null +++ b/static/presentations/2021-11-13/garage/js/config.js @@ -0,0 +1,293 @@ +/** + * 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, + + // Flags if we should monitor the hash and change slides accordingly + respondToHashChanges: true, + + // 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 + // + // If you set this to 'focused', we will only capture keyboard events + // for embedded decks when they are in focus + keyboardCondition: null, + + // Disables the default reveal.js slide layout (scaling and centering) + // so that you can use custom CSS layout + disableLayout: false, + + // Enable the slide overview mode + overview: true, + + // 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: true, + + // 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, + + // Flags if slides with data-visibility="hidden" should be kep visible + showHiddenSlides: false, + + // Global override for autoplaying 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: [], + + // Plugin objects to register and use for this presentation + plugins: [] + +} \ No newline at end of file diff --git a/static/presentations/2021-11-13/garage/js/controllers/autoanimate.js b/static/presentations/2021-11-13/garage/js/controllers/autoanimate.js new file mode 100644 index 0000000..60c02e5 --- /dev/null +++ b/static/presentations/2021-11-13/garage/js/controllers/autoanimate.js @@ -0,0 +1,626 @@ +import { queryAll, extend, createStyleSheet, matches, closest } from '../utils/util.js' +import { FRAGMENT_STYLE_REGEX } from '../utils/constants.js' + +// Counter used to generate unique IDs for auto-animated elements +let autoAnimateCounter = 0; + +/** + * Automatically animates matching elements across + * slides with the [data-auto-animate] attribute. + */ +export default class AutoAnimate { + + constructor( Reveal ) { + + this.Reveal = Reveal; + + } + + /** + * Runs an auto-animation between the given slides. + * + * @param {HTMLElement} fromSlide + * @param {HTMLElement} toSlide + */ + run( fromSlide, toSlide ) { + + // Clean up after prior animations + this.reset(); + + let allSlides = this.Reveal.getSlides(); + let toSlideIndex = allSlides.indexOf( toSlide ); + let fromSlideIndex = allSlides.indexOf( fromSlide ); + + // Ensure that both slides are auto-animate targets with the same data-auto-animate-id value + // (including null if absent on both) and that data-auto-animate-restart isn't set on the + // physically latter slide (independent of slide direction) + if( fromSlide.hasAttribute( 'data-auto-animate' ) && toSlide.hasAttribute( 'data-auto-animate' ) + && fromSlide.getAttribute( 'data-auto-animate-id' ) === toSlide.getAttribute( 'data-auto-animate-id' ) + && !( toSlideIndex > fromSlideIndex ? toSlide : fromSlide ).hasAttribute( 'data-auto-animate-restart' ) ) { + + // Create a new auto-animate sheet + this.autoAnimateStyleSheet = this.autoAnimateStyleSheet || createStyleSheet(); + + let animationOptions = this.getAutoAnimateOptions( toSlide ); + + // Set our starting state + fromSlide.dataset.autoAnimate = 'pending'; + toSlide.dataset.autoAnimate = 'pending'; + + // Flag the navigation direction, needed for fragment buildup + animationOptions.slideDirection = toSlideIndex > fromSlideIndex ? 'forward' : 'backward'; + + // Inject our auto-animate styles for this transition + let css = this.getAutoAnimatableElements( fromSlide, toSlide ).map( elements => { + return this.autoAnimateElements( elements.from, elements.to, elements.options || {}, animationOptions, autoAnimateCounter++ ); + } ); + + // Animate unmatched elements, if enabled + if( toSlide.dataset.autoAnimateUnmatched !== 'false' && this.Reveal.getConfig().autoAnimateUnmatched === true ) { + + // Our default timings for unmatched elements + let defaultUnmatchedDuration = animationOptions.duration * 0.8, + defaultUnmatchedDelay = animationOptions.duration * 0.2; + + this.getUnmatchedAutoAnimateElements( toSlide ).forEach( unmatchedElement => { + + let unmatchedOptions = this.getAutoAnimateOptions( unmatchedElement, animationOptions ); + let id = 'unmatched'; + + // If there is a duration or delay set specifically for this + // element our unmatched elements should adhere to those + if( unmatchedOptions.duration !== animationOptions.duration || unmatchedOptions.delay !== animationOptions.delay ) { + id = 'unmatched-' + autoAnimateCounter++; + css.push( `[data-auto-animate="running"] [data-auto-animate-target="${id}"] { transition: opacity ${unmatchedOptions.duration}s ease ${unmatchedOptions.delay}s; }` ); + } + + unmatchedElement.dataset.autoAnimateTarget = id; + + }, this ); + + // Our default transition for unmatched elements + css.push( `[data-auto-animate="running"] [data-auto-animate-target="unmatched"] { transition: opacity ${defaultUnmatchedDuration}s ease ${defaultUnmatchedDelay}s; }` ); + + } + + // Setting the whole chunk of CSS at once is the most + // efficient way to do this. Using sheet.insertRule + // is multiple factors slower. + this.autoAnimateStyleSheet.innerHTML = css.join( '' ); + + // Start the animation next cycle + requestAnimationFrame( () => { + if( this.autoAnimateStyleSheet ) { + // This forces our newly injected styles to be applied in Firefox + getComputedStyle( this.autoAnimateStyleSheet ).fontWeight; + + toSlide.dataset.autoAnimate = 'running'; + } + } ); + + this.Reveal.dispatchEvent({ + type: 'autoanimate', + data: { + fromSlide, + toSlide, + sheet: this.autoAnimateStyleSheet + } + }); + + } + + } + + /** + * Rolls back all changes that we've made to the DOM so + * that as part of animating. + */ + reset() { + + // Reset slides + queryAll( this.Reveal.getRevealElement(), '[data-auto-animate]:not([data-auto-animate=""])' ).forEach( element => { + element.dataset.autoAnimate = ''; + } ); + + // Reset elements + queryAll( this.Reveal.getRevealElement(), '[data-auto-animate-target]' ).forEach( element => { + delete element.dataset.autoAnimateTarget; + } ); + + // Remove the animation sheet + if( this.autoAnimateStyleSheet && this.autoAnimateStyleSheet.parentNode ) { + this.autoAnimateStyleSheet.parentNode.removeChild( this.autoAnimateStyleSheet ); + this.autoAnimateStyleSheet = null; + } + + } + + /** + * Creates a FLIP animation where the `to` element starts out + * in the `from` element position and animates to its original + * state. + * + * @param {HTMLElement} from + * @param {HTMLElement} to + * @param {Object} elementOptions Options for this element pair + * @param {Object} animationOptions Options set at the slide level + * @param {String} id Unique ID that we can use to identify this + * auto-animate element in the DOM + */ + autoAnimateElements( from, to, elementOptions, animationOptions, id ) { + + // 'from' elements are given a data-auto-animate-target with no value, + // 'to' elements are are given a data-auto-animate-target with an ID + from.dataset.autoAnimateTarget = ''; + to.dataset.autoAnimateTarget = id; + + // Each element may override any of the auto-animate options + // like transition easing, duration and delay via data-attributes + let options = this.getAutoAnimateOptions( to, animationOptions ); + + // If we're using a custom element matcher the element options + // may contain additional transition overrides + if( typeof elementOptions.delay !== 'undefined' ) options.delay = elementOptions.delay; + if( typeof elementOptions.duration !== 'undefined' ) options.duration = elementOptions.duration; + if( typeof elementOptions.easing !== 'undefined' ) options.easing = elementOptions.easing; + + let fromProps = this.getAutoAnimatableProperties( 'from', from, elementOptions ), + toProps = this.getAutoAnimatableProperties( 'to', to, elementOptions ); + + // Maintain fragment visibility for matching elements when + // we're navigating forwards, this way the viewer won't need + // to step through the same fragments twice + if( to.classList.contains( 'fragment' ) ) { + + // Don't auto-animate the opacity of fragments to avoid + // conflicts with fragment animations + delete toProps.styles['opacity']; + + if( from.classList.contains( 'fragment' ) ) { + + let fromFragmentStyle = ( from.className.match( FRAGMENT_STYLE_REGEX ) || [''] )[0]; + let toFragmentStyle = ( to.className.match( FRAGMENT_STYLE_REGEX ) || [''] )[0]; + + // Only skip the fragment if the fragment animation style + // remains unchanged + if( fromFragmentStyle === toFragmentStyle && animationOptions.slideDirection === 'forward' ) { + to.classList.add( 'visible', 'disabled' ); + } + + } + + } + + // If translation and/or scaling are enabled, css transform + // the 'to' element so that it matches the position and size + // of the 'from' element + if( elementOptions.translate !== false || elementOptions.scale !== false ) { + + let presentationScale = this.Reveal.getScale(); + + let delta = { + x: ( fromProps.x - toProps.x ) / presentationScale, + y: ( fromProps.y - toProps.y ) / presentationScale, + scaleX: fromProps.width / toProps.width, + scaleY: fromProps.height / toProps.height + }; + + // Limit decimal points to avoid 0.0001px blur and stutter + delta.x = Math.round( delta.x * 1000 ) / 1000; + delta.y = Math.round( delta.y * 1000 ) / 1000; + delta.scaleX = Math.round( delta.scaleX * 1000 ) / 1000; + delta.scaleX = Math.round( delta.scaleX * 1000 ) / 1000; + + let translate = elementOptions.translate !== false && ( delta.x !== 0 || delta.y !== 0 ), + scale = elementOptions.scale !== false && ( delta.scaleX !== 0 || delta.scaleY !== 0 ); + + // No need to transform if nothing's changed + if( translate || scale ) { + + let transform = []; + + if( translate ) transform.push( `translate(${delta.x}px, ${delta.y}px)` ); + if( scale ) transform.push( `scale(${delta.scaleX}, ${delta.scaleY})` ); + + fromProps.styles['transform'] = transform.join( ' ' ); + fromProps.styles['transform-origin'] = 'top left'; + + toProps.styles['transform'] = 'none'; + + } + + } + + // Delete all unchanged 'to' styles + for( let propertyName in toProps.styles ) { + const toValue = toProps.styles[propertyName]; + const fromValue = fromProps.styles[propertyName]; + + if( toValue === fromValue ) { + delete toProps.styles[propertyName]; + } + else { + // If these property values were set via a custom matcher providing + // an explicit 'from' and/or 'to' value, we always inject those values. + if( toValue.explicitValue === true ) { + toProps.styles[propertyName] = toValue.value; + } + + if( fromValue.explicitValue === true ) { + fromProps.styles[propertyName] = fromValue.value; + } + } + } + + let css = ''; + + let toStyleProperties = Object.keys( toProps.styles ); + + // Only create animate this element IF at least one style + // property has changed + if( toStyleProperties.length > 0 ) { + + // Instantly move to the 'from' state + fromProps.styles['transition'] = 'none'; + + // Animate towards the 'to' state + toProps.styles['transition'] = `all ${options.duration}s ${options.easing} ${options.delay}s`; + toProps.styles['transition-property'] = toStyleProperties.join( ', ' ); + toProps.styles['will-change'] = toStyleProperties.join( ', ' ); + + // Build up our custom CSS. We need to override inline styles + // so we need to make our styles vErY IMPORTANT!1!! + let fromCSS = Object.keys( fromProps.styles ).map( propertyName => { + return propertyName + ': ' + fromProps.styles[propertyName] + ' !important;'; + } ).join( '' ); + + let toCSS = Object.keys( toProps.styles ).map( propertyName => { + return propertyName + ': ' + toProps.styles[propertyName] + ' !important;'; + } ).join( '' ); + + css = '[data-auto-animate-target="'+ id +'"] {'+ fromCSS +'}' + + '[data-auto-animate="running"] [data-auto-animate-target="'+ id +'"] {'+ toCSS +'}'; + + } + + return css; + + } + + /** + * Returns the auto-animate options for the given element. + * + * @param {HTMLElement} element Element to pick up options + * from, either a slide or an animation target + * @param {Object} [inheritedOptions] Optional set of existing + * options + */ + getAutoAnimateOptions( element, inheritedOptions ) { + + let options = { + easing: this.Reveal.getConfig().autoAnimateEasing, + duration: this.Reveal.getConfig().autoAnimateDuration, + delay: 0 + }; + + options = extend( options, inheritedOptions ); + + // Inherit options from parent elements + if( element.parentNode ) { + let autoAnimatedParent = closest( element.parentNode, '[data-auto-animate-target]' ); + if( autoAnimatedParent ) { + options = this.getAutoAnimateOptions( autoAnimatedParent, options ); + } + } + + if( element.dataset.autoAnimateEasing ) { + options.easing = element.dataset.autoAnimateEasing; + } + + if( element.dataset.autoAnimateDuration ) { + options.duration = parseFloat( element.dataset.autoAnimateDuration ); + } + + if( element.dataset.autoAnimateDelay ) { + options.delay = parseFloat( element.dataset.autoAnimateDelay ); + } + + return options; + + } + + /** + * Returns an object containing all of the properties + * that can be auto-animated for the given element and + * their current computed values. + * + * @param {String} direction 'from' or 'to' + */ + getAutoAnimatableProperties( direction, element, elementOptions ) { + + let config = this.Reveal.getConfig(); + + let properties = { styles: [] }; + + // Position and size + if( elementOptions.translate !== false || elementOptions.scale !== false ) { + let bounds; + + // Custom auto-animate may optionally return a custom tailored + // measurement function + if( typeof elementOptions.measure === 'function' ) { + bounds = elementOptions.measure( element ); + } + else { + if( config.center ) { + // More precise, but breaks when used in combination + // with zoom for scaling the deck ¯\_(ツ)_/¯ + bounds = element.getBoundingClientRect(); + } + else { + let scale = this.Reveal.getScale(); + bounds = { + x: element.offsetLeft * scale, + y: element.offsetTop * scale, + width: element.offsetWidth * scale, + height: element.offsetHeight * scale + }; + } + } + + properties.x = bounds.x; + properties.y = bounds.y; + properties.width = bounds.width; + properties.height = bounds.height; + } + + const computedStyles = getComputedStyle( element ); + + // CSS styles + ( elementOptions.styles || config.autoAnimateStyles ).forEach( style => { + let value; + + // `style` is either the property name directly, or an object + // definition of a style property + if( typeof style === 'string' ) style = { property: style }; + + if( typeof style.from !== 'undefined' && direction === 'from' ) { + value = { value: style.from, explicitValue: true }; + } + else if( typeof style.to !== 'undefined' && direction === 'to' ) { + value = { value: style.to, explicitValue: true }; + } + else { + value = computedStyles[style.property]; + } + + if( value !== '' ) { + properties.styles[style.property] = value; + } + } ); + + return properties; + + } + + /** + * Get a list of all element pairs that we can animate + * between the given slides. + * + * @param {HTMLElement} fromSlide + * @param {HTMLElement} toSlide + * + * @return {Array} Each value is an array where [0] is + * the element we're animating from and [1] is the + * element we're animating to + */ + getAutoAnimatableElements( fromSlide, toSlide ) { + + let matcher = typeof this.Reveal.getConfig().autoAnimateMatcher === 'function' ? this.Reveal.getConfig().autoAnimateMatcher : this.getAutoAnimatePairs; + + let pairs = matcher.call( this, fromSlide, toSlide ); + + let reserved = []; + + // Remove duplicate pairs + return pairs.filter( ( pair, index ) => { + if( reserved.indexOf( pair.to ) === -1 ) { + reserved.push( pair.to ); + return true; + } + } ); + + } + + /** + * Identifies matching elements between slides. + * + * You can specify a custom matcher function by using + * the `autoAnimateMatcher` config option. + */ + getAutoAnimatePairs( fromSlide, toSlide ) { + + let pairs = []; + + const codeNodes = 'pre'; + const textNodes = 'h1, h2, h3, h4, h5, h6, p, li'; + const mediaNodes = 'img, video, iframe'; + + // Eplicit matches via data-id + this.findAutoAnimateMatches( pairs, fromSlide, toSlide, '[data-id]', node => { + return node.nodeName + ':::' + node.getAttribute( 'data-id' ); + } ); + + // Text + this.findAutoAnimateMatches( pairs, fromSlide, toSlide, textNodes, node => { + return node.nodeName + ':::' + node.innerText; + } ); + + // Media + this.findAutoAnimateMatches( pairs, fromSlide, toSlide, mediaNodes, node => { + return node.nodeName + ':::' + ( node.getAttribute( 'src' ) || node.getAttribute( 'data-src' ) ); + } ); + + // Code + this.findAutoAnimateMatches( pairs, fromSlide, toSlide, codeNodes, node => { + return node.nodeName + ':::' + node.innerText; + } ); + + pairs.forEach( pair => { + + // Disable scale transformations on text nodes, we transition + // each individual text property instead + if( matches( pair.from, textNodes ) ) { + pair.options = { scale: false }; + } + // Animate individual lines of code + else if( matches( pair.from, codeNodes ) ) { + + // Transition the code block's width and height instead of scaling + // to prevent its content from being squished + pair.options = { scale: false, styles: [ 'width', 'height' ] }; + + // Lines of code + this.findAutoAnimateMatches( pairs, pair.from, pair.to, '.hljs .hljs-ln-code', node => { + return node.textContent; + }, { + scale: false, + styles: [], + measure: this.getLocalBoundingBox.bind( this ) + } ); + + // Line numbers + this.findAutoAnimateMatches( pairs, pair.from, pair.to, '.hljs .hljs-ln-line[data-line-number]', node => { + return node.getAttribute( 'data-line-number' ); + }, { + scale: false, + styles: [ 'width' ], + measure: this.getLocalBoundingBox.bind( this ) + } ); + + } + + }, this ); + + return pairs; + + } + + /** + * Helper method which returns a bounding box based on + * the given elements offset coordinates. + * + * @param {HTMLElement} element + * @return {Object} x, y, width, height + */ + getLocalBoundingBox( element ) { + + const presentationScale = this.Reveal.getScale(); + + return { + x: Math.round( ( element.offsetLeft * presentationScale ) * 100 ) / 100, + y: Math.round( ( element.offsetTop * presentationScale ) * 100 ) / 100, + width: Math.round( ( element.offsetWidth * presentationScale ) * 100 ) / 100, + height: Math.round( ( element.offsetHeight * presentationScale ) * 100 ) / 100 + }; + + } + + /** + * Finds matching elements between two slides. + * + * @param {Array} pairs List of pairs to push matches to + * @param {HTMLElement} fromScope Scope within the from element exists + * @param {HTMLElement} toScope Scope within the to element exists + * @param {String} selector CSS selector of the element to match + * @param {Function} serializer A function that accepts an element and returns + * a stringified ID based on its contents + * @param {Object} animationOptions Optional config options for this pair + */ + findAutoAnimateMatches( pairs, fromScope, toScope, selector, serializer, animationOptions ) { + + let fromMatches = {}; + let toMatches = {}; + + [].slice.call( fromScope.querySelectorAll( selector ) ).forEach( ( element, i ) => { + const key = serializer( element ); + if( typeof key === 'string' && key.length ) { + fromMatches[key] = fromMatches[key] || []; + fromMatches[key].push( element ); + } + } ); + + [].slice.call( toScope.querySelectorAll( selector ) ).forEach( ( element, i ) => { + const key = serializer( element ); + toMatches[key] = toMatches[key] || []; + toMatches[key].push( element ); + + let fromElement; + + // Retrieve the 'from' element + if( fromMatches[key] ) { + const pimaryIndex = toMatches[key].length - 1; + const secondaryIndex = fromMatches[key].length - 1; + + // If there are multiple identical from elements, retrieve + // the one at the same index as our to-element. + if( fromMatches[key][ pimaryIndex ] ) { + fromElement = fromMatches[key][ pimaryIndex ]; + fromMatches[key][ pimaryIndex ] = null; + } + // If there are no matching from-elements at the same index, + // use the last one. + else if( fromMatches[key][ secondaryIndex ] ) { + fromElement = fromMatches[key][ secondaryIndex ]; + fromMatches[key][ secondaryIndex ] = null; + } + } + + // If we've got a matching pair, push it to the list of pairs + if( fromElement ) { + pairs.push({ + from: fromElement, + to: element, + options: animationOptions + }); + } + } ); + + } + + /** + * Returns a all elements within the given scope that should + * be considered unmatched in an auto-animate transition. If + * fading of unmatched elements is turned on, these elements + * will fade when going between auto-animate slides. + * + * Note that parents of auto-animate targets are NOT considerd + * unmatched since fading them would break the auto-animation. + * + * @param {HTMLElement} rootElement + * @return {Array} + */ + getUnmatchedAutoAnimateElements( rootElement ) { + + return [].slice.call( rootElement.children ).reduce( ( result, element ) => { + + const containsAnimatedElements = element.querySelector( '[data-auto-animate-target]' ); + + // The element is unmatched if + // - It is not an auto-animate target + // - It does not contain any auto-animate targets + if( !element.hasAttribute( 'data-auto-animate-target' ) && !containsAnimatedElements ) { + result.push( element ); + } + + if( element.querySelector( '[data-auto-animate-target]' ) ) { + result = result.concat( this.getUnmatchedAutoAnimateElements( element ) ); + } + + return result; + + }, [] ); + + } + +} diff --git a/static/presentations/2021-11-13/garage/js/controllers/backgrounds.js b/static/presentations/2021-11-13/garage/js/controllers/backgrounds.js new file mode 100644 index 0000000..f412a18 --- /dev/null +++ b/static/presentations/2021-11-13/garage/js/controllers/backgrounds.js @@ -0,0 +1,397 @@ +import { queryAll } from '../utils/util.js' +import { colorToRgb, colorBrightness } from '../utils/color.js' + +/** + * Creates and updates slide backgrounds. + */ +export default class Backgrounds { + + constructor( Reveal ) { + + this.Reveal = Reveal; + + } + + render() { + + this.element = document.createElement( 'div' ); + this.element.className = 'backgrounds'; + this.Reveal.getRevealElement().appendChild( this.element ); + + } + + /** + * Creates the slide background elements and appends them + * to the background container. One element is created per + * slide no matter if the given slide has visible background. + */ + create() { + + // Clear prior backgrounds + this.element.innerHTML = ''; + this.element.classList.add( 'no-transition' ); + + // Iterate over all horizontal slides + this.Reveal.getHorizontalSlides().forEach( slideh => { + + let backgroundStack = this.createBackground( slideh, this.element ); + + // Iterate over all vertical slides + queryAll( slideh, 'section' ).forEach( slidev => { + + this.createBackground( slidev, backgroundStack ); + + backgroundStack.classList.add( 'stack' ); + + } ); + + } ); + + // Add parallax background if specified + if( this.Reveal.getConfig().parallaxBackgroundImage ) { + + this.element.style.backgroundImage = 'url("' + this.Reveal.getConfig().parallaxBackgroundImage + '")'; + this.element.style.backgroundSize = this.Reveal.getConfig().parallaxBackgroundSize; + this.element.style.backgroundRepeat = this.Reveal.getConfig().parallaxBackgroundRepeat; + this.element.style.backgroundPosition = this.Reveal.getConfig().parallaxBackgroundPosition; + + // Make sure the below properties are set on the element - these properties are + // needed for proper transitions to be set on the element via CSS. To remove + // annoying background slide-in effect when the presentation starts, apply + // these properties after short time delay + setTimeout( () => { + this.Reveal.getRevealElement().classList.add( 'has-parallax-background' ); + }, 1 ); + + } + else { + + this.element.style.backgroundImage = ''; + this.Reveal.getRevealElement().classList.remove( 'has-parallax-background' ); + + } + + } + + /** + * Creates a background for the given slide. + * + * @param {HTMLElement} slide + * @param {HTMLElement} container The element that the background + * should be appended to + * @return {HTMLElement} New background div + */ + createBackground( slide, container ) { + + // Main slide background element + let element = document.createElement( 'div' ); + element.className = 'slide-background ' + slide.className.replace( /present|past|future/, '' ); + + // Inner background element that wraps images/videos/iframes + let contentElement = document.createElement( 'div' ); + contentElement.className = 'slide-background-content'; + + element.appendChild( contentElement ); + container.appendChild( element ); + + slide.slideBackgroundElement = element; + slide.slideBackgroundContentElement = contentElement; + + // Syncs the background to reflect all current background settings + this.sync( slide ); + + return element; + + } + + /** + * Renders all of the visual properties of a slide background + * based on the various background attributes. + * + * @param {HTMLElement} slide + */ + sync( slide ) { + + const element = slide.slideBackgroundElement, + contentElement = slide.slideBackgroundContentElement; + + const data = { + background: slide.getAttribute( 'data-background' ), + backgroundSize: slide.getAttribute( 'data-background-size' ), + backgroundImage: slide.getAttribute( 'data-background-image' ), + backgroundVideo: slide.getAttribute( 'data-background-video' ), + backgroundIframe: slide.getAttribute( 'data-background-iframe' ), + backgroundColor: slide.getAttribute( 'data-background-color' ), + backgroundRepeat: slide.getAttribute( 'data-background-repeat' ), + backgroundPosition: slide.getAttribute( 'data-background-position' ), + backgroundTransition: slide.getAttribute( 'data-background-transition' ), + backgroundOpacity: slide.getAttribute( 'data-background-opacity' ), + }; + + const dataPreload = slide.hasAttribute( 'data-preload' ); + + // Reset the prior background state in case this is not the + // initial sync + slide.classList.remove( 'has-dark-background' ); + slide.classList.remove( 'has-light-background' ); + + element.removeAttribute( 'data-loaded' ); + element.removeAttribute( 'data-background-hash' ); + element.removeAttribute( 'data-background-size' ); + element.removeAttribute( 'data-background-transition' ); + element.style.backgroundColor = ''; + + contentElement.style.backgroundSize = ''; + contentElement.style.backgroundRepeat = ''; + contentElement.style.backgroundPosition = ''; + contentElement.style.backgroundImage = ''; + contentElement.style.opacity = ''; + contentElement.innerHTML = ''; + + if( data.background ) { + // Auto-wrap image urls in url(...) + if( /^(http|file|\/\/)/gi.test( data.background ) || /\.(svg|png|jpg|jpeg|gif|bmp)([?#\s]|$)/gi.test( data.background ) ) { + slide.setAttribute( 'data-background-image', data.background ); + } + else { + element.style.background = data.background; + } + } + + // Create a hash for this combination of background settings. + // This is used to determine when two slide backgrounds are + // the same. + if( data.background || data.backgroundColor || data.backgroundImage || data.backgroundVideo || data.backgroundIframe ) { + element.setAttribute( 'data-background-hash', data.background + + data.backgroundSize + + data.backgroundImage + + data.backgroundVideo + + data.backgroundIframe + + data.backgroundColor + + data.backgroundRepeat + + data.backgroundPosition + + data.backgroundTransition + + data.backgroundOpacity ); + } + + // Additional and optional background properties + if( data.backgroundSize ) element.setAttribute( 'data-background-size', data.backgroundSize ); + if( data.backgroundColor ) element.style.backgroundColor = data.backgroundColor; + if( data.backgroundTransition ) element.setAttribute( 'data-background-transition', data.backgroundTransition ); + + if( dataPreload ) element.setAttribute( 'data-preload', '' ); + + // Background image options are set on the content wrapper + if( data.backgroundSize ) contentElement.style.backgroundSize = data.backgroundSize; + if( data.backgroundRepeat ) contentElement.style.backgroundRepeat = data.backgroundRepeat; + if( data.backgroundPosition ) contentElement.style.backgroundPosition = data.backgroundPosition; + if( data.backgroundOpacity ) contentElement.style.opacity = data.backgroundOpacity; + + // If this slide has a background color, we add a class that + // signals if it is light or dark. If the slide has no background + // color, no class will be added + let contrastColor = data.backgroundColor; + + // If no bg color was found, or it cannot be converted by colorToRgb, check the computed background + if( !contrastColor || !colorToRgb( contrastColor ) ) { + let computedBackgroundStyle = window.getComputedStyle( element ); + if( computedBackgroundStyle && computedBackgroundStyle.backgroundColor ) { + contrastColor = computedBackgroundStyle.backgroundColor; + } + } + + if( contrastColor ) { + const rgb = colorToRgb( contrastColor ); + + // Ignore fully transparent backgrounds. Some browsers return + // rgba(0,0,0,0) when reading the computed background color of + // an element with no background + if( rgb && rgb.a !== 0 ) { + if( colorBrightness( contrastColor ) < 128 ) { + slide.classList.add( 'has-dark-background' ); + } + else { + slide.classList.add( 'has-light-background' ); + } + } + } + + } + + /** + * Updates the background elements to reflect the current + * slide. + * + * @param {boolean} includeAll If true, the backgrounds of + * all vertical slides (not just the present) will be updated. + */ + update( includeAll = false ) { + + let currentSlide = this.Reveal.getCurrentSlide(); + let indices = this.Reveal.getIndices(); + + let currentBackground = null; + + // Reverse past/future classes when in RTL mode + let horizontalPast = this.Reveal.getConfig().rtl ? 'future' : 'past', + horizontalFuture = this.Reveal.getConfig().rtl ? 'past' : 'future'; + + // Update the classes of all backgrounds to match the + // states of their slides (past/present/future) + Array.from( this.element.childNodes ).forEach( ( backgroundh, h ) => { + + backgroundh.classList.remove( 'past', 'present', 'future' ); + + if( h < indices.h ) { + backgroundh.classList.add( horizontalPast ); + } + else if ( h > indices.h ) { + backgroundh.classList.add( horizontalFuture ); + } + else { + backgroundh.classList.add( 'present' ); + + // Store a reference to the current background element + currentBackground = backgroundh; + } + + if( includeAll || h === indices.h ) { + queryAll( backgroundh, '.slide-background' ).forEach( ( backgroundv, v ) => { + + backgroundv.classList.remove( 'past', 'present', 'future' ); + + if( v < indices.v ) { + backgroundv.classList.add( 'past' ); + } + else if ( v > indices.v ) { + backgroundv.classList.add( 'future' ); + } + else { + backgroundv.classList.add( 'present' ); + + // Only if this is the present horizontal and vertical slide + if( h === indices.h ) currentBackground = backgroundv; + } + + } ); + } + + } ); + + // Stop content inside of previous backgrounds + if( this.previousBackground ) { + + this.Reveal.slideContent.stopEmbeddedContent( this.previousBackground, { unloadIframes: !this.Reveal.slideContent.shouldPreload( this.previousBackground ) } ); + + } + + // Start content in the current background + if( currentBackground ) { + + this.Reveal.slideContent.startEmbeddedContent( currentBackground ); + + let currentBackgroundContent = currentBackground.querySelector( '.slide-background-content' ); + if( currentBackgroundContent ) { + + let backgroundImageURL = currentBackgroundContent.style.backgroundImage || ''; + + // Restart GIFs (doesn't work in Firefox) + if( /\.gif/i.test( backgroundImageURL ) ) { + currentBackgroundContent.style.backgroundImage = ''; + window.getComputedStyle( currentBackgroundContent ).opacity; + currentBackgroundContent.style.backgroundImage = backgroundImageURL; + } + + } + + // Don't transition between identical backgrounds. This + // prevents unwanted flicker. + let previousBackgroundHash = this.previousBackground ? this.previousBackground.getAttribute( 'data-background-hash' ) : null; + let currentBackgroundHash = currentBackground.getAttribute( 'data-background-hash' ); + if( currentBackgroundHash && currentBackgroundHash === previousBackgroundHash && currentBackground !== this.previousBackground ) { + this.element.classList.add( 'no-transition' ); + } + + this.previousBackground = currentBackground; + + } + + // If there's a background brightness flag for this slide, + // bubble it to the .reveal container + if( currentSlide ) { + [ 'has-light-background', 'has-dark-background' ].forEach( classToBubble => { + if( currentSlide.classList.contains( classToBubble ) ) { + this.Reveal.getRevealElement().classList.add( classToBubble ); + } + else { + this.Reveal.getRevealElement().classList.remove( classToBubble ); + } + }, this ); + } + + // Allow the first background to apply without transition + setTimeout( () => { + this.element.classList.remove( 'no-transition' ); + }, 1 ); + + } + + /** + * Updates the position of the parallax background based + * on the current slide index. + */ + updateParallax() { + + let indices = this.Reveal.getIndices(); + + if( this.Reveal.getConfig().parallaxBackgroundImage ) { + + let horizontalSlides = this.Reveal.getHorizontalSlides(), + verticalSlides = this.Reveal.getVerticalSlides(); + + let backgroundSize = this.element.style.backgroundSize.split( ' ' ), + backgroundWidth, backgroundHeight; + + if( backgroundSize.length === 1 ) { + backgroundWidth = backgroundHeight = parseInt( backgroundSize[0], 10 ); + } + else { + backgroundWidth = parseInt( backgroundSize[0], 10 ); + backgroundHeight = parseInt( backgroundSize[1], 10 ); + } + + let slideWidth = this.element.offsetWidth, + horizontalSlideCount = horizontalSlides.length, + horizontalOffsetMultiplier, + horizontalOffset; + + if( typeof this.Reveal.getConfig().parallaxBackgroundHorizontal === 'number' ) { + horizontalOffsetMultiplier = this.Reveal.getConfig().parallaxBackgroundHorizontal; + } + else { + horizontalOffsetMultiplier = horizontalSlideCount > 1 ? ( backgroundWidth - slideWidth ) / ( horizontalSlideCount-1 ) : 0; + } + + horizontalOffset = horizontalOffsetMultiplier * indices.h * -1; + + let slideHeight = this.element.offsetHeight, + verticalSlideCount = verticalSlides.length, + verticalOffsetMultiplier, + verticalOffset; + + if( typeof this.Reveal.getConfig().parallaxBackgroundVertical === 'number' ) { + verticalOffsetMultiplier = this.Reveal.getConfig().parallaxBackgroundVertical; + } + else { + verticalOffsetMultiplier = ( backgroundHeight - slideHeight ) / ( verticalSlideCount-1 ); + } + + verticalOffset = verticalSlideCount > 0 ? verticalOffsetMultiplier * indices.v : 0; + + this.element.style.backgroundPosition = horizontalOffset + 'px ' + -verticalOffset + 'px'; + + } + + } + +} diff --git a/static/presentations/2021-11-13/garage/js/controllers/controls.js b/static/presentations/2021-11-13/garage/js/controllers/controls.js new file mode 100644 index 0000000..556bcf0 --- /dev/null +++ b/static/presentations/2021-11-13/garage/js/controllers/controls.js @@ -0,0 +1,259 @@ +import { queryAll } from '../utils/util.js' +import { isAndroid } from '../utils/device.js' + +/** + * Manages our presentation controls. This includes both + * the built-in control arrows as well as event monitoring + * of any elements within the presentation with either of the + * following helper classes: + * - .navigate-up + * - .navigate-right + * - .navigate-down + * - .navigate-left + * - .navigate-next + * - .navigate-prev + */ +export default class Controls { + + constructor( Reveal ) { + + this.Reveal = Reveal; + + this.onNavigateLeftClicked = this.onNavigateLeftClicked.bind( this ); + this.onNavigateRightClicked = this.onNavigateRightClicked.bind( this ); + this.onNavigateUpClicked = this.onNavigateUpClicked.bind( this ); + this.onNavigateDownClicked = this.onNavigateDownClicked.bind( this ); + this.onNavigatePrevClicked = this.onNavigatePrevClicked.bind( this ); + this.onNavigateNextClicked = this.onNavigateNextClicked.bind( this ); + + } + + render() { + + const rtl = this.Reveal.getConfig().rtl; + const revealElement = this.Reveal.getRevealElement(); + + this.element = document.createElement( 'aside' ); + this.element.className = 'controls'; + this.element.innerHTML = + ` + + + `; + + this.Reveal.getRevealElement().appendChild( this.element ); + + // There can be multiple instances of controls throughout the page + this.controlsLeft = queryAll( revealElement, '.navigate-left' ); + this.controlsRight = queryAll( revealElement, '.navigate-right' ); + this.controlsUp = queryAll( revealElement, '.navigate-up' ); + this.controlsDown = queryAll( revealElement, '.navigate-down' ); + this.controlsPrev = queryAll( revealElement, '.navigate-prev' ); + this.controlsNext = queryAll( revealElement, '.navigate-next' ); + + // The left, right and down arrows in the standard reveal.js controls + this.controlsRightArrow = this.element.querySelector( '.navigate-right' ); + this.controlsLeftArrow = this.element.querySelector( '.navigate-left' ); + this.controlsDownArrow = this.element.querySelector( '.navigate-down' ); + + } + + /** + * Called when the reveal.js config is updated. + */ + configure( config, oldConfig ) { + + this.element.style.display = config.controls ? 'block' : 'none'; + + this.element.setAttribute( 'data-controls-layout', config.controlsLayout ); + this.element.setAttribute( 'data-controls-back-arrows', config.controlsBackArrows ); + + } + + bind() { + + // Listen to both touch and click events, in case the device + // supports both + let pointerEvents = [ 'touchstart', 'click' ]; + + // Only support touch for Android, fixes double navigations in + // stock browser + if( isAndroid ) { + pointerEvents = [ 'touchstart' ]; + } + + pointerEvents.forEach( eventName => { + this.controlsLeft.forEach( el => el.addEventListener( eventName, this.onNavigateLeftClicked, false ) ); + this.controlsRight.forEach( el => el.addEventListener( eventName, this.onNavigateRightClicked, false ) ); + this.controlsUp.forEach( el => el.addEventListener( eventName, this.onNavigateUpClicked, false ) ); + this.controlsDown.forEach( el => el.addEventListener( eventName, this.onNavigateDownClicked, false ) ); + this.controlsPrev.forEach( el => el.addEventListener( eventName, this.onNavigatePrevClicked, false ) ); + this.controlsNext.forEach( el => el.addEventListener( eventName, this.onNavigateNextClicked, false ) ); + } ); + + } + + unbind() { + + [ 'touchstart', 'click' ].forEach( eventName => { + this.controlsLeft.forEach( el => el.removeEventListener( eventName, this.onNavigateLeftClicked, false ) ); + this.controlsRight.forEach( el => el.removeEventListener( eventName, this.onNavigateRightClicked, false ) ); + this.controlsUp.forEach( el => el.removeEventListener( eventName, this.onNavigateUpClicked, false ) ); + this.controlsDown.forEach( el => el.removeEventListener( eventName, this.onNavigateDownClicked, false ) ); + this.controlsPrev.forEach( el => el.removeEventListener( eventName, this.onNavigatePrevClicked, false ) ); + this.controlsNext.forEach( el => el.removeEventListener( eventName, this.onNavigateNextClicked, false ) ); + } ); + + } + + /** + * Updates the state of all control/navigation arrows. + */ + update() { + + let routes = this.Reveal.availableRoutes(); + + // Remove the 'enabled' class from all directions + [...this.controlsLeft, ...this.controlsRight, ...this.controlsUp, ...this.controlsDown, ...this.controlsPrev, ...this.controlsNext].forEach( node => { + node.classList.remove( 'enabled', 'fragmented' ); + + // Set 'disabled' attribute on all directions + node.setAttribute( 'disabled', 'disabled' ); + } ); + + // Add the 'enabled' class to the available routes; remove 'disabled' attribute to enable buttons + if( routes.left ) this.controlsLeft.forEach( el => { el.classList.add( 'enabled' ); el.removeAttribute( 'disabled' ); } ); + if( routes.right ) this.controlsRight.forEach( el => { el.classList.add( 'enabled' ); el.removeAttribute( 'disabled' ); } ); + if( routes.up ) this.controlsUp.forEach( el => { el.classList.add( 'enabled' ); el.removeAttribute( 'disabled' ); } ); + if( routes.down ) this.controlsDown.forEach( el => { el.classList.add( 'enabled' ); el.removeAttribute( 'disabled' ); } ); + + // Prev/next buttons + if( routes.left || routes.up ) this.controlsPrev.forEach( el => { el.classList.add( 'enabled' ); el.removeAttribute( 'disabled' ); } ); + if( routes.right || routes.down ) this.controlsNext.forEach( el => { el.classList.add( 'enabled' ); el.removeAttribute( 'disabled' ); } ); + + // Highlight fragment directions + let currentSlide = this.Reveal.getCurrentSlide(); + if( currentSlide ) { + + let fragmentsRoutes = this.Reveal.fragments.availableRoutes(); + + // Always apply fragment decorator to prev/next buttons + if( fragmentsRoutes.prev ) this.controlsPrev.forEach( el => { el.classList.add( 'fragmented', 'enabled' ); el.removeAttribute( 'disabled' ); } ); + if( fragmentsRoutes.next ) this.controlsNext.forEach( el => { el.classList.add( 'fragmented', 'enabled' ); el.removeAttribute( 'disabled' ); } ); + + // Apply fragment decorators to directional buttons based on + // what slide axis they are in + if( this.Reveal.isVerticalSlide( currentSlide ) ) { + if( fragmentsRoutes.prev ) this.controlsUp.forEach( el => { el.classList.add( 'fragmented', 'enabled' ); el.removeAttribute( 'disabled' ); } ); + if( fragmentsRoutes.next ) this.controlsDown.forEach( el => { el.classList.add( 'fragmented', 'enabled' ); el.removeAttribute( 'disabled' ); } ); + } + else { + if( fragmentsRoutes.prev ) this.controlsLeft.forEach( el => { el.classList.add( 'fragmented', 'enabled' ); el.removeAttribute( 'disabled' ); } ); + if( fragmentsRoutes.next ) this.controlsRight.forEach( el => { el.classList.add( 'fragmented', 'enabled' ); el.removeAttribute( 'disabled' ); } ); + } + + } + + if( this.Reveal.getConfig().controlsTutorial ) { + + let indices = this.Reveal.getIndices(); + + // Highlight control arrows with an animation to ensure + // that the viewer knows how to navigate + if( !this.Reveal.hasNavigatedVertically() && routes.down ) { + this.controlsDownArrow.classList.add( 'highlight' ); + } + else { + this.controlsDownArrow.classList.remove( 'highlight' ); + + if( this.Reveal.getConfig().rtl ) { + + if( !this.Reveal.hasNavigatedHorizontally() && routes.left && indices.v === 0 ) { + this.controlsLeftArrow.classList.add( 'highlight' ); + } + else { + this.controlsLeftArrow.classList.remove( 'highlight' ); + } + + } else { + + if( !this.Reveal.hasNavigatedHorizontally() && routes.right && indices.v === 0 ) { + this.controlsRightArrow.classList.add( 'highlight' ); + } + else { + this.controlsRightArrow.classList.remove( 'highlight' ); + } + } + } + } + } + + /** + * Event handlers for navigation control buttons. + */ + onNavigateLeftClicked( event ) { + + event.preventDefault(); + this.Reveal.onUserInput(); + + if( this.Reveal.getConfig().navigationMode === 'linear' ) { + this.Reveal.prev(); + } + else { + this.Reveal.left(); + } + + } + + onNavigateRightClicked( event ) { + + event.preventDefault(); + this.Reveal.onUserInput(); + + if( this.Reveal.getConfig().navigationMode === 'linear' ) { + this.Reveal.next(); + } + else { + this.Reveal.right(); + } + + } + + onNavigateUpClicked( event ) { + + event.preventDefault(); + this.Reveal.onUserInput(); + + this.Reveal.up(); + + } + + onNavigateDownClicked( event ) { + + event.preventDefault(); + this.Reveal.onUserInput(); + + this.Reveal.down(); + + } + + onNavigatePrevClicked( event ) { + + event.preventDefault(); + this.Reveal.onUserInput(); + + this.Reveal.prev(); + + } + + onNavigateNextClicked( event ) { + + event.preventDefault(); + this.Reveal.onUserInput(); + + this.Reveal.next(); + + } + + +} \ No newline at end of file diff --git a/static/presentations/2021-11-13/garage/js/controllers/focus.js b/static/presentations/2021-11-13/garage/js/controllers/focus.js new file mode 100644 index 0000000..2191807 --- /dev/null +++ b/static/presentations/2021-11-13/garage/js/controllers/focus.js @@ -0,0 +1,97 @@ +import { closest } from '../utils/util.js' + +/** + * Manages focus when a presentation is embedded. This + * helps us only capture keyboard from the presentation + * a user is currently interacting with in a page where + * multiple presentations are embedded. + */ + +const STATE_FOCUS = 'focus'; +const STATE_BLUR = 'blur'; + +export default class Focus { + + constructor( Reveal ) { + + this.Reveal = Reveal; + + this.onRevealPointerDown = this.onRevealPointerDown.bind( this ); + this.onDocumentPointerDown = this.onDocumentPointerDown.bind( this ); + + } + + /** + * Called when the reveal.js config is updated. + */ + configure( config, oldConfig ) { + + if( config.embedded ) { + this.blur(); + } + else { + this.focus(); + this.unbind(); + } + + } + + bind() { + + if( this.Reveal.getConfig().embedded ) { + this.Reveal.getRevealElement().addEventListener( 'pointerdown', this.onRevealPointerDown, false ); + } + + } + + unbind() { + + this.Reveal.getRevealElement().removeEventListener( 'pointerdown', this.onRevealPointerDown, false ); + document.removeEventListener( 'pointerdown', this.onDocumentPointerDown, false ); + + } + + focus() { + + if( this.state !== STATE_FOCUS ) { + this.Reveal.getRevealElement().classList.add( 'focused' ); + document.addEventListener( 'pointerdown', this.onDocumentPointerDown, false ); + } + + this.state = STATE_FOCUS; + + } + + blur() { + + if( this.state !== STATE_BLUR ) { + this.Reveal.getRevealElement().classList.remove( 'focused' ); + document.removeEventListener( 'pointerdown', this.onDocumentPointerDown, false ); + } + + this.state = STATE_BLUR; + + } + + isFocused() { + + return this.state === STATE_FOCUS; + + } + + onRevealPointerDown( event ) { + + this.focus(); + + } + + onDocumentPointerDown( event ) { + + let revealElement = closest( event.target, '.reveal' ); + if( !revealElement || revealElement !== this.Reveal.getRevealElement() ) { + this.blur(); + } + + } + +} \ No newline at end of file diff --git a/static/presentations/2021-11-13/garage/js/controllers/fragments.js b/static/presentations/2021-11-13/garage/js/controllers/fragments.js new file mode 100644 index 0000000..796c168 --- /dev/null +++ b/static/presentations/2021-11-13/garage/js/controllers/fragments.js @@ -0,0 +1,376 @@ +import { extend, queryAll } from '../utils/util.js' + +/** + * Handles sorting and navigation of slide fragments. + * Fragments are elements within a slide that are + * revealed/animated incrementally. + */ +export default class Fragments { + + constructor( Reveal ) { + + this.Reveal = Reveal; + + } + + /** + * Called when the reveal.js config is updated. + */ + configure( config, oldConfig ) { + + if( config.fragments === false ) { + this.disable(); + } + else if( oldConfig.fragments === false ) { + this.enable(); + } + + } + + /** + * If fragments are disabled in the deck, they should all be + * visible rather than stepped through. + */ + disable() { + + queryAll( this.Reveal.getSlidesElement(), '.fragment' ).forEach( element => { + element.classList.add( 'visible' ); + element.classList.remove( 'current-fragment' ); + } ); + + } + + /** + * Reverse of #disable(). Only called if fragments have + * previously been disabled. + */ + enable() { + + queryAll( this.Reveal.getSlidesElement(), '.fragment' ).forEach( element => { + element.classList.remove( 'visible' ); + element.classList.remove( 'current-fragment' ); + } ); + + } + + /** + * Returns an object describing the available fragment + * directions. + * + * @return {{prev: boolean, next: boolean}} + */ + availableRoutes() { + + let currentSlide = this.Reveal.getCurrentSlide(); + if( currentSlide && this.Reveal.getConfig().fragments ) { + let fragments = currentSlide.querySelectorAll( '.fragment:not(.disabled)' ); + let hiddenFragments = currentSlide.querySelectorAll( '.fragment:not(.disabled):not(.visible)' ); + + return { + prev: fragments.length - hiddenFragments.length > 0, + next: !!hiddenFragments.length + }; + } + else { + return { prev: false, next: false }; + } + + } + + /** + * Return a sorted fragments list, ordered by an increasing + * "data-fragment-index" attribute. + * + * Fragments will be revealed in the order that they are returned by + * this function, so you can use the index attributes to control the + * order of fragment appearance. + * + * To maintain a sensible default fragment order, fragments are presumed + * to be passed in document order. This function adds a "fragment-index" + * attribute to each node if such an attribute is not already present, + * and sets that attribute to an integer value which is the position of + * the fragment within the fragments list. + * + * @param {object[]|*} fragments + * @param {boolean} grouped If true the returned array will contain + * nested arrays for all fragments with the same index + * @return {object[]} sorted Sorted array of fragments + */ + sort( fragments, grouped = false ) { + + fragments = Array.from( fragments ); + + let ordered = [], + unordered = [], + sorted = []; + + // Group ordered and unordered elements + fragments.forEach( fragment => { + if( fragment.hasAttribute( 'data-fragment-index' ) ) { + let index = parseInt( fragment.getAttribute( 'data-fragment-index' ), 10 ); + + if( !ordered[index] ) { + ordered[index] = []; + } + + ordered[index].push( fragment ); + } + else { + unordered.push( [ fragment ] ); + } + } ); + + // Append fragments without explicit indices in their + // DOM order + ordered = ordered.concat( unordered ); + + // Manually count the index up per group to ensure there + // are no gaps + let index = 0; + + // Push all fragments in their sorted order to an array, + // this flattens the groups + ordered.forEach( group => { + group.forEach( fragment => { + sorted.push( fragment ); + fragment.setAttribute( 'data-fragment-index', index ); + } ); + + index ++; + } ); + + return grouped === true ? ordered : sorted; + + } + + /** + * Sorts and formats all of fragments in the + * presentation. + */ + sortAll() { + + this.Reveal.getHorizontalSlides().forEach( horizontalSlide => { + + let verticalSlides = queryAll( horizontalSlide, 'section' ); + verticalSlides.forEach( ( verticalSlide, y ) => { + + this.sort( verticalSlide.querySelectorAll( '.fragment' ) ); + + }, this ); + + if( verticalSlides.length === 0 ) this.sort( horizontalSlide.querySelectorAll( '.fragment' ) ); + + } ); + + } + + /** + * Refreshes the fragments on the current slide so that they + * have the appropriate classes (.visible + .current-fragment). + * + * @param {number} [index] The index of the current fragment + * @param {array} [fragments] Array containing all fragments + * in the current slide + * + * @return {{shown: array, hidden: array}} + */ + update( index, fragments ) { + + let changedFragments = { + shown: [], + hidden: [] + }; + + let currentSlide = this.Reveal.getCurrentSlide(); + if( currentSlide && this.Reveal.getConfig().fragments ) { + + fragments = fragments || this.sort( currentSlide.querySelectorAll( '.fragment' ) ); + + if( fragments.length ) { + + let maxIndex = 0; + + if( typeof index !== 'number' ) { + let currentFragment = this.sort( currentSlide.querySelectorAll( '.fragment.visible' ) ).pop(); + if( currentFragment ) { + index = parseInt( currentFragment.getAttribute( 'data-fragment-index' ) || 0, 10 ); + } + } + + Array.from( fragments ).forEach( ( el, i ) => { + + if( el.hasAttribute( 'data-fragment-index' ) ) { + i = parseInt( el.getAttribute( 'data-fragment-index' ), 10 ); + } + + maxIndex = Math.max( maxIndex, i ); + + // Visible fragments + if( i <= index ) { + let wasVisible = el.classList.contains( 'visible' ) + el.classList.add( 'visible' ); + el.classList.remove( 'current-fragment' ); + + if( i === index ) { + // Announce the fragments one by one to the Screen Reader + this.Reveal.announceStatus( this.Reveal.getStatusText( el ) ); + + el.classList.add( 'current-fragment' ); + this.Reveal.slideContent.startEmbeddedContent( el ); + } + + if( !wasVisible ) { + changedFragments.shown.push( el ) + this.Reveal.dispatchEvent({ + target: el, + type: 'visible', + bubbles: false + }); + } + } + // Hidden fragments + else { + let wasVisible = el.classList.contains( 'visible' ) + el.classList.remove( 'visible' ); + el.classList.remove( 'current-fragment' ); + + if( wasVisible ) { + this.Reveal.slideContent.stopEmbeddedContent( el ); + changedFragments.hidden.push( el ); + this.Reveal.dispatchEvent({ + target: el, + type: 'hidden', + bubbles: false + }); + } + } + + } ); + + // Write the current fragment index to the slide
. + // This can be used by end users to apply styles based on + // the current fragment index. + index = typeof index === 'number' ? index : -1; + index = Math.max( Math.min( index, maxIndex ), -1 ); + currentSlide.setAttribute( 'data-fragment', index ); + + } + + } + + return changedFragments; + + } + + /** + * Formats the fragments on the given slide so that they have + * valid indices. Call this if fragments are changed in the DOM + * after reveal.js has already initialized. + * + * @param {HTMLElement} slide + * @return {Array} a list of the HTML fragments that were synced + */ + sync( slide = this.Reveal.getCurrentSlide() ) { + + return this.sort( slide.querySelectorAll( '.fragment' ) ); + + } + + /** + * Navigate to the specified slide fragment. + * + * @param {?number} index The index of the fragment that + * should be shown, -1 means all are invisible + * @param {number} offset Integer offset to apply to the + * fragment index + * + * @return {boolean} true if a change was made in any + * fragments visibility as part of this call + */ + goto( index, offset = 0 ) { + + let currentSlide = this.Reveal.getCurrentSlide(); + if( currentSlide && this.Reveal.getConfig().fragments ) { + + let fragments = this.sort( currentSlide.querySelectorAll( '.fragment:not(.disabled)' ) ); + if( fragments.length ) { + + // If no index is specified, find the current + if( typeof index !== 'number' ) { + let lastVisibleFragment = this.sort( currentSlide.querySelectorAll( '.fragment:not(.disabled).visible' ) ).pop(); + + if( lastVisibleFragment ) { + index = parseInt( lastVisibleFragment.getAttribute( 'data-fragment-index' ) || 0, 10 ); + } + else { + index = -1; + } + } + + // Apply the offset if there is one + index += offset; + + let changedFragments = this.update( index, fragments ); + + if( changedFragments.hidden.length ) { + this.Reveal.dispatchEvent({ + type: 'fragmenthidden', + data: { + fragment: changedFragments.hidden[0], + fragments: changedFragments.hidden + } + }); + } + + if( changedFragments.shown.length ) { + this.Reveal.dispatchEvent({ + type: 'fragmentshown', + data: { + fragment: changedFragments.shown[0], + fragments: changedFragments.shown + } + }); + } + + this.Reveal.controls.update(); + this.Reveal.progress.update(); + + if( this.Reveal.getConfig().fragmentInURL ) { + this.Reveal.location.writeURL(); + } + + return !!( changedFragments.shown.length || changedFragments.hidden.length ); + + } + + } + + return false; + + } + + /** + * Navigate to the next slide fragment. + * + * @return {boolean} true if there was a next fragment, + * false otherwise + */ + next() { + + return this.goto( null, 1 ); + + } + + /** + * Navigate to the previous slide fragment. + * + * @return {boolean} true if there was a previous fragment, + * false otherwise + */ + prev() { + + return this.goto( null, -1 ); + + } + +} \ No newline at end of file diff --git a/static/presentations/2021-11-13/garage/js/controllers/keyboard.js b/static/presentations/2021-11-13/garage/js/controllers/keyboard.js new file mode 100644 index 0000000..4e013a3 --- /dev/null +++ b/static/presentations/2021-11-13/garage/js/controllers/keyboard.js @@ -0,0 +1,392 @@ +import { enterFullscreen } from '../utils/util.js' + +/** + * Handles all reveal.js keyboard interactions. + */ +export default class Keyboard { + + constructor( Reveal ) { + + this.Reveal = Reveal; + + // A key:value map of keyboard keys and descriptions of + // the actions they trigger + this.shortcuts = {}; + + // Holds custom key code mappings + this.bindings = {}; + + this.onDocumentKeyDown = this.onDocumentKeyDown.bind( this ); + this.onDocumentKeyPress = this.onDocumentKeyPress.bind( this ); + + } + + /** + * Called when the reveal.js config is updated. + */ + configure( config, oldConfig ) { + + if( config.navigationMode === 'linear' ) { + this.shortcuts['→ , ↓ , SPACE , N , L , J'] = 'Next slide'; + this.shortcuts['← , ↑ , P , H , K'] = 'Previous slide'; + } + else { + this.shortcuts['N , SPACE'] = 'Next slide'; + this.shortcuts['P , Shift SPACE'] = 'Previous slide'; + this.shortcuts['← , H'] = 'Navigate left'; + this.shortcuts['→ , L'] = 'Navigate right'; + this.shortcuts['↑ , K'] = 'Navigate up'; + this.shortcuts['↓ , J'] = 'Navigate down'; + } + + this.shortcuts['Alt + ←/↑/→/↓'] = 'Navigate without fragments'; + this.shortcuts['Shift + ←/↑/→/↓'] = 'Jump to first/last slide'; + this.shortcuts['B , .'] = 'Pause'; + this.shortcuts['F'] = 'Fullscreen'; + this.shortcuts['ESC, O'] = 'Slide overview'; + + } + + /** + * Starts listening for keyboard events. + */ + bind() { + + document.addEventListener( 'keydown', this.onDocumentKeyDown, false ); + document.addEventListener( 'keypress', this.onDocumentKeyPress, false ); + + } + + /** + * Stops listening for keyboard events. + */ + unbind() { + + document.removeEventListener( 'keydown', this.onDocumentKeyDown, false ); + document.removeEventListener( 'keypress', this.onDocumentKeyPress, false ); + + } + + /** + * Add a custom key binding with optional description to + * be added to the help screen. + */ + addKeyBinding( binding, callback ) { + + if( typeof binding === 'object' && binding.keyCode ) { + this.bindings[binding.keyCode] = { + callback: callback, + key: binding.key, + description: binding.description + }; + } + else { + this.bindings[binding] = { + callback: callback, + key: null, + description: null + }; + } + + } + + /** + * Removes the specified custom key binding. + */ + removeKeyBinding( keyCode ) { + + delete this.bindings[keyCode]; + + } + + /** + * Programmatically triggers a keyboard event + * + * @param {int} keyCode + */ + triggerKey( keyCode ) { + + this.onDocumentKeyDown( { keyCode } ); + + } + + /** + * Registers a new shortcut to include in the help overlay + * + * @param {String} key + * @param {String} value + */ + registerKeyboardShortcut( key, value ) { + + this.shortcuts[key] = value; + + } + + getShortcuts() { + + return this.shortcuts; + + } + + getBindings() { + + return this.bindings; + + } + + /** + * Handler for the document level 'keypress' event. + * + * @param {object} event + */ + onDocumentKeyPress( event ) { + + // Check if the pressed key is question mark + if( event.shiftKey && event.charCode === 63 ) { + this.Reveal.toggleHelp(); + } + + } + + /** + * Handler for the document level 'keydown' event. + * + * @param {object} event + */ + onDocumentKeyDown( event ) { + + let config = this.Reveal.getConfig(); + + // If there's a condition specified and it returns false, + // ignore this event + if( typeof config.keyboardCondition === 'function' && config.keyboardCondition(event) === false ) { + return true; + } + + // If keyboardCondition is set, only capture keyboard events + // for embedded decks when they are focused + if( config.keyboardCondition === 'focused' && !this.Reveal.isFocused() ) { + return true; + } + + // Shorthand + let keyCode = event.keyCode; + + // Remember if auto-sliding was paused so we can toggle it + let autoSlideWasPaused = !this.Reveal.isAutoSliding(); + + this.Reveal.onUserInput( event ); + + // Is there a focused element that could be using the keyboard? + let activeElementIsCE = document.activeElement && document.activeElement.isContentEditable === true; + let activeElementIsInput = document.activeElement && document.activeElement.tagName && /input|textarea/i.test( document.activeElement.tagName ); + let activeElementIsNotes = document.activeElement && document.activeElement.className && /speaker-notes/i.test( document.activeElement.className); + + // Whitelist certain modifiers for slide navigation shortcuts + let isNavigationKey = [32, 37, 38, 39, 40, 78, 80].indexOf( event.keyCode ) !== -1; + + // Prevent all other events when a modifier is pressed + let unusedModifier = !( isNavigationKey && event.shiftKey || event.altKey ) && + ( event.shiftKey || event.altKey || event.ctrlKey || event.metaKey ); + + // Disregard the event if there's a focused element or a + // keyboard modifier key is present + if( activeElementIsCE || activeElementIsInput || activeElementIsNotes || unusedModifier ) return; + + // While paused only allow resume keyboard events; 'b', 'v', '.' + let resumeKeyCodes = [66,86,190,191]; + let key; + + // Custom key bindings for togglePause should be able to resume + if( typeof config.keyboard === 'object' ) { + for( key in config.keyboard ) { + if( config.keyboard[key] === 'togglePause' ) { + resumeKeyCodes.push( parseInt( key, 10 ) ); + } + } + } + + if( this.Reveal.isPaused() && resumeKeyCodes.indexOf( keyCode ) === -1 ) { + return false; + } + + // Use linear navigation if we're configured to OR if + // the presentation is one-dimensional + let useLinearMode = config.navigationMode === 'linear' || !this.Reveal.hasHorizontalSlides() || !this.Reveal.hasVerticalSlides(); + + let triggered = false; + + // 1. User defined key bindings + if( typeof config.keyboard === 'object' ) { + + for( key in config.keyboard ) { + + // Check if this binding matches the pressed key + if( parseInt( key, 10 ) === keyCode ) { + + let value = config.keyboard[ key ]; + + // Callback function + if( typeof value === 'function' ) { + value.apply( null, [ event ] ); + } + // String shortcuts to reveal.js API + else if( typeof value === 'string' && typeof this.Reveal[ value ] === 'function' ) { + this.Reveal[ value ].call(); + } + + triggered = true; + + } + + } + + } + + // 2. Registered custom key bindings + if( triggered === false ) { + + for( key in this.bindings ) { + + // Check if this binding matches the pressed key + if( parseInt( key, 10 ) === keyCode ) { + + let action = this.bindings[ key ].callback; + + // Callback function + if( typeof action === 'function' ) { + action.apply( null, [ event ] ); + } + // String shortcuts to reveal.js API + else if( typeof action === 'string' && typeof this.Reveal[ action ] === 'function' ) { + this.Reveal[ action ].call(); + } + + triggered = true; + } + } + } + + // 3. System defined key bindings + if( triggered === false ) { + + // Assume true and try to prove false + triggered = true; + + // P, PAGE UP + if( keyCode === 80 || keyCode === 33 ) { + this.Reveal.prev({skipFragments: event.altKey}); + } + // N, PAGE DOWN + else if( keyCode === 78 || keyCode === 34 ) { + this.Reveal.next({skipFragments: event.altKey}); + } + // H, LEFT + else if( keyCode === 72 || keyCode === 37 ) { + if( event.shiftKey ) { + this.Reveal.slide( 0 ); + } + else if( !this.Reveal.overview.isActive() && useLinearMode ) { + this.Reveal.prev({skipFragments: event.altKey}); + } + else { + this.Reveal.left({skipFragments: event.altKey}); + } + } + // L, RIGHT + else if( keyCode === 76 || keyCode === 39 ) { + if( event.shiftKey ) { + this.Reveal.slide( this.Reveal.getHorizontalSlides().length - 1 ); + } + else if( !this.Reveal.overview.isActive() && useLinearMode ) { + this.Reveal.next({skipFragments: event.altKey}); + } + else { + this.Reveal.right({skipFragments: event.altKey}); + } + } + // K, UP + else if( keyCode === 75 || keyCode === 38 ) { + if( event.shiftKey ) { + this.Reveal.slide( undefined, 0 ); + } + else if( !this.Reveal.overview.isActive() && useLinearMode ) { + this.Reveal.prev({skipFragments: event.altKey}); + } + else { + this.Reveal.up({skipFragments: event.altKey}); + } + } + // J, DOWN + else if( keyCode === 74 || keyCode === 40 ) { + if( event.shiftKey ) { + this.Reveal.slide( undefined, Number.MAX_VALUE ); + } + else if( !this.Reveal.overview.isActive() && useLinearMode ) { + this.Reveal.next({skipFragments: event.altKey}); + } + else { + this.Reveal.down({skipFragments: event.altKey}); + } + } + // HOME + else if( keyCode === 36 ) { + this.Reveal.slide( 0 ); + } + // END + else if( keyCode === 35 ) { + this.Reveal.slide( this.Reveal.getHorizontalSlides().length - 1 ); + } + // SPACE + else if( keyCode === 32 ) { + if( this.Reveal.overview.isActive() ) { + this.Reveal.overview.deactivate(); + } + if( event.shiftKey ) { + this.Reveal.prev({skipFragments: event.altKey}); + } + else { + this.Reveal.next({skipFragments: event.altKey}); + } + } + // TWO-SPOT, SEMICOLON, B, V, PERIOD, LOGITECH PRESENTER TOOLS "BLACK SCREEN" BUTTON + else if( keyCode === 58 || keyCode === 59 || keyCode === 66 || keyCode === 86 || keyCode === 190 || keyCode === 191 ) { + this.Reveal.togglePause(); + } + // F + else if( keyCode === 70 ) { + enterFullscreen( config.embedded ? this.Reveal.getViewportElement() : document.documentElement ); + } + // A + else if( keyCode === 65 ) { + if ( config.autoSlideStoppable ) { + this.Reveal.toggleAutoSlide( autoSlideWasPaused ); + } + } + else { + triggered = false; + } + + } + + // If the input resulted in a triggered action we should prevent + // the browsers default behavior + if( triggered ) { + event.preventDefault && event.preventDefault(); + } + // ESC or O key + else if( keyCode === 27 || keyCode === 79 ) { + if( this.Reveal.closeOverlay() === false ) { + this.Reveal.overview.toggle(); + } + + event.preventDefault && event.preventDefault(); + } + + // If auto-sliding is enabled we need to cue up + // another timeout + this.Reveal.cueAutoSlide(); + + } + +} \ No newline at end of file diff --git a/static/presentations/2021-11-13/garage/js/controllers/location.js b/static/presentations/2021-11-13/garage/js/controllers/location.js new file mode 100644 index 0000000..da203f8 --- /dev/null +++ b/static/presentations/2021-11-13/garage/js/controllers/location.js @@ -0,0 +1,215 @@ +/** + * Reads and writes the URL based on reveal.js' current state. + */ +export default class Location { + + constructor( Reveal ) { + + this.Reveal = Reveal; + + // Delays updates to the URL due to a Chrome thumbnailer bug + this.writeURLTimeout = 0; + + this.onWindowHashChange = this.onWindowHashChange.bind( this ); + + } + + bind() { + + window.addEventListener( 'hashchange', this.onWindowHashChange, false ); + + } + + unbind() { + + window.removeEventListener( 'hashchange', this.onWindowHashChange, false ); + + } + + /** + * Returns the slide indices for the given hash link. + * + * @param {string} [hash] the hash string that we want to + * find the indices for + * + * @returns slide indices or null + */ + getIndicesFromHash( hash=window.location.hash ) { + + // Attempt to parse the hash as either an index or name + let name = hash.replace( /^#\/?/, '' ); + let bits = name.split( '/' ); + + // If the first bit is not fully numeric and there is a name we + // can assume that this is a named link + if( !/^[0-9]*$/.test( bits[0] ) && name.length ) { + let element; + + let f; + + // Parse named links with fragments (#/named-link/2) + if( /\/[-\d]+$/g.test( name ) ) { + f = parseInt( name.split( '/' ).pop(), 10 ); + f = isNaN(f) ? undefined : f; + name = name.split( '/' ).shift(); + } + + // Ensure the named link is a valid HTML ID attribute + try { + element = document.getElementById( decodeURIComponent( name ) ); + } + catch ( error ) { } + + if( element ) { + return { ...this.Reveal.getIndices( element ), f }; + } + } + else { + const config = this.Reveal.getConfig(); + let hashIndexBase = config.hashOneBasedIndex ? 1 : 0; + + // Read the index components of the hash + let h = ( parseInt( bits[0], 10 ) - hashIndexBase ) || 0, + v = ( parseInt( bits[1], 10 ) - hashIndexBase ) || 0, + f; + + if( config.fragmentInURL ) { + f = parseInt( bits[2], 10 ); + if( isNaN( f ) ) { + f = undefined; + } + } + + return { h, v, f }; + } + + // The hash couldn't be parsed or no matching named link was found + return null + + } + + /** + * Reads the current URL (hash) and navigates accordingly. + */ + readURL() { + + const currentIndices = this.Reveal.getIndices(); + const newIndices = this.getIndicesFromHash(); + + if( newIndices && ( newIndices.h !== currentIndices.h || newIndices.v !== currentIndices.v || newIndices.f !== undefined ) ) { + this.Reveal.slide( newIndices.h, newIndices.v, newIndices.f ); + } + else { + this.Reveal.slide( currentIndices.h || 0, currentIndices.v || 0 ); + } + + } + + /** + * Updates the page URL (hash) to reflect the current + * state. + * + * @param {number} delay The time in ms to wait before + * writing the hash + */ + writeURL( delay ) { + + let config = this.Reveal.getConfig(); + let currentSlide = this.Reveal.getCurrentSlide(); + + // Make sure there's never more than one timeout running + clearTimeout( this.writeURLTimeout ); + + // If a delay is specified, timeout this call + if( typeof delay === 'number' ) { + this.writeURLTimeout = setTimeout( this.writeURL, delay ); + } + else if( currentSlide ) { + + let hash = this.getHash(); + + // If we're configured to push to history OR the history + // API is not avaialble. + if( config.history ) { + window.location.hash = hash; + } + // If we're configured to reflect the current slide in the + // URL without pushing to history. + else if( config.hash ) { + // If the hash is empty, don't add it to the URL + if( hash === '/' ) { + window.history.replaceState( null, null, window.location.pathname + window.location.search ); + } + else { + window.history.replaceState( null, null, '#' + hash ); + } + } + // UPDATE: The below nuking of all hash changes breaks + // anchors on pages where reveal.js is running. Removed + // in 4.0. Why was it here in the first place? ¯\_(ツ)_/¯ + // + // If history and hash are both disabled, a hash may still + // be added to the URL by clicking on a href with a hash + // target. Counter this by always removing the hash. + // else { + // window.history.replaceState( null, null, window.location.pathname + window.location.search ); + // } + + } + + } + + /** + * Return a hash URL that will resolve to the given slide location. + * + * @param {HTMLElement} [slide=currentSlide] The slide to link to + */ + getHash( slide ) { + + let url = '/'; + + // Attempt to create a named link based on the slide's ID + let s = slide || this.Reveal.getCurrentSlide(); + let id = s ? s.getAttribute( 'id' ) : null; + if( id ) { + id = encodeURIComponent( id ); + } + + let index = this.Reveal.getIndices( slide ); + if( !this.Reveal.getConfig().fragmentInURL ) { + index.f = undefined; + } + + // If the current slide has an ID, use that as a named link, + // but we don't support named links with a fragment index + if( typeof id === 'string' && id.length ) { + url = '/' + id; + + // If there is also a fragment, append that at the end + // of the named link, like: #/named-link/2 + if( index.f >= 0 ) url += '/' + index.f; + } + // Otherwise use the /h/v index + else { + let hashIndexBase = this.Reveal.getConfig().hashOneBasedIndex ? 1 : 0; + if( index.h > 0 || index.v > 0 || index.f >= 0 ) url += index.h + hashIndexBase; + if( index.v > 0 || index.f >= 0 ) url += '/' + (index.v + hashIndexBase ); + if( index.f >= 0 ) url += '/' + index.f; + } + + return url; + + } + + /** + * Handler for the window level 'hashchange' event. + * + * @param {object} [event] + */ + onWindowHashChange( event ) { + + this.readURL(); + + } + +} \ No newline at end of file diff --git a/static/presentations/2021-11-13/garage/js/controllers/notes.js b/static/presentations/2021-11-13/garage/js/controllers/notes.js new file mode 100644 index 0000000..8ec1d42 --- /dev/null +++ b/static/presentations/2021-11-13/garage/js/controllers/notes.js @@ -0,0 +1,114 @@ +/** + * Handles the showing and + */ +export default class Notes { + + constructor( Reveal ) { + + this.Reveal = Reveal; + + } + + render() { + + this.element = document.createElement( 'div' ); + this.element.className = 'speaker-notes'; + this.element.setAttribute( 'data-prevent-swipe', '' ); + this.element.setAttribute( 'tabindex', '0' ); + this.Reveal.getRevealElement().appendChild( this.element ); + + } + + /** + * Called when the reveal.js config is updated. + */ + configure( config, oldConfig ) { + + if( config.showNotes ) { + this.element.setAttribute( 'data-layout', typeof config.showNotes === 'string' ? config.showNotes : 'inline' ); + } + + } + + /** + * Pick up notes from the current slide and display them + * to the viewer. + * + * @see {@link config.showNotes} + */ + update() { + + if( this.Reveal.getConfig().showNotes && this.element && this.Reveal.getCurrentSlide() && !this.Reveal.print.isPrintingPDF() ) { + + this.element.innerHTML = this.getSlideNotes() || 'No notes on this slide.'; + + } + + } + + /** + * Updates the visibility of the speaker notes sidebar that + * is used to share annotated slides. The notes sidebar is + * only visible if showNotes is true and there are notes on + * one or more slides in the deck. + */ + updateVisibility() { + + if( this.Reveal.getConfig().showNotes && this.hasNotes() && !this.Reveal.print.isPrintingPDF() ) { + this.Reveal.getRevealElement().classList.add( 'show-notes' ); + } + else { + this.Reveal.getRevealElement().classList.remove( 'show-notes' ); + } + + } + + /** + * Checks if there are speaker notes for ANY slide in the + * presentation. + */ + hasNotes() { + + return this.Reveal.getSlidesElement().querySelectorAll( '[data-notes], aside.notes' ).length > 0; + + } + + /** + * Checks if this presentation is running inside of the + * speaker notes window. + * + * @return {boolean} + */ + isSpeakerNotesWindow() { + + return !!window.location.search.match( /receiver/gi ); + + } + + /** + * Retrieves the speaker notes from a slide. Notes can be + * defined in two ways: + * 1. As a data-notes attribute on the slide
+ * 2. As an