From 03ef9e84264f27aed33f1ba061b9d12b720efd51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Tessier?= Date: Thu, 31 May 2018 21:17:15 +0200 Subject: [PATCH] js .active --- .../config/master-dev.anissabensalah.net.php | 6 +- ...ck-g-ed27243a => problem-check-g-5641766c} | 0 logs/popularity/daily.json | 2 +- logs/popularity/monthly.json | 2 +- logs/popularity/totals.json | 2 +- logs/popularity/visitors.json | 2 +- user/pages/01.home/01.fullvideo/default.fr.md | 2 +- .../pages/01.home/05._presse/submodular.fr.md | 5 + .../anissabensalah/css-compiled/theme.css | 22 +- .../anissabensalah/css-compiled/theme.min.css | 2 +- user/themes/anissabensalah/js/fullPage.js | 2923 +++++++++++++++++ user/themes/anissabensalah/js/script.js | 44 +- .../anissabensalah/scss/theme/fonts.scss | 9 + .../anissabensalah/scss/theme/section.scss | 20 +- .../templates/modular.html.twig | 5 +- .../templates/modular/submodular.html.twig | 8 +- .../templates/partials/base.html.twig | 1 + 17 files changed, 3026 insertions(+), 29 deletions(-) rename cache/{problem-check-g-ed27243a => problem-check-g-5641766c} (100%) create mode 100644 user/themes/anissabensalah/js/fullPage.js diff --git a/cache/compiled/config/master-dev.anissabensalah.net.php b/cache/compiled/config/master-dev.anissabensalah.net.php index 01b3660..c538648 100644 --- a/cache/compiled/config/master-dev.anissabensalah.net.php +++ b/cache/compiled/config/master-dev.anissabensalah.net.php @@ -1,8 +1,8 @@ 'Grav\\Common\\Config\\CompiledConfig', - 'timestamp' => 1527510262, - 'checksum' => '966a75fa838dc63243fdf4d7f492641d', + 'timestamp' => 1527792035, + 'checksum' => '6003cc4fd70e7155212fea1b40abb28c', 'files' => [ 'user/config' => [ 'media' => [ @@ -11,7 +11,7 @@ return [ ], 'plugins/youtube' => [ 'file' => 'user/config/plugins/youtube.yaml', - 'modified' => 1527106076 + 'modified' => 1527792035 ], 'security' => [ 'file' => 'user/config/security.yaml', diff --git a/cache/problem-check-g-ed27243a b/cache/problem-check-g-5641766c similarity index 100% rename from cache/problem-check-g-ed27243a rename to cache/problem-check-g-5641766c diff --git a/logs/popularity/daily.json b/logs/popularity/daily.json index 7065edc..6154520 100644 --- a/logs/popularity/daily.json +++ b/logs/popularity/daily.json @@ -1 +1 @@ -{"23-05-2018":157,"24-05-2018":194,"25-05-2018":212,"28-05-2018":287,"29-05-2018":82,"30-05-2018":86,"31-05-2018":163} \ No newline at end of file +{"23-05-2018":157,"24-05-2018":194,"25-05-2018":212,"28-05-2018":287,"29-05-2018":82,"30-05-2018":86,"31-05-2018":252} \ No newline at end of file diff --git a/logs/popularity/monthly.json b/logs/popularity/monthly.json index bfdf954..485ccef 100644 --- a/logs/popularity/monthly.json +++ b/logs/popularity/monthly.json @@ -1 +1 @@ -{"05-2018":1181} \ No newline at end of file +{"05-2018":1270} \ No newline at end of file diff --git a/logs/popularity/totals.json b/logs/popularity/totals.json index 89494e7..aa9648e 100644 --- a/logs/popularity/totals.json +++ b/logs/popularity/totals.json @@ -1 +1 @@ -{"\/":1171,"\/typography":1,"\/home\/prochaines-dates":2,"\/home\/biographie":2,"\/home\/videos":3,"\/home\/photographies":1,"\/photographies":1} \ No newline at end of file +{"\/":1260,"\/typography":1,"\/home\/prochaines-dates":2,"\/home\/biographie":2,"\/home\/videos":3,"\/home\/photographies":1,"\/photographies":1} \ No newline at end of file diff --git a/logs/popularity/visitors.json b/logs/popularity/visitors.json index f9c839e..38328df 100644 --- a/logs/popularity/visitors.json +++ b/logs/popularity/visitors.json @@ -1 +1 @@ -{"4b84b15bff6ee5796152495a230e45e3d7e947d9":1527780874} \ No newline at end of file +{"4b84b15bff6ee5796152495a230e45e3d7e947d9":1527794010} \ No newline at end of file diff --git a/user/pages/01.home/01.fullvideo/default.fr.md b/user/pages/01.home/01.fullvideo/default.fr.md index 9d8897f..7f43dac 100644 --- a/user/pages/01.home/01.fullvideo/default.fr.md +++ b/user/pages/01.home/01.fullvideo/default.fr.md @@ -2,4 +2,4 @@ title: fullvideo --- -[plugin:youtube](https://www.youtube.com/watch?v=atTcasPy3JY) +[plugin:youtube](https://www.youtube.com/watch?v=atTcasPy3JY) \ No newline at end of file diff --git a/user/pages/01.home/05._presse/submodular.fr.md b/user/pages/01.home/05._presse/submodular.fr.md index 3813868..34ab1f8 100644 --- a/user/pages/01.home/05._presse/submodular.fr.md +++ b/user/pages/01.home/05._presse/submodular.fr.md @@ -5,3 +5,8 @@ content: items: - '@self.modular' --- + +« Elle chante le forró avec un cœur vaudou, +arrange une chanson arabe façon bossa +et invente le jazz andalou au pays du candomblé » +Anne Berthod, Télérama \ No newline at end of file diff --git a/user/themes/anissabensalah/css-compiled/theme.css b/user/themes/anissabensalah/css-compiled/theme.css index bb504a9..79c1459 100644 --- a/user/themes/anissabensalah/css-compiled/theme.css +++ b/user/themes/anissabensalah/css-compiled/theme.css @@ -22,6 +22,8 @@ body #header .language-selector li:nth-child(-n+2)::after { font-size: 1.512rem; body #start .content p { font-size: 1rem; font-family: "Montserrat-Light"; font-weight: normal; line-height: 2rem; } +body #start .citation p { font-size: 1rem; font-family: "Montserrat-Regular"; font-weight: normal; line-height: 2rem; color: white; } + body #start #home h1, body #start #contact h1 { font-family: "Montserrat-Thin"; font-weight: normal; font-size: 30vw; } body #start #home p, body #start #home a, body #start #contact p, body #start #contact a { font-size: 1rem; color: white; font-family: "Montserrat-Light"; } @@ -60,13 +62,17 @@ body #start .chap > a:nth-of-type(2)::before { margin: 0 5px; content: "-"; colo #header .navigation li a { position: relative; margin: auto; } +#start > div { height: 100vh; } + #start div:nth-child(n+3) { display: -ms-flexbox; display: flex; } #start div:nth-child(n+3):nth-child(even) { -ms-flex-direction: row-reverse; flex-direction: row-reverse; } -#start div:nth-child(n+3) > div { width: 50%; height: 100vh; overflow: auto; } +#start div:nth-child(n+3) > div { width: 50%; overflow: auto; } -#start div:nth-child(n+3) > div:first-child { display: -ms-flexbox; display: flex; background-image: linear-gradient(#98272D, #4f100B); } +#start div:nth-child(n+3) > div:first-child { position: relative; display: -ms-flexbox; display: flex; -ms-flex-direction: column; flex-direction: column; -ms-flex-pack: center; justify-content: center; background-image: linear-gradient(#98272D, #4f100B); } + +#start div:nth-child(n+3) > div:first-child .citation { text-align: center; position: absolute; top: 20%; width: 450px; left: 50%; margin-left: -225px; } #start div:nth-child(n+3) > div:first-child .chap { margin: auto; text-align: center; } @@ -80,7 +86,7 @@ body #start .chap > a:nth-of-type(2)::before { margin: 0 5px; content: "-"; colo #start .grav-youtube { margin: 0; } -#start #home { display: -ms-flexbox; display: flex; height: 100vh; } +#start #home { display: -ms-flexbox; display: flex; } #start #home .visu-album { position: absolute; } @@ -110,13 +116,13 @@ body #start .chap > a:nth-of-type(2)::before { margin: 0 5px; content: "-"; colo #start #presse #sovaj, #start #presse #matriz { display: -ms-flexbox; display: flex; -ms-flex-flow: wrap; flex-flow: wrap; -ms-flex-pack: center; justify-content: center; margin-bottom: 100px; } -#start #presse p { font-size: 0.882rem !important; line-height: 1.2rem; } +#start #presse #sovaj p, #start #presse #matriz p { font-size: 0.882rem !important; line-height: 1.2rem; } -#start #presse p:nth-of-type(1) { padding: 0 50px; margin-top: 100px; } +#start #presse #sovaj p:nth-of-type(1), #start #presse #matriz p:nth-of-type(1) { padding: 0 50px; margin-top: 100px; } -#start #presse p:not(:nth-of-type(1)) { width: 50%; height: auto; } +#start #presse #sovaj p:not(:nth-of-type(1)), #start #presse #matriz p:not(:nth-of-type(1)) { width: 50%; height: auto; } -#start #presse p:not(:nth-of-type(1)) img { width: 20%; height: auto; margin: 20px 0; } +#start #presse #sovaj p:not(:nth-of-type(1)) img, #start #presse #matriz p:not(:nth-of-type(1)) img { width: 20%; height: auto; margin: 20px 0; } #start #contact { background-image: linear-gradient(#98272D, #4f100B); display: -ms-flexbox; display: flex; width: 100%; height: 100vh; } @@ -126,4 +132,4 @@ body #start .chap > a:nth-of-type(2)::before { margin: 0 5px; content: "-"; colo #start #contact #Contact p strong { line-height: 3rem; } -/*# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhlbWUuY3NzIiwic291cmNlcyI6WyJ0aGVtZS5zY3NzIiwidGhlbWUvcmVzZXQuc2NzcyIsImNvbmZpZy9taXhpbnMvX2ZvbnRzLnNjc3MiLCJ0aGVtZS9mb250cy5zY3NzIiwidGhlbWUvaGVhZGVyLnNjc3MiLCJ0aGVtZS9uYXYuc2NzcyIsInRoZW1lL3NlY3Rpb24uc2NzcyIsInRoZW1lL2Zvb3Rlci5zY3NzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIENvcmUgdmFyaWFibGVzIGFuZCBtaXhpbnNcbi8vIEBpbXBvcnQgJ3NwZWN0cmUvdmFyaWFibGVzJztcbi8vIEBpbXBvcnQgJ3NwZWN0cmUvbWl4aW5zJztcbi8vXG4vLyBAaW1wb3J0ICd0aGVtZS92YXJpYWJsZXMnO1xuLy8gQGltcG9ydCAndGhlbWUvbWl4aW5zJztcbi8vIEBpbXBvcnQgJ3RoZW1lL2ZyYW1ld29yayc7XG4vLyBAaW1wb3J0ICd0aGVtZS90eXBvZ3JhcGh5Jztcbi8vIEBpbXBvcnQgJ3RoZW1lL2Zvcm1zJztcbi8vIEBpbXBvcnQgJ3RoZW1lL21vYmlsZSc7XG4vLyBAaW1wb3J0ICd0aGVtZS9hbmltYXRpb24nO1xuLy9cbi8vXG5cbkBpbXBvcnQgJ3RoZW1lL3Jlc2V0JztcbkBpbXBvcnQgJ2NvbmZpZy9taXhpbnMvZm9udHMnO1xuQGltcG9ydCAndGhlbWUvZm9udHMnO1xuXG5AaW1wb3J0ICd0aGVtZS9oZWFkZXInO1xuQGltcG9ydCAndGhlbWUvbmF2JztcbkBpbXBvcnQgJ3RoZW1lL3NlY3Rpb24nO1xuQGltcG9ydCAndGhlbWUvZm9vdGVyJztcblxuLy8gQGltcG9ydCAndGhlbWUvZm9vdGVyJztcbi8vIEBpbXBvcnQgJ3RoZW1lL21lbnUnO1xuLy9cbi8vIC8vIEV4dHJhIFNrZWxldG9uIFN0eWxpbmdcbi8vIEBpbXBvcnQgJ3RoZW1lL2Jsb2cnO1xuLy8gQGltcG9ydCAndGhlbWUvb25lcGFnZSc7XG4iLCIqe1xuICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIC1tb3otYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbn1cblxuaHRtbCwgYm9keXtcbiAgbWFyZ2luOiAwO1xuICBwYWRkaW5nOiAwO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGZvbnQtc2l6ZTogMXJlbTtcbn1cblxudWwsIGxpLCBvbHtcbiAgbWFyZ2luOiAwO1xuICBwYWRkaW5nOiAwO1xuICBsaXN0LXN0eWxlOiBub25lO1xufVxuXG5he1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gIGNvbG9yOiBibGFjaztcbn1cblxucCwgdWwsIGxpLCBvbCwgaDEsIGgyLCBoMywgZW0sIGJsb2NrcXVvdGV7XG4gIG1hcmdpbjogMDtcbn1cblxuaW1ne1xuICB3aWR0aDogMTAwJTtcbiAgdmVydGljYWwtYWxpZ246IGJvdHRvbTtcbiAgaGVpZ2h0OiBhdXRvO1xufVxuIiwiLy8gRm9udCBGYW1pbHlcbiRmb250LWZhbWlseS1kZWZhdWx0OiAgXHRcdFx0XCJSYWxld2F5XCIsIFwiSGVsdmV0aWNhXCIsIFwiVGFob21hXCIsIFwiR2VuZXZhXCIsIFwiQXJpYWxcIiwgc2Fucy1zZXJpZjtcbiRmb250LWZhbWlseS1oZWFkZXI6ICBcdFx0XHRcIk1vbnRzZXJyYXRcIiwgXCJIZWx2ZXRpY2FcIiwgXCJUYWhvbWFcIiwgXCJHZW5ldmFcIiwgXCJBcmlhbFwiLCBzYW5zLXNlcmlmO1xuJGZvbnQtZmFtaWx5LW1vbm86IFx0XHRcdFx0XCJJbmNvbnNvbGF0YVwiLCBtb25vc3BhY2U7XG4kZm9udC1mYW1pbHktc2VyaWY6XHRcdFx0XHRcIkdlb3JnaWFcIiwgXCJUaW1lc1wiLCBcIlRpbWVzIE5ldyBSb21hblwiLCBzZXJpZjtcbiRpY29uczogXHRcdFx0XHRcdFx0XCJGb250QXdlc29tZVwiO1xuXG4vLyBAZm9udC1mYWNlXG5cbiRSZWd1bGFyOiBcIk1vbnRzZXJyYXQtUmVndWxhclwiO1xuJGZhbWlseTogXCJNb250c2VycmF0L3dlYmZvbnRzXCI7XG4kZmlsZS1yZWd1bGFyOiBcIk1vbnRzZXJyYXQtUmVndWxhclwiO1xuJGNhdGVnb3J5OiBcInNhbnMtc2VyaWZcIjtcblxuQG1peGluIE1vbnRzZXJyYXQtUmVndWxhcigkUmVndWxhciwgJGZpbGUtcmVndWxhciwgJGZhbWlseSwgJGNhdGVnb3J5OlwiXCIpIHtcbiAgICAkZmlsZXBhdGg6IFwiLi4vZm9udHMvXCIgKyAkZmFtaWx5ICsgXCIvXCIgKyAkZmlsZS1yZWd1bGFyO1xuICAgIEBmb250LWZhY2Uge1xuICAgICAgICBmb250LWZhbWlseTogXCIjeyRSZWd1bGFyfVwiO1xuICAgICAgICBzcmM6IHVybCgkZmlsZXBhdGggKyBcIi5lb3RcIik7XG4gICAgICAgIHNyYzogdXJsKCRmaWxlcGF0aCArIFwiLmVvdD8jaWVmaXhcIikgZm9ybWF0KCdlbWJlZGRlZC1vcGVudHlwZScpLFxuICAgICAgICAgICAgICB1cmwoJGZpbGVwYXRoICsgXCIud29mZlwiKSBmb3JtYXQoJ3dvZmYnKSxcbiAgICAgICAgICAgICAgdXJsKCRmaWxlcGF0aCArIFwiLnR0ZlwiKSAgZm9ybWF0KCd0cnVldHlwZScpLFxuICAgICAgICAgICAgICB1cmwoJGZpbGVwYXRoICsgXCIuc3ZnI1wiICsgJFJlZ3VsYXIgKyBcIlwiKSBmb3JtYXQoJ3N2ZycpO1xuICAgIH1cblxuICAgICUjeyRSZWd1bGFyfSB7XG4gICAgICAgIGZvbnQ6IHtcbiAgICAgICAgICAgIEBpZiAkY2F0ZWdvcnkgIT0gXCJcIiB7XG4gICAgICAgICAgICAgICAgZmFtaWx5OiBcIiN7JFJlZ3VsYXJ9XCIsICN7JGNhdGVnb3J5fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBlbHNlIHtcbiAgICAgICAgICAgICAgICBmYW1pbHk6IFwiI3skUmVndWxhcn1cIjtcbiAgICAgICAgICAgICAgICB3ZWlnaHQ6IG5vcm1hbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuJGxpZ2h0OiBcIk1vbnRzZXJyYXQtTGlnaHRcIjtcbiRmYW1pbHk6IFwiTW9udHNlcnJhdC93ZWJmb250c1wiO1xuJGZpbGUtbGlnaHQ6IFwiTW9udHNlcnJhdC1MaWdodFwiO1xuJGNhdGVnb3J5OiBcInNhbnMtc2VyaWZcIjtcblxuQG1peGluIE1vbnRzZXJyYXQtbGlnaHQoJGxpZ2h0LCAkZmlsZS1saWdodCwgJGZhbWlseSwgJGNhdGVnb3J5OlwiXCIpIHtcbiAgICAkZmlsZXBhdGg6IFwiLi4vZm9udHMvXCIgKyAkZmFtaWx5ICsgXCIvXCIgKyAkZmlsZS1saWdodDtcbiAgICBAZm9udC1mYWNlIHtcbiAgICAgICAgZm9udC1mYW1pbHk6IFwiI3skbGlnaHR9XCI7XG4gICAgICAgIHNyYzogdXJsKCRmaWxlcGF0aCArIFwiLmVvdFwiKTtcbiAgICAgICAgc3JjOiB1cmwoJGZpbGVwYXRoICsgXCIuZW90PyNpZWZpeFwiKSBmb3JtYXQoJ2VtYmVkZGVkLW9wZW50eXBlJyksXG4gICAgICAgICAgICAgIHVybCgkZmlsZXBhdGggKyBcIi53b2ZmXCIpIGZvcm1hdCgnd29mZicpLFxuICAgICAgICAgICAgICB1cmwoJGZpbGVwYXRoICsgXCIudHRmXCIpICBmb3JtYXQoJ3RydWV0eXBlJyksXG4gICAgICAgICAgICAgIHVybCgkZmlsZXBhdGggKyBcIi5zdmcjXCIgKyAkbGlnaHQgKyBcIlwiKSBmb3JtYXQoJ3N2ZycpO1xuICAgIH1cblxuICAgICUjeyRsaWdodH0ge1xuICAgICAgICBmb250OiB7XG4gICAgICAgICAgICBAaWYgJGNhdGVnb3J5ICE9IFwiXCIge1xuICAgICAgICAgICAgICAgIGZhbWlseTogXCIjeyRsaWdodH1cIiwgI3skY2F0ZWdvcnl9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGVsc2Uge1xuICAgICAgICAgICAgICAgIGZhbWlseTogXCIjeyRsaWdodH1cIjtcbiAgICAgICAgICAgICAgICB3ZWlnaHQ6IG5vcm1hbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuJFRoaW46IFwiTW9udHNlcnJhdC1UaGluXCI7XG4kZmFtaWx5OiBcIk1vbnRzZXJyYXQvd2ViZm9udHNcIjtcbiRmaWxlLVRoaW46IFwiTW9udHNlcnJhdC1UaGluXCI7XG4kY2F0ZWdvcnk6IFwic2Fucy1zZXJpZlwiO1xuXG5AbWl4aW4gTW9udHNlcnJhdC1UaGluKCRUaGluLCAkZmlsZS1UaGluLCAkZmFtaWx5LCAkY2F0ZWdvcnk6XCJcIikge1xuICAgICRmaWxlcGF0aDogXCIuLi9mb250cy9cIiArICRmYW1pbHkgKyBcIi9cIiArICRmaWxlLVRoaW47XG4gICAgQGZvbnQtZmFjZSB7XG4gICAgICAgIGZvbnQtZmFtaWx5OiBcIiN7JFRoaW59XCI7XG4gICAgICAgIHNyYzogdXJsKCRmaWxlcGF0aCArIFwiLmVvdFwiKTtcbiAgICAgICAgc3JjOiB1cmwoJGZpbGVwYXRoICsgXCIuZW90PyNpZWZpeFwiKSBmb3JtYXQoJ2VtYmVkZGVkLW9wZW50eXBlJyksXG4gICAgICAgICAgICAgIHVybCgkZmlsZXBhdGggKyBcIi53b2ZmXCIpIGZvcm1hdCgnd29mZicpLFxuICAgICAgICAgICAgICB1cmwoJGZpbGVwYXRoICsgXCIudHRmXCIpICBmb3JtYXQoJ3RydWV0eXBlJyksXG4gICAgICAgICAgICAgIHVybCgkZmlsZXBhdGggKyBcIi5zdmcjXCIgKyAkVGhpbiArIFwiXCIpIGZvcm1hdCgnc3ZnJyk7XG4gICAgfVxuXG4gICAgJSN7JFRoaW59IHtcbiAgICAgICAgZm9udDoge1xuICAgICAgICAgICAgQGlmICRjYXRlZ29yeSAhPSBcIlwiIHtcbiAgICAgICAgICAgICAgICBmYW1pbHk6IFwiI3skVGhpbn1cIiwgI3skY2F0ZWdvcnl9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGVsc2Uge1xuICAgICAgICAgICAgICAgIGZhbWlseTogXCIjeyRUaGlufVwiO1xuICAgICAgICAgICAgICAgIHdlaWdodDogbm9ybWFsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG4vLyBmb250LXNpemVcbiRmb250MTQ6IDAuODgycmVtO1xuJGZvbnQxNjogMXJlbTtcbiRmb250MTg6IDEuMTM0cmVtO1xuJGZvbnQyMTogMS4zMjNyZW07XG4kZm9udDIyOiAxLjM3NXJlbTtcbiRmb250MjQ6IDEuNTEycmVtO1xuJGZvbnQzMjogMnJlbTtcbiRmb250MzY6IDIuMjY4cmVtO1xuJGZvbnQ0ODogMy4wMjRyZW07XG4kZm9udDcyOiA0LjVyZW07XG5cbi8vICRmb250aDE6IDJyZW07XG4vLyAkZm9udGgyOiAxLjVyZW07XG4vLyAkZm9udGgzOiAxcmVtO1xuLy8gJGZvbnRwOiAxcmVtO1xuIiwiQGluY2x1ZGUgTW9udHNlcnJhdC1SZWd1bGFyKCRSZWd1bGFyLCAkZmlsZS1yZWd1bGFyLCAkZmFtaWx5LCAkY2F0ZWdvcnkpOy8vMVxuQGluY2x1ZGUgTW9udHNlcnJhdC1saWdodCgkbGlnaHQsICRmaWxlLWxpZ2h0LCAkZmFtaWx5LCAkY2F0ZWdvcnkpOy8vMVxuQGluY2x1ZGUgTW9udHNlcnJhdC1UaGluKCRUaGluLCAkZmlsZS1UaGluLCAkZmFtaWx5LCAkY2F0ZWdvcnkpOy8vMVxuXG5ib2R5e1xuICAjaGVhZGVye1xuICAgIGF7XG4gICAgICBmb250LWZhbWlseTogJFJlZ3VsYXI7XG4gICAgICBmb250LXNpemU6ICRmb250MjQ7XG4gICAgICBmb250LXdlaWdodDogbm9ybWFsO1xuICAgICAgY29sb3I6IHdoaXRlO1xuICAgIH1cbiAgICAubGFuZ3VhZ2Utc2VsZWN0b3J7XG4gICAgICBsaXtcbiAgICAgICAgJjpudGgtY2hpbGQoLW4rMil7XG4gICAgICAgICAgJjo6YWZ0ZXJ7XG4gICAgICAgICAgICBmb250LXNpemU6ICRmb250MjQ7XG4gICAgICAgICAgICBjb250ZW50OiBcIi1cIjtcbiAgICAgICAgICAgIGNvbG9yOiB3aGl0ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgI3N0YXJ0e1xuICAgIC5jb250ZW50e1xuICAgICAgcHtcbiAgICAgICAgZm9udC1zaXplOiAkZm9udDE2O1xuICAgICAgICBmb250LWZhbWlseTogJGxpZ2h0O1xuICAgICAgICBmb250LXdlaWdodDogbm9ybWFsO1xuICAgICAgICBsaW5lLWhlaWdodDogMnJlbTtcbiAgICAgIH1cbiAgICB9XG4gICAgI2hvbWUsICNjb250YWN0e1xuICAgICAgaDF7XG4gICAgICAgIGZvbnQtZmFtaWx5OiAkVGhpbjtcbiAgICAgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbiAgICAgICAgZm9udC1zaXplOiAzMHZ3O1xuICAgICAgfVxuICAgICAgcCwgYSB7XG4gICAgICAgIGZvbnQtc2l6ZTogJGZvbnQxNjtcbiAgICAgICAgY29sb3I6IHdoaXRlO1xuICAgICAgICBmb250LWZhbWlseTogJGxpZ2h0O1xuICAgICAgfVxuICAgIH1cblxuICAgIC5jaGFwe1xuICAgICAgY29sb3I6IHdoaXRlO1xuICAgICAgZm9udC1mYW1pbHk6ICRsaWdodDtcbiAgICAgIGgye1xuICAgICAgICBmb250LWZhbWlseTogJGxpZ2h0O1xuICAgICAgICBmb250LXdlaWdodDogbm9ybWFsO1xuICAgICAgICBmb250LXNpemU6ICRmb250NDg7XG4gICAgICB9XG4gICAgICBhe1xuICAgICAgICBmb250LWZhbWlseTogJFJlZ3VsYXI7XG4gICAgICAgIGZvbnQtc2l6ZTogJGZvbnQxNjtcbiAgICAgICAgY29sb3I6IHdoaXRlO1xuICAgICAgICB9XG4gICAgICAmID4gYXtcbiAgICAgICAgJjpudGgtb2YtdHlwZSgyKXtcbiAgICAgICAgICAmOjpiZWZvcmV7XG4gICAgICAgICAgICBtYXJnaW46IDAgNXB4O1xuICAgICAgICAgICAgY29udGVudDogXCItXCI7XG4gICAgICAgICAgICBjb2xvcjogd2hpdGU7XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiI2hlYWRlcntcbiAgcG9zaXRpb246IGZpeGVkO1xuICB6LWluZGV4OiA5OTk7XG4gIC5sYW5ndWFnZS1zZWxlY3RvcntcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBwb3NpdGlvbjogZml4ZWQ7XG4gICAgICB3aWR0aDogMTYwcHg7XG4gICAgICBsZWZ0OiA1MCU7XG4gICAgICBtYXJnaW4tdG9wOiAxMHB4O1xuICAgICAgbWFyZ2luLWxlZnQ6IC03NXB4O1xuICAgIGxpe1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICY6bnRoLWNoaWxkKC1uKzIpe1xuICAgICAgICAmOjphZnRlcntcbiAgICAgICAgICBtYXJnaW46IDAgMTBweDtcbiAgICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAubmF2aWdhdGlvbntcbiAgICBsaXtcbiAgICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICAgICY6Zmlyc3QtY2hpbGR7XG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgICB9XG4gICAgICAmOm50aC1jaGlsZCgyKXtcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDtcbiAgICAgICAgYm90dG9tOiAwO1xuICAgICAgICB3aWR0aDogNTAlO1xuICAgICAgfVxuICAgICAgJjpudGgtY2hpbGQoMyl7XG4gICAgICAgIG1hcmdpbi10b3A6IDEwcHg7XG4gICAgICAgIHRvcDogMDtcbiAgICAgICAgd2lkdGg6IDUwJTtcbiAgICAgIH1cbiAgICAgICY6bnRoLWNoaWxkKDQpe1xuICAgICAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xuICAgICAgICBib3R0b206IDA7XG4gICAgICAgIHdpZHRoOiA1MCU7XG4gICAgICAgIHJpZ2h0OiAwO1xuICAgICAgfVxuICAgICAgJjpudGgtY2hpbGQoNSl7XG4gICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTtcbiAgICAgICAgdG9wOiA1MCU7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICByaWdodDogLTUwJTtcbiAgICAgICAgbWFyZ2luLXJpZ2h0OiAyMnB4O1xuICAgICAgfVxuICAgICAgJjpudGgtY2hpbGQoNil7XG4gICAgICAgIHRyYW5zZm9ybTogcm90YXRlKC05MGRlZyk7XG4gICAgICAgIHRvcDogNTAlO1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgbGVmdDogLTUwJTtcbiAgICAgICAgbWFyZ2luLWxlZnQ6IDIycHg7XG4gICAgICB9XG4gICAgICAmOm50aC1jaGlsZCg3KXtcbiAgICAgICAgbWFyZ2luLXRvcDogMTBweDtcbiAgICAgICAgdG9wOiAwO1xuICAgICAgICByaWdodDogMDtcbiAgICAgICAgd2lkdGg6IDUwJTtcbiAgICAgIH1cbiAgICAgIGF7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgbWFyZ2luOiBhdXRvO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiIiwiI3N0YXJ0e1xuICBkaXY6bnRoLWNoaWxkKG4rMyl7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICAmOm50aC1jaGlsZChldmVuKXtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3ctcmV2ZXJzZTtcbiAgICB9XG4gICAgJiA+IGRpdntcbiAgICAgIHdpZHRoOiA1MCU7XG4gICAgICBoZWlnaHQ6IDEwMHZoO1xuICAgICAgb3ZlcmZsb3c6IGF1dG87XG4gICAgICAmOmZpcnN0LWNoaWxke1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQoIzk4MjcyRCwgIzRmMTAwQik7XG4gICAgICAgIC5jaGFwe1xuICAgICAgICAgIG1hcmdpbjogYXV0bztcbiAgICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICAgICAgLnJlc297XG4gICAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgICAgICAgICBtYXJnaW4tdG9wOiAxMHB4O1xuICAgICAgICAgICAgICBhOm50aC1vZi10eXBlKDEpe1xuICAgICAgICAgICAgICAgIG1hcmdpbi1yaWdodDogNXB4XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYTpudGgtb2YtdHlwZSgyKXtcbiAgICAgICAgICAgICAgICBtYXJnaW4tbGVmdDogNXB4O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gIC5jb250ZW50e1xuICAgIHB7XG4gICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICBtYXJnaW4tYm90dG9tOiAxNXB4O1xuICAgIH1cbiAgfVxuICAuZ3Jhdi15b3V0dWJle1xuICAgIG1hcmdpbjogMDtcbiAgfVxuICAjaG9tZXtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGhlaWdodDogMTAwdmg7XG4gICAgLnZpc3UtYWxidW17XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgfVxuICAgIC50aXRsZXtcbiAgICAgICAgei1pbmRleDogOTk4O1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC13cmFwOiB3cmFwO1xuICAgICAgaDF7XG4gICAgICAgIHdpZHRoOiAxMDB2dztcbiAgICAgICAgbWFyZ2luOiBhdXRvO1xuICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICB9XG4gICAgICBwe1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICAgICAgd2lkdGg6IDUwMHB4O1xuICAgICAgICBsZWZ0OiA1MCU7XG4gICAgICAgIG1hcmdpbi1sZWZ0OiAtMjUwcHg7XG4gICAgICAgIHRvcDogNzclO1xuICAgICAgICBpbWd7XG4gICAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgICAgICAgICBtYXJnaW4tdG9wOiA4cHg7XG4gICAgICAgICAgJjpudGgtb2YtdHlwZSgxKXtcbiAgICAgICAgICAgIHdpZHRoOiAyMHB4O1xuICAgICAgICAgICAgbWFyZ2luLXJpZ2h0OiA1cHg7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGF7XG4gICAgICAgICAgJjpsYXN0LWNoaWxke1xuICAgICAgICAgICAgaW1ne1xuICAgICAgICAgICAgICB3aWR0aDogMjhweDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC5yZXNve1xuICAgICAgICBtYXJnaW46IC0yMHB4IGF1dG8gMCBhdXRvO1xuICAgICAgICBhOm50aC1vZi10eXBlKDEpe1xuICAgICAgICAgIG1hcmdpbi1yaWdodDogNXB4XG4gICAgICAgIH1cbiAgICAgICAgYTpudGgtb2YtdHlwZSgyKXtcbiAgICAgICAgICBtYXJnaW4tbGVmdDogNXB4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gICNiaW9ncmFwaGllLCAjcHJvY2hhaW5lc19kYXRlc3tcbiAgICAuY29udGVudHtcbiAgICAgIHBhZGRpbmc6IDEwMHB4O1xuICAgICAgcDpsYXN0LWNoaWxke1xuICAgICAgICBtYXJnaW4tYm90dG9tOiAxMDBweDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuI3Bob3RvZ3JhcGhpZXtcbiAgcHtcbiAgICBtYXJnaW46IDA7XG4gIH1cbn1cbiAgI3ByZXNzZXtcbiAgICAjc292YWosICNtYXRyaXp7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1mbG93OiB3cmFwO1xuICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICBtYXJnaW4tYm90dG9tOiAxMDBweDtcbiAgICB9XG4gICAgICBwe1xuICAgICAgICBmb250LXNpemU6ICRmb250MTQhaW1wb3J0YW50O1xuICAgICAgICBsaW5lLWhlaWdodDogMS4ycmVtO1xuICAgICAgfVxuICAgICAgcDpudGgtb2YtdHlwZSgxKXtcbiAgICAgICAgcGFkZGluZzogMCA1MHB4O1xuICAgICAgICBtYXJnaW4tdG9wOiAxMDBweDtcbiAgICAgIH1cbiAgICAgIHB7XG4gICAgICAgICY6bm90KDpudGgtb2YtdHlwZSgxKSl7XG4gICAgICAgICAgd2lkdGg6IDUwJTtcbiAgICAgICAgICBoZWlnaHQ6IGF1dG87XG4gICAgICAgICAgaW1ne1xuICAgICAgICAgICAgd2lkdGg6IDIwJTtcbiAgICAgICAgICAgIGhlaWdodDogYXV0bztcbiAgICAgICAgICAgIG1hcmdpbjogMjBweCAwO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICB9XG5cbiAgI2NvbnRhY3R7XG4gICAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KCM5ODI3MkQsICM0ZjEwMEIpO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAxMDB2aDtcbiAgICAjQ29udGFjdHtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICBiYWNrZ3JvdW5kLWltYWdlOiBub25lO1xuICAgICAgaGVpZ2h0OiBhdXRvIWltcG9ydGFudDtcbiAgICAgIG1hcmdpbjogYXV0bztcbiAgICAgIHB7XG4gICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICAgICAgbWFyZ2luOiAwIGF1dG87XG4gICAgICAgIGxpbmUtaGVpZ2h0OiAxLjVyZW07XG4gICAgICAgIHN0cm9uZ3tcbiAgICAgICAgICBsaW5lLWhlaWdodDogM3JlbTtcbiAgICAgICAgfVxuICAgICAgfVxuICB9XG59XG59XG4iLCIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFDQUEsQUFBQSxDQUFDLENBQUEsRUFDQyxrQkFBa0IsRUFBRSxVQUFVLEVBQzlCLGVBQWUsRUFBRSxVQUFVLEVBQzNCLFVBQVUsRUFBRSxVQUFVLEdBQ3ZCOztBQUVELEFBQUEsSUFBSSxF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 */ +/*# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhlbWUuY3NzIiwic291cmNlcyI6WyJ0aGVtZS5zY3NzIiwidGhlbWUvcmVzZXQuc2NzcyIsImNvbmZpZy9taXhpbnMvX2ZvbnRzLnNjc3MiLCJ0aGVtZS9mb250cy5zY3NzIiwidGhlbWUvaGVhZGVyLnNjc3MiLCJ0aGVtZS9uYXYuc2NzcyIsInRoZW1lL3NlY3Rpb24uc2NzcyIsInRoZW1lL2Zvb3Rlci5zY3NzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIENvcmUgdmFyaWFibGVzIGFuZCBtaXhpbnNcbi8vIEBpbXBvcnQgJ3NwZWN0cmUvdmFyaWFibGVzJztcbi8vIEBpbXBvcnQgJ3NwZWN0cmUvbWl4aW5zJztcbi8vXG4vLyBAaW1wb3J0ICd0aGVtZS92YXJpYWJsZXMnO1xuLy8gQGltcG9ydCAndGhlbWUvbWl4aW5zJztcbi8vIEBpbXBvcnQgJ3RoZW1lL2ZyYW1ld29yayc7XG4vLyBAaW1wb3J0ICd0aGVtZS90eXBvZ3JhcGh5Jztcbi8vIEBpbXBvcnQgJ3RoZW1lL2Zvcm1zJztcbi8vIEBpbXBvcnQgJ3RoZW1lL21vYmlsZSc7XG4vLyBAaW1wb3J0ICd0aGVtZS9hbmltYXRpb24nO1xuLy9cbi8vXG5cbkBpbXBvcnQgJ3RoZW1lL3Jlc2V0JztcbkBpbXBvcnQgJ2NvbmZpZy9taXhpbnMvZm9udHMnO1xuQGltcG9ydCAndGhlbWUvZm9udHMnO1xuXG5AaW1wb3J0ICd0aGVtZS9oZWFkZXInO1xuQGltcG9ydCAndGhlbWUvbmF2JztcbkBpbXBvcnQgJ3RoZW1lL3NlY3Rpb24nO1xuQGltcG9ydCAndGhlbWUvZm9vdGVyJztcblxuLy8gQGltcG9ydCAndGhlbWUvZm9vdGVyJztcbi8vIEBpbXBvcnQgJ3RoZW1lL21lbnUnO1xuLy9cbi8vIC8vIEV4dHJhIFNrZWxldG9uIFN0eWxpbmdcbi8vIEBpbXBvcnQgJ3RoZW1lL2Jsb2cnO1xuLy8gQGltcG9ydCAndGhlbWUvb25lcGFnZSc7XG4iLCIqe1xuICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIC1tb3otYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbn1cblxuaHRtbCwgYm9keXtcbiAgbWFyZ2luOiAwO1xuICBwYWRkaW5nOiAwO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGZvbnQtc2l6ZTogMXJlbTtcbn1cblxudWwsIGxpLCBvbHtcbiAgbWFyZ2luOiAwO1xuICBwYWRkaW5nOiAwO1xuICBsaXN0LXN0eWxlOiBub25lO1xufVxuXG5he1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gIGNvbG9yOiBibGFjaztcbn1cblxucCwgdWwsIGxpLCBvbCwgaDEsIGgyLCBoMywgZW0sIGJsb2NrcXVvdGV7XG4gIG1hcmdpbjogMDtcbn1cblxuaW1ne1xuICB3aWR0aDogMTAwJTtcbiAgdmVydGljYWwtYWxpZ246IGJvdHRvbTtcbiAgaGVpZ2h0OiBhdXRvO1xufVxuIiwiLy8gRm9udCBGYW1pbHlcbiRmb250LWZhbWlseS1kZWZhdWx0OiAgXHRcdFx0XCJSYWxld2F5XCIsIFwiSGVsdmV0aWNhXCIsIFwiVGFob21hXCIsIFwiR2VuZXZhXCIsIFwiQXJpYWxcIiwgc2Fucy1zZXJpZjtcbiRmb250LWZhbWlseS1oZWFkZXI6ICBcdFx0XHRcIk1vbnRzZXJyYXRcIiwgXCJIZWx2ZXRpY2FcIiwgXCJUYWhvbWFcIiwgXCJHZW5ldmFcIiwgXCJBcmlhbFwiLCBzYW5zLXNlcmlmO1xuJGZvbnQtZmFtaWx5LW1vbm86IFx0XHRcdFx0XCJJbmNvbnNvbGF0YVwiLCBtb25vc3BhY2U7XG4kZm9udC1mYW1pbHktc2VyaWY6XHRcdFx0XHRcIkdlb3JnaWFcIiwgXCJUaW1lc1wiLCBcIlRpbWVzIE5ldyBSb21hblwiLCBzZXJpZjtcbiRpY29uczogXHRcdFx0XHRcdFx0XCJGb250QXdlc29tZVwiO1xuXG4vLyBAZm9udC1mYWNlXG5cbiRSZWd1bGFyOiBcIk1vbnRzZXJyYXQtUmVndWxhclwiO1xuJGZhbWlseTogXCJNb250c2VycmF0L3dlYmZvbnRzXCI7XG4kZmlsZS1yZWd1bGFyOiBcIk1vbnRzZXJyYXQtUmVndWxhclwiO1xuJGNhdGVnb3J5OiBcInNhbnMtc2VyaWZcIjtcblxuQG1peGluIE1vbnRzZXJyYXQtUmVndWxhcigkUmVndWxhciwgJGZpbGUtcmVndWxhciwgJGZhbWlseSwgJGNhdGVnb3J5OlwiXCIpIHtcbiAgICAkZmlsZXBhdGg6IFwiLi4vZm9udHMvXCIgKyAkZmFtaWx5ICsgXCIvXCIgKyAkZmlsZS1yZWd1bGFyO1xuICAgIEBmb250LWZhY2Uge1xuICAgICAgICBmb250LWZhbWlseTogXCIjeyRSZWd1bGFyfVwiO1xuICAgICAgICBzcmM6IHVybCgkZmlsZXBhdGggKyBcIi5lb3RcIik7XG4gICAgICAgIHNyYzogdXJsKCRmaWxlcGF0aCArIFwiLmVvdD8jaWVmaXhcIikgZm9ybWF0KCdlbWJlZGRlZC1vcGVudHlwZScpLFxuICAgICAgICAgICAgICB1cmwoJGZpbGVwYXRoICsgXCIud29mZlwiKSBmb3JtYXQoJ3dvZmYnKSxcbiAgICAgICAgICAgICAgdXJsKCRmaWxlcGF0aCArIFwiLnR0ZlwiKSAgZm9ybWF0KCd0cnVldHlwZScpLFxuICAgICAgICAgICAgICB1cmwoJGZpbGVwYXRoICsgXCIuc3ZnI1wiICsgJFJlZ3VsYXIgKyBcIlwiKSBmb3JtYXQoJ3N2ZycpO1xuICAgIH1cblxuICAgICUjeyRSZWd1bGFyfSB7XG4gICAgICAgIGZvbnQ6IHtcbiAgICAgICAgICAgIEBpZiAkY2F0ZWdvcnkgIT0gXCJcIiB7XG4gICAgICAgICAgICAgICAgZmFtaWx5OiBcIiN7JFJlZ3VsYXJ9XCIsICN7JGNhdGVnb3J5fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBlbHNlIHtcbiAgICAgICAgICAgICAgICBmYW1pbHk6IFwiI3skUmVndWxhcn1cIjtcbiAgICAgICAgICAgICAgICB3ZWlnaHQ6IG5vcm1hbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuJGxpZ2h0OiBcIk1vbnRzZXJyYXQtTGlnaHRcIjtcbiRmYW1pbHk6IFwiTW9udHNlcnJhdC93ZWJmb250c1wiO1xuJGZpbGUtbGlnaHQ6IFwiTW9udHNlcnJhdC1MaWdodFwiO1xuJGNhdGVnb3J5OiBcInNhbnMtc2VyaWZcIjtcblxuQG1peGluIE1vbnRzZXJyYXQtbGlnaHQoJGxpZ2h0LCAkZmlsZS1saWdodCwgJGZhbWlseSwgJGNhdGVnb3J5OlwiXCIpIHtcbiAgICAkZmlsZXBhdGg6IFwiLi4vZm9udHMvXCIgKyAkZmFtaWx5ICsgXCIvXCIgKyAkZmlsZS1saWdodDtcbiAgICBAZm9udC1mYWNlIHtcbiAgICAgICAgZm9udC1mYW1pbHk6IFwiI3skbGlnaHR9XCI7XG4gICAgICAgIHNyYzogdXJsKCRmaWxlcGF0aCArIFwiLmVvdFwiKTtcbiAgICAgICAgc3JjOiB1cmwoJGZpbGVwYXRoICsgXCIuZW90PyNpZWZpeFwiKSBmb3JtYXQoJ2VtYmVkZGVkLW9wZW50eXBlJyksXG4gICAgICAgICAgICAgIHVybCgkZmlsZXBhdGggKyBcIi53b2ZmXCIpIGZvcm1hdCgnd29mZicpLFxuICAgICAgICAgICAgICB1cmwoJGZpbGVwYXRoICsgXCIudHRmXCIpICBmb3JtYXQoJ3RydWV0eXBlJyksXG4gICAgICAgICAgICAgIHVybCgkZmlsZXBhdGggKyBcIi5zdmcjXCIgKyAkbGlnaHQgKyBcIlwiKSBmb3JtYXQoJ3N2ZycpO1xuICAgIH1cblxuICAgICUjeyRsaWdodH0ge1xuICAgICAgICBmb250OiB7XG4gICAgICAgICAgICBAaWYgJGNhdGVnb3J5ICE9IFwiXCIge1xuICAgICAgICAgICAgICAgIGZhbWlseTogXCIjeyRsaWdodH1cIiwgI3skY2F0ZWdvcnl9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGVsc2Uge1xuICAgICAgICAgICAgICAgIGZhbWlseTogXCIjeyRsaWdodH1cIjtcbiAgICAgICAgICAgICAgICB3ZWlnaHQ6IG5vcm1hbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuJFRoaW46IFwiTW9udHNlcnJhdC1UaGluXCI7XG4kZmFtaWx5OiBcIk1vbnRzZXJyYXQvd2ViZm9udHNcIjtcbiRmaWxlLVRoaW46IFwiTW9udHNlcnJhdC1UaGluXCI7XG4kY2F0ZWdvcnk6IFwic2Fucy1zZXJpZlwiO1xuXG5AbWl4aW4gTW9udHNlcnJhdC1UaGluKCRUaGluLCAkZmlsZS1UaGluLCAkZmFtaWx5LCAkY2F0ZWdvcnk6XCJcIikge1xuICAgICRmaWxlcGF0aDogXCIuLi9mb250cy9cIiArICRmYW1pbHkgKyBcIi9cIiArICRmaWxlLVRoaW47XG4gICAgQGZvbnQtZmFjZSB7XG4gICAgICAgIGZvbnQtZmFtaWx5OiBcIiN7JFRoaW59XCI7XG4gICAgICAgIHNyYzogdXJsKCRmaWxlcGF0aCArIFwiLmVvdFwiKTtcbiAgICAgICAgc3JjOiB1cmwoJGZpbGVwYXRoICsgXCIuZW90PyNpZWZpeFwiKSBmb3JtYXQoJ2VtYmVkZGVkLW9wZW50eXBlJyksXG4gICAgICAgICAgICAgIHVybCgkZmlsZXBhdGggKyBcIi53b2ZmXCIpIGZvcm1hdCgnd29mZicpLFxuICAgICAgICAgICAgICB1cmwoJGZpbGVwYXRoICsgXCIudHRmXCIpICBmb3JtYXQoJ3RydWV0eXBlJyksXG4gICAgICAgICAgICAgIHVybCgkZmlsZXBhdGggKyBcIi5zdmcjXCIgKyAkVGhpbiArIFwiXCIpIGZvcm1hdCgnc3ZnJyk7XG4gICAgfVxuXG4gICAgJSN7JFRoaW59IHtcbiAgICAgICAgZm9udDoge1xuICAgICAgICAgICAgQGlmICRjYXRlZ29yeSAhPSBcIlwiIHtcbiAgICAgICAgICAgICAgICBmYW1pbHk6IFwiI3skVGhpbn1cIiwgI3skY2F0ZWdvcnl9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGVsc2Uge1xuICAgICAgICAgICAgICAgIGZhbWlseTogXCIjeyRUaGlufVwiO1xuICAgICAgICAgICAgICAgIHdlaWdodDogbm9ybWFsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG4vLyBmb250LXNpemVcbiRmb250MTQ6IDAuODgycmVtO1xuJGZvbnQxNjogMXJlbTtcbiRmb250MTg6IDEuMTM0cmVtO1xuJGZvbnQyMTogMS4zMjNyZW07XG4kZm9udDIyOiAxLjM3NXJlbTtcbiRmb250MjQ6IDEuNTEycmVtO1xuJGZvbnQzMjogMnJlbTtcbiRmb250MzY6IDIuMjY4cmVtO1xuJGZvbnQ0ODogMy4wMjRyZW07XG4kZm9udDcyOiA0LjVyZW07XG5cbi8vICRmb250aDE6IDJyZW07XG4vLyAkZm9udGgyOiAxLjVyZW07XG4vLyAkZm9udGgzOiAxcmVtO1xuLy8gJGZvbnRwOiAxcmVtO1xuIiwiQGluY2x1ZGUgTW9udHNlcnJhdC1SZWd1bGFyKCRSZWd1bGFyLCAkZmlsZS1yZWd1bGFyLCAkZmFtaWx5LCAkY2F0ZWdvcnkpOy8vMVxuQGluY2x1ZGUgTW9udHNlcnJhdC1saWdodCgkbGlnaHQsICRmaWxlLWxpZ2h0LCAkZmFtaWx5LCAkY2F0ZWdvcnkpOy8vMVxuQGluY2x1ZGUgTW9udHNlcnJhdC1UaGluKCRUaGluLCAkZmlsZS1UaGluLCAkZmFtaWx5LCAkY2F0ZWdvcnkpOy8vMVxuXG5ib2R5e1xuICAjaGVhZGVye1xuICAgIGF7XG4gICAgICBmb250LWZhbWlseTogJFJlZ3VsYXI7XG4gICAgICBmb250LXNpemU6ICRmb250MjQ7XG4gICAgICBmb250LXdlaWdodDogbm9ybWFsO1xuICAgICAgY29sb3I6IHdoaXRlO1xuICAgIH1cbiAgICAubGFuZ3VhZ2Utc2VsZWN0b3J7XG4gICAgICBsaXtcbiAgICAgICAgJjpudGgtY2hpbGQoLW4rMil7XG4gICAgICAgICAgJjo6YWZ0ZXJ7XG4gICAgICAgICAgICBmb250LXNpemU6ICRmb250MjQ7XG4gICAgICAgICAgICBjb250ZW50OiBcIi1cIjtcbiAgICAgICAgICAgIGNvbG9yOiB3aGl0ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgI3N0YXJ0e1xuICAgIC5jb250ZW50e1xuICAgICAgcHtcbiAgICAgICAgZm9udC1zaXplOiAkZm9udDE2O1xuICAgICAgICBmb250LWZhbWlseTogJGxpZ2h0O1xuICAgICAgICBmb250LXdlaWdodDogbm9ybWFsO1xuICAgICAgICBsaW5lLWhlaWdodDogMnJlbTtcbiAgICAgIH1cbiAgICB9XG4gICAgLmNpdGF0aW9ue1xuICAgICAgcHtcbiAgICAgICAgZm9udC1zaXplOiAkZm9udDE2O1xuICAgICAgICBmb250LWZhbWlseTogJFJlZ3VsYXI7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gICAgICAgIGxpbmUtaGVpZ2h0OiAycmVtO1xuICAgICAgICBjb2xvcjogd2hpdGU7XG4gICAgfVxuICB9XG4gICAgI2hvbWUsICNjb250YWN0e1xuICAgICAgaDF7XG4gICAgICAgIGZvbnQtZmFtaWx5OiAkVGhpbjtcbiAgICAgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbiAgICAgICAgZm9udC1zaXplOiAzMHZ3O1xuICAgICAgfVxuICAgICAgcCwgYSB7XG4gICAgICAgIGZvbnQtc2l6ZTogJGZvbnQxNjtcbiAgICAgICAgY29sb3I6IHdoaXRlO1xuICAgICAgICBmb250LWZhbWlseTogJGxpZ2h0O1xuICAgICAgfVxuICAgIH1cblxuICAgIC5jaGFwe1xuICAgICAgY29sb3I6IHdoaXRlO1xuICAgICAgZm9udC1mYW1pbHk6ICRsaWdodDtcbiAgICAgIGgye1xuICAgICAgICBmb250LWZhbWlseTogJGxpZ2h0O1xuICAgICAgICBmb250LXdlaWdodDogbm9ybWFsO1xuICAgICAgICBmb250LXNpemU6ICRmb250NDg7XG4gICAgICB9XG4gICAgICBhe1xuICAgICAgICBmb250LWZhbWlseTogJFJlZ3VsYXI7XG4gICAgICAgIGZvbnQtc2l6ZTogJGZvbnQxNjtcbiAgICAgICAgY29sb3I6IHdoaXRlO1xuICAgICAgICB9XG4gICAgICAmID4gYXtcbiAgICAgICAgJjpudGgtb2YtdHlwZSgyKXtcbiAgICAgICAgICAmOjpiZWZvcmV7XG4gICAgICAgICAgICBtYXJnaW46IDAgNXB4O1xuICAgICAgICAgICAgY29udGVudDogXCItXCI7XG4gICAgICAgICAgICBjb2xvcjogd2hpdGU7XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiI2hlYWRlcntcbiAgcG9zaXRpb246IGZpeGVkO1xuICB6LWluZGV4OiA5OTk7XG4gIC5sYW5ndWFnZS1zZWxlY3RvcntcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBwb3NpdGlvbjogZml4ZWQ7XG4gICAgICB3aWR0aDogMTYwcHg7XG4gICAgICBsZWZ0OiA1MCU7XG4gICAgICBtYXJnaW4tdG9wOiAxMHB4O1xuICAgICAgbWFyZ2luLWxlZnQ6IC03NXB4O1xuICAgIGxpe1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICY6bnRoLWNoaWxkKC1uKzIpe1xuICAgICAgICAmOjphZnRlcntcbiAgICAgICAgICBtYXJnaW46IDAgMTBweDtcbiAgICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAubmF2aWdhdGlvbntcbiAgICBsaXtcbiAgICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICAgICY6Zmlyc3QtY2hpbGR7XG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgICB9XG4gICAgICAmOm50aC1jaGlsZCgyKXtcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDtcbiAgICAgICAgYm90dG9tOiAwO1xuICAgICAgICB3aWR0aDogNTAlO1xuICAgICAgfVxuICAgICAgJjpudGgtY2hpbGQoMyl7XG4gICAgICAgIG1hcmdpbi10b3A6IDEwcHg7XG4gICAgICAgIHRvcDogMDtcbiAgICAgICAgd2lkdGg6IDUwJTtcbiAgICAgIH1cbiAgICAgICY6bnRoLWNoaWxkKDQpe1xuICAgICAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xuICAgICAgICBib3R0b206IDA7XG4gICAgICAgIHdpZHRoOiA1MCU7XG4gICAgICAgIHJpZ2h0OiAwO1xuICAgICAgfVxuICAgICAgJjpudGgtY2hpbGQoNSl7XG4gICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTtcbiAgICAgICAgdG9wOiA1MCU7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICByaWdodDogLTUwJTtcbiAgICAgICAgbWFyZ2luLXJpZ2h0OiAyMnB4O1xuICAgICAgfVxuICAgICAgJjpudGgtY2hpbGQoNil7XG4gICAgICAgIHRyYW5zZm9ybTogcm90YXRlKC05MGRlZyk7XG4gICAgICAgIHRvcDogNTAlO1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgbGVmdDogLTUwJTtcbiAgICAgICAgbWFyZ2luLWxlZnQ6IDIycHg7XG4gICAgICB9XG4gICAgICAmOm50aC1jaGlsZCg3KXtcbiAgICAgICAgbWFyZ2luLXRvcDogMTBweDtcbiAgICAgICAgdG9wOiAwO1xuICAgICAgICByaWdodDogMDtcbiAgICAgICAgd2lkdGg6IDUwJTtcbiAgICAgIH1cbiAgICAgIGF7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgbWFyZ2luOiBhdXRvO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiIiwiI3N0YXJ0e1xuICAmID4gZGl2e1xuICAgIGhlaWdodDogMTAwdmg7XG4gIH1cbiAgZGl2Om50aC1jaGlsZChuKzMpe1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgJjpudGgtY2hpbGQoZXZlbil7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogcm93LXJldmVyc2U7XG4gICAgfVxuICAgICYgPiBkaXZ7XG4gICAgICB3aWR0aDogNTAlO1xuICAgICAgb3ZlcmZsb3c6IGF1dG87XG4gICAgICAmOmZpcnN0LWNoaWxke1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQoIzk4MjcyRCwgIzRmMTAwQik7XG4gICAgICAgIC5jaXRhdGlvbntcbiAgICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICAgIHRvcDogMjAlO1xuICAgICAgICAgIHdpZHRoOiA0NTBweDtcbiAgICAgICAgICBsZWZ0OiA1MCU7XG4gICAgICAgICAgbWFyZ2luLWxlZnQ6IC0yMjVweDtcbiAgICAgICAgfVxuICAgICAgICAuY2hhcHtcbiAgICAgICAgICBtYXJnaW46IGF1dG87XG4gICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgICAgICAgIC5yZXNve1xuICAgICAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgICAgICAgICAgbWFyZ2luLXRvcDogMTBweDtcbiAgICAgICAgICAgICAgYTpudGgtb2YtdHlwZSgxKXtcbiAgICAgICAgICAgICAgICBtYXJnaW4tcmlnaHQ6IDVweFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGE6bnRoLW9mLXR5cGUoMil7XG4gICAgICAgICAgICAgICAgbWFyZ2luLWxlZnQ6IDVweDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAuY29udGVudHtcbiAgICBwe1xuICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgICAgbWFyZ2luLWJvdHRvbTogMTVweDtcbiAgICB9XG4gIH1cbiAgLmdyYXYteW91dHViZXtcbiAgICBtYXJnaW46IDA7XG4gIH1cblxuICAjaG9tZXtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIC52aXN1LWFsYnVte1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIH1cbiAgICAudGl0bGV7XG4gICAgICAgIHotaW5kZXg6IDk5ODtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZsZXgtd3JhcDogd3JhcDtcbiAgICAgIGgxe1xuICAgICAgICB3aWR0aDogMTAwdnc7XG4gICAgICAgIG1hcmdpbjogYXV0bztcbiAgICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgICAgfVxuICAgICAgcHtcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICAgIHdpZHRoOiA1MDBweDtcbiAgICAgICAgbGVmdDogNTAlO1xuICAgICAgICBtYXJnaW4tbGVmdDogLTI1MHB4O1xuICAgICAgICB0b3A6IDc3JTtcbiAgICAgICAgaW1ne1xuICAgICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gICAgICAgICAgbWFyZ2luLXRvcDogOHB4O1xuICAgICAgICAgICY6bnRoLW9mLXR5cGUoMSl7XG4gICAgICAgICAgICB3aWR0aDogMjBweDtcbiAgICAgICAgICAgIG1hcmdpbi1yaWdodDogNXB4O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBhe1xuICAgICAgICAgICY6bGFzdC1jaGlsZHtcbiAgICAgICAgICAgIGltZ3tcbiAgICAgICAgICAgICAgd2lkdGg6IDI4cHg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAucmVzb3tcbiAgICAgICAgbWFyZ2luOiAtMjBweCBhdXRvIDAgYXV0bztcbiAgICAgICAgYTpudGgtb2YtdHlwZSgxKXtcbiAgICAgICAgICBtYXJnaW4tcmlnaHQ6IDVweFxuICAgICAgICB9XG4gICAgICAgIGE6bnRoLW9mLXR5cGUoMil7XG4gICAgICAgICAgbWFyZ2luLWxlZnQ6IDVweDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICAjYmlvZ3JhcGhpZSwgI3Byb2NoYWluZXNfZGF0ZXN7XG4gICAgLmNvbnRlbnR7XG4gICAgICBwYWRkaW5nOiAxMDBweDtcbiAgICAgIHA6bGFzdC1jaGlsZHtcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTAwcHg7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiNwaG90b2dyYXBoaWV7XG4gIHB7XG4gICAgbWFyZ2luOiAwO1xuICB9XG59XG4gICNwcmVzc2V7XG5cbiAgICAjc292YWosICNtYXRyaXp7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1mbG93OiB3cmFwO1xuICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICBtYXJnaW4tYm90dG9tOiAxMDBweDtcbiAgICAgIHB7XG4gICAgICAgIGZvbnQtc2l6ZTogJGZvbnQxNCFpbXBvcnRhbnQ7XG4gICAgICAgIGxpbmUtaGVpZ2h0OiAxLjJyZW07XG4gICAgICB9XG4gICAgICBwOm50aC1vZi10eXBlKDEpe1xuICAgICAgICBwYWRkaW5nOiAwIDUwcHg7XG4gICAgICAgIG1hcmdpbi10b3A6IDEwMHB4O1xuICAgICAgfVxuICAgICAgcHtcbiAgICAgICAgJjpub3QoOm50aC1vZi10eXBlKDEpKXtcbiAgICAgICAgICB3aWR0aDogNTAlO1xuICAgICAgICAgIGhlaWdodDogYXV0bztcbiAgICAgICAgICBpbWd7XG4gICAgICAgICAgICB3aWR0aDogMjAlO1xuICAgICAgICAgICAgaGVpZ2h0OiBhdXRvO1xuICAgICAgICAgICAgbWFyZ2luOiAyMHB4IDA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgI2NvbnRhY3R7XG4gICAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KCM5ODI3MkQsICM0ZjEwMEIpO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAxMDB2aDtcbiAgICAjQ29udGFjdHtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICBiYWNrZ3JvdW5kLWltYWdlOiBub25lO1xuICAgICAgaGVpZ2h0OiBhdXRvIWltcG9ydGFudDtcbiAgICAgIG1hcmdpbjogYXV0bztcbiAgICAgIHB7XG4gICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICAgICAgbWFyZ2luOiAwIGF1dG87XG4gICAgICAgIGxpbmUtaGVpZ2h0OiAxLjVyZW07XG4gICAgICAgIHN0cm9uZ3tcbiAgICAgICAgICBsaW5lLWhlaWdodDogM3JlbTtcbiAgICAgICAgfVxuICAgICAgfVxuICB9XG59XG59XG4iLCIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFDQUEsQUFBQSxDQUFDLENBQUEsRUFDQyxrQkFBa0IsRUFBRSxVQUFVLEVBQzlCLGVBQWUsRUFBRSxVQUFVLEVBQzNCLFVBQVUsRUFBRSxVQUFVLEdBQ3ZCOztBQUVELEFBQUEsSUFBSSxFQUFFLElBQUksQ0FBQSxFQUNSLE1BQU0sRUFBRSxDQUFDLEVBQ1QsT0FBTyxFQUFFLENBQUMsRUFDVixNQUFNLEVBQUUsSUFBSSxFQUNaLFNBQVMsRUFBRSxJQUFJLEdBQ2hCOztBQUVELEFBQUEsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUEsRUFDUixNQUFNLEVBQUUsQ0FBQyxFQUNULE9BQU8sRUFBRSxDQUFDLEVBQ1YsVUFBVSxFQUFFLElBQUksR0FDakI7O0FBRUQsQUFBQSxDQUFDLENBQUEsRUFDQyxlQUFlLEVBQUUsSUFBSSxFQUNyQixLQUFLLEVBQUUsS0FBSyxHQUNiOztBQUVELEFBQUEsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxVQUFVLENBQUEsRUFDdkMsTUFBTSxFQUFFLENBQUMsR0FDVjs7QUFFRCxBQUFBLEdBQUcsQ0FBQSxFQUNELEtBQUss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 */ diff --git a/user/themes/anissabensalah/css-compiled/theme.min.css b/user/themes/anissabensalah/css-compiled/theme.min.css index ee2408d..62c8ee6 100644 --- a/user/themes/anissabensalah/css-compiled/theme.min.css +++ b/user/themes/anissabensalah/css-compiled/theme.min.css @@ -1 +1 @@ -*{box-sizing:border-box}body,html{font-size:1rem;height:100%;margin:0;padding:0}li,ol,ul{margin:0;padding:0;list-style:none}a{text-decoration:none;color:#000}blockquote,em,h1,h2,h3,li,ol,p,ul{margin:0}img{width:100%;height:auto;vertical-align:bottom}@font-face{font-family:Montserrat-Regular;src:url(../fonts/Montserrat/webfonts/Montserrat-Regular.eot);src:url(../fonts/Montserrat/webfonts/Montserrat-Regular.eot?#iefix) format('embedded-opentype'),url(../fonts/Montserrat/webfonts/Montserrat-Regular.woff) format('woff'),url(../fonts/Montserrat/webfonts/Montserrat-Regular.ttf) format('truetype'),url(../fonts/Montserrat/webfonts/Montserrat-Regular.svg#Montserrat-Regular) format('svg')}@font-face{font-family:Montserrat-Light;src:url(../fonts/Montserrat/webfonts/Montserrat-Light.eot);src:url(../fonts/Montserrat/webfonts/Montserrat-Light.eot?#iefix) format('embedded-opentype'),url(../fonts/Montserrat/webfonts/Montserrat-Light.woff) format('woff'),url(../fonts/Montserrat/webfonts/Montserrat-Light.ttf) format('truetype'),url(../fonts/Montserrat/webfonts/Montserrat-Light.svg#Montserrat-Light) format('svg')}@font-face{font-family:Montserrat-Thin;src:url(../fonts/Montserrat/webfonts/Montserrat-Thin.eot);src:url(../fonts/Montserrat/webfonts/Montserrat-Thin.eot?#iefix) format('embedded-opentype'),url(../fonts/Montserrat/webfonts/Montserrat-Thin.woff) format('woff'),url(../fonts/Montserrat/webfonts/Montserrat-Thin.ttf) format('truetype'),url(../fonts/Montserrat/webfonts/Montserrat-Thin.svg#Montserrat-Thin) format('svg')}body #header a{font-family:Montserrat-Regular;font-size:1.512rem;font-weight:400;color:#fff}body #header .language-selector li:nth-child(-n+2)::after{font-size:1.512rem;content:'-';color:#fff}body #start .content p{font-family:Montserrat-Light;font-size:1rem;font-weight:400;line-height:2rem}body #start #contact h1,body #start #home h1{font-family:Montserrat-Thin;font-size:30vw;font-weight:400}body #start #contact a,body #start #contact p,body #start #home a,body #start #home p{font-family:Montserrat-Light;font-size:1rem;color:#fff}body #start .chap{font-family:Montserrat-Light;color:#fff}body #start .chap h2{font-family:Montserrat-Light;font-size:3.024rem;font-weight:400}body #start .chap a{font-family:Montserrat-Regular;font-size:1rem;color:#fff}body #start .chap>a:nth-of-type(2)::before{margin:0 5px;content:'-';color:#fff}#header{position:fixed;z-index:999}#header .language-selector{position:fixed;left:50%;display:-ms-flexbox;display:flex;width:160px;margin-top:10px;margin-left:-75px}#header .language-selector li{display:-ms-flexbox;display:flex}#header .language-selector li:nth-child(-n+2)::after{position:relative;display:block;margin:0 10px}#header .navigation li{position:fixed;text-align:center}#header .navigation li:first-child{display:none}#header .navigation li:nth-child(2){bottom:0;width:50%;margin-bottom:10px}#header .navigation li:nth-child(3){top:0;width:50%;margin-top:10px}#header .navigation li:nth-child(4){right:0;bottom:0;width:50%;margin-bottom:10px}#header .navigation li:nth-child(5){top:50%;right:-50%;width:100%;margin-right:22px;transform:rotate(90deg)}#header .navigation li:nth-child(6){top:50%;left:-50%;width:100%;margin-left:22px;transform:rotate(-90deg)}#header .navigation li:nth-child(7){top:0;right:0;width:50%;margin-top:10px}#header .navigation li a{position:relative;margin:auto}#start div:nth-child(n+3){display:-ms-flexbox;display:flex}#start div:nth-child(n+3):nth-child(even){flex-direction:row-reverse;-ms-flex-direction:row-reverse}#start div:nth-child(n+3)>div{overflow:auto;width:50%;height:100vh}#start div:nth-child(n+3)>div:first-child{display:-ms-flexbox;display:flex;background-image:linear-gradient(#98272d,#4f100b)}#start div:nth-child(n+3)>div:first-child .chap{margin:auto;text-align:center}#start div:nth-child(n+3)>div:first-child .chap .reso{flex-direction:row;margin-top:10px;-ms-flex-pack:center;justify-content:center;-ms-flex-direction:row}#start div:nth-child(n+3)>div:first-child .chap .reso a:nth-of-type(1){margin-right:5px}#start div:nth-child(n+3)>div:first-child .chap .reso a:nth-of-type(2){margin-left:5px}#start .content p{margin-bottom:15px;text-align:center}#start .grav-youtube{margin:0}#start #home{display:-ms-flexbox;display:flex;height:100vh}#start #home .visu-album{position:absolute}#start #home .title{z-index:998;display:-ms-flexbox;display:flex;width:100%;-ms-flex-wrap:wrap;flex-wrap:wrap}#start #home .title h1{width:100vw;margin:auto;text-align:center;text-transform:uppercase}#start #home .title p{position:absolute;top:77%;left:50%;width:500px;margin-left:-250px;text-align:center}#start #home .title p img{margin-top:8px;vertical-align:middle}#start #home .title p img:nth-of-type(1){width:20px;margin-right:5px}#start #home .title p a:last-child img{width:28px}#start #home .title .reso{margin:-20px auto 0 auto}#start #home .title .reso a:nth-of-type(1){margin-right:5px}#start #home .title .reso a:nth-of-type(2){margin-left:5px}#start #biographie .content,#start #prochaines_dates .content{padding:100px}#start #biographie .content p:last-child,#start #prochaines_dates .content p:last-child{margin-bottom:100px}#start #photographie p{margin:0}#start #presse #matriz,#start #presse #sovaj{display:-ms-flexbox;display:flex;margin-bottom:100px;-ms-flex-flow:wrap;flex-flow:wrap;-ms-flex-pack:center;justify-content:center}#start #presse p{font-size:.882rem!important;line-height:1.2rem}#start #presse p:nth-of-type(1){margin-top:100px;padding:0 50px}#start #presse p:not(:nth-of-type(1)){width:50%;height:auto}#start #presse p:not(:nth-of-type(1)) img{width:20%;height:auto;margin:20px 0}#start #contact{display:-ms-flexbox;display:flex;width:100%;height:100vh;background-image:linear-gradient(#98272d,#4f100b)}#start #contact #Contact{flex-direction:column;height:auto!important;margin:auto;background-image:none;-ms-flex-direction:column}#start #contact #Contact p{line-height:1.5rem;margin:0 auto;text-align:center}#start #contact #Contact p strong{line-height:3rem} \ No newline at end of file +*{box-sizing:border-box}body,html{font-size:1rem;height:100%;margin:0;padding:0}li,ol,ul{margin:0;padding:0;list-style:none}a{text-decoration:none;color:#000}blockquote,em,h1,h2,h3,li,ol,p,ul{margin:0}img{width:100%;height:auto;vertical-align:bottom}@font-face{font-family:Montserrat-Regular;src:url(../fonts/Montserrat/webfonts/Montserrat-Regular.eot);src:url(../fonts/Montserrat/webfonts/Montserrat-Regular.eot?#iefix) format('embedded-opentype'),url(../fonts/Montserrat/webfonts/Montserrat-Regular.woff) format('woff'),url(../fonts/Montserrat/webfonts/Montserrat-Regular.ttf) format('truetype'),url(../fonts/Montserrat/webfonts/Montserrat-Regular.svg#Montserrat-Regular) format('svg')}@font-face{font-family:Montserrat-Light;src:url(../fonts/Montserrat/webfonts/Montserrat-Light.eot);src:url(../fonts/Montserrat/webfonts/Montserrat-Light.eot?#iefix) format('embedded-opentype'),url(../fonts/Montserrat/webfonts/Montserrat-Light.woff) format('woff'),url(../fonts/Montserrat/webfonts/Montserrat-Light.ttf) format('truetype'),url(../fonts/Montserrat/webfonts/Montserrat-Light.svg#Montserrat-Light) format('svg')}@font-face{font-family:Montserrat-Thin;src:url(../fonts/Montserrat/webfonts/Montserrat-Thin.eot);src:url(../fonts/Montserrat/webfonts/Montserrat-Thin.eot?#iefix) format('embedded-opentype'),url(../fonts/Montserrat/webfonts/Montserrat-Thin.woff) format('woff'),url(../fonts/Montserrat/webfonts/Montserrat-Thin.ttf) format('truetype'),url(../fonts/Montserrat/webfonts/Montserrat-Thin.svg#Montserrat-Thin) format('svg')}body #header a{font-family:Montserrat-Regular;font-size:1.512rem;font-weight:400;color:#fff}body #header .language-selector li:nth-child(-n+2)::after{font-size:1.512rem;content:'-';color:#fff}body #start .content p{font-family:Montserrat-Light;font-size:1rem;font-weight:400;line-height:2rem}body #start .citation p{font-family:Montserrat-Regular;font-size:1rem;font-weight:400;line-height:2rem;color:#fff}body #start #contact h1,body #start #home h1{font-family:Montserrat-Thin;font-size:30vw;font-weight:400}body #start #contact a,body #start #contact p,body #start #home a,body #start #home p{font-family:Montserrat-Light;font-size:1rem;color:#fff}body #start .chap{font-family:Montserrat-Light;color:#fff}body #start .chap h2{font-family:Montserrat-Light;font-size:3.024rem;font-weight:400}body #start .chap a{font-family:Montserrat-Regular;font-size:1rem;color:#fff}body #start .chap>a:nth-of-type(2)::before{margin:0 5px;content:'-';color:#fff}#header{position:fixed;z-index:999}#header .language-selector{position:fixed;left:50%;display:-ms-flexbox;display:flex;width:160px;margin-top:10px;margin-left:-75px}#header .language-selector li{display:-ms-flexbox;display:flex}#header .language-selector li:nth-child(-n+2)::after{position:relative;display:block;margin:0 10px}#header .navigation li{position:fixed;text-align:center}#header .navigation li:first-child{display:none}#header .navigation li:nth-child(2){bottom:0;width:50%;margin-bottom:10px}#header .navigation li:nth-child(3){top:0;width:50%;margin-top:10px}#header .navigation li:nth-child(4){right:0;bottom:0;width:50%;margin-bottom:10px}#header .navigation li:nth-child(5){top:50%;right:-50%;width:100%;margin-right:22px;transform:rotate(90deg)}#header .navigation li:nth-child(6){top:50%;left:-50%;width:100%;margin-left:22px;transform:rotate(-90deg)}#header .navigation li:nth-child(7){top:0;right:0;width:50%;margin-top:10px}#header .navigation li a{position:relative;margin:auto}#start>div{height:100vh}#start div:nth-child(n+3){display:-ms-flexbox;display:flex}#start div:nth-child(n+3):nth-child(even){flex-direction:row-reverse;-ms-flex-direction:row-reverse}#start div:nth-child(n+3)>div{overflow:auto;width:50%}#start div:nth-child(n+3)>div:first-child{position:relative;display:-ms-flexbox;display:flex;flex-direction:column;background-image:linear-gradient(#98272d,#4f100b);-ms-flex-direction:column;-ms-flex-pack:center;justify-content:center}#start div:nth-child(n+3)>div:first-child .citation{position:absolute;top:20%;left:50%;width:450px;margin-left:-225px;text-align:center}#start div:nth-child(n+3)>div:first-child .chap{margin:auto;text-align:center}#start div:nth-child(n+3)>div:first-child .chap .reso{flex-direction:row;margin-top:10px;-ms-flex-pack:center;justify-content:center;-ms-flex-direction:row}#start div:nth-child(n+3)>div:first-child .chap .reso a:nth-of-type(1){margin-right:5px}#start div:nth-child(n+3)>div:first-child .chap .reso a:nth-of-type(2){margin-left:5px}#start .content p{margin-bottom:15px;text-align:center}#start .grav-youtube{margin:0}#start #home{display:-ms-flexbox;display:flex}#start #home .visu-album{position:absolute}#start #home .title{z-index:998;display:-ms-flexbox;display:flex;width:100%;-ms-flex-wrap:wrap;flex-wrap:wrap}#start #home .title h1{width:100vw;margin:auto;text-align:center;text-transform:uppercase}#start #home .title p{position:absolute;top:77%;left:50%;width:500px;margin-left:-250px;text-align:center}#start #home .title p img{margin-top:8px;vertical-align:middle}#start #home .title p img:nth-of-type(1){width:20px;margin-right:5px}#start #home .title p a:last-child img{width:28px}#start #home .title .reso{margin:-20px auto 0 auto}#start #home .title .reso a:nth-of-type(1){margin-right:5px}#start #home .title .reso a:nth-of-type(2){margin-left:5px}#start #biographie .content,#start #prochaines_dates .content{padding:100px}#start #biographie .content p:last-child,#start #prochaines_dates .content p:last-child{margin-bottom:100px}#start #photographie p{margin:0}#start #presse #matriz,#start #presse #sovaj{display:-ms-flexbox;display:flex;margin-bottom:100px;-ms-flex-flow:wrap;flex-flow:wrap;-ms-flex-pack:center;justify-content:center}#start #presse #matriz p,#start #presse #sovaj p{font-size:.882rem!important;line-height:1.2rem}#start #presse #matriz p:nth-of-type(1),#start #presse #sovaj p:nth-of-type(1){margin-top:100px;padding:0 50px}#start #presse #matriz p:not(:nth-of-type(1)),#start #presse #sovaj p:not(:nth-of-type(1)){width:50%;height:auto}#start #presse #matriz p:not(:nth-of-type(1)) img,#start #presse #sovaj p:not(:nth-of-type(1)) img{width:20%;height:auto;margin:20px 0}#start #contact{display:-ms-flexbox;display:flex;width:100%;height:100vh;background-image:linear-gradient(#98272d,#4f100b)}#start #contact #Contact{flex-direction:column;height:auto!important;margin:auto;background-image:none;-ms-flex-direction:column}#start #contact #Contact p{line-height:1.5rem;margin:0 auto;text-align:center}#start #contact #Contact p strong{line-height:3rem} \ No newline at end of file diff --git a/user/themes/anissabensalah/js/fullPage.js b/user/themes/anissabensalah/js/fullPage.js new file mode 100644 index 0000000..40b2255 --- /dev/null +++ b/user/themes/anissabensalah/js/fullPage.js @@ -0,0 +1,2923 @@ +/*! + * fullPage 2.9.7 + * https://github.com/alvarotrigo/fullPage.js + * @license MIT licensed + * + * Copyright (C) 2015 alvarotrigo.com - A project by Alvaro Trigo + */ +(function(global, factory) { + 'use strict'; + if (typeof define === 'function' && define.amd) { + define(['jquery'], function($) { + return factory($, global, global.document, global.Math); + }); + } else if (typeof exports === "object" && exports) { + module.exports = factory(require('jquery'), global, global.document, global.Math); + } else { + factory(jQuery, global, global.document, global.Math); + } +})(typeof window !== 'undefined' ? window : this, function($, window, document, Math, undefined) { + 'use strict'; + + // keeping central set of classnames and selectors + var WRAPPER = 'fullpage-wrapper'; + var WRAPPER_SEL = '.' + WRAPPER; + + // slimscroll + var SCROLLABLE = 'fp-scrollable'; + var SCROLLABLE_SEL = '.' + SCROLLABLE; + + // util + var RESPONSIVE = 'fp-responsive'; + var NO_TRANSITION = 'fp-notransition'; + var DESTROYED = 'fp-destroyed'; + var ENABLED = 'fp-enabled'; + var VIEWING_PREFIX = 'fp-viewing'; + var ACTIVE = 'active'; + var ACTIVE_SEL = '.' + ACTIVE; + var COMPLETELY = 'fp-completely'; + var COMPLETELY_SEL = '.' + COMPLETELY; + + // section + var SECTION_DEFAULT_SEL = '.section'; + var SECTION = 'fp-section'; + var SECTION_SEL = '.' + SECTION; + var SECTION_ACTIVE_SEL = SECTION_SEL + ACTIVE_SEL; + var SECTION_FIRST_SEL = SECTION_SEL + ':first'; + var SECTION_LAST_SEL = SECTION_SEL + ':last'; + var TABLE_CELL = 'fp-tableCell'; + var TABLE_CELL_SEL = '.' + TABLE_CELL; + var AUTO_HEIGHT = 'fp-auto-height'; + var AUTO_HEIGHT_SEL = '.fp-auto-height'; + var NORMAL_SCROLL = 'fp-normal-scroll'; + var NORMAL_SCROLL_SEL = '.fp-normal-scroll'; + + // section nav + var SECTION_NAV = 'fp-nav'; + var SECTION_NAV_SEL = '#' + SECTION_NAV; + var SECTION_NAV_TOOLTIP = 'fp-tooltip'; + var SECTION_NAV_TOOLTIP_SEL='.'+SECTION_NAV_TOOLTIP; + var SHOW_ACTIVE_TOOLTIP = 'fp-show-active'; + + // slide + var SLIDE_DEFAULT_SEL = '.slide'; + var SLIDE = 'fp-slide'; + var SLIDE_SEL = '.' + SLIDE; + var SLIDE_ACTIVE_SEL = SLIDE_SEL + ACTIVE_SEL; + var SLIDES_WRAPPER = 'fp-slides'; + var SLIDES_WRAPPER_SEL = '.' + SLIDES_WRAPPER; + var SLIDES_CONTAINER = 'fp-slidesContainer'; + var SLIDES_CONTAINER_SEL = '.' + SLIDES_CONTAINER; + var TABLE = 'fp-table'; + + // slide nav + var SLIDES_NAV = 'fp-slidesNav'; + var SLIDES_NAV_SEL = '.' + SLIDES_NAV; + var SLIDES_NAV_LINK_SEL = SLIDES_NAV_SEL + ' a'; + var SLIDES_ARROW = 'fp-controlArrow'; + var SLIDES_ARROW_SEL = '.' + SLIDES_ARROW; + var SLIDES_PREV = 'fp-prev'; + var SLIDES_PREV_SEL = '.' + SLIDES_PREV; + var SLIDES_ARROW_PREV = SLIDES_ARROW + ' ' + SLIDES_PREV; + var SLIDES_ARROW_PREV_SEL = SLIDES_ARROW_SEL + SLIDES_PREV_SEL; + var SLIDES_NEXT = 'fp-next'; + var SLIDES_NEXT_SEL = '.' + SLIDES_NEXT; + var SLIDES_ARROW_NEXT = SLIDES_ARROW + ' ' + SLIDES_NEXT; + var SLIDES_ARROW_NEXT_SEL = SLIDES_ARROW_SEL + SLIDES_NEXT_SEL; + + var $window = $(window); + var $document = $(document); + + $.fn.fullpage = function(options) { + //only once my friend! + if($('html').hasClass(ENABLED)){ displayWarnings(); return; } + + // common jQuery objects + var $htmlBody = $('html, body'); + var $body = $('body'); + + var FP = $.fn.fullpage; + + // Creating some defaults, extending them with any options that were provided + options = $.extend({ + //navigation + menu: false, + anchors:[], + lockAnchors: false, + navigation: false, + navigationPosition: 'right', + navigationTooltips: [], + showActiveTooltip: false, + slidesNavigation: false, + slidesNavPosition: 'bottom', + scrollBar: false, + hybrid: false, + + //scrolling + css3: true, + scrollingSpeed: 700, + autoScrolling: true, + fitToSection: true, + fitToSectionDelay: 1000, + easing: 'easeInOutCubic', + easingcss3: 'ease', + loopBottom: false, + loopTop: false, + loopHorizontal: true, + continuousVertical: false, + continuousHorizontal: false, + scrollHorizontally: false, + interlockedSlides: false, + dragAndMove: false, + offsetSections: false, + resetSliders: false, + fadingEffect: false, + normalScrollElements: null, + scrollOverflow: false, + scrollOverflowReset: false, + scrollOverflowHandler: $.fn.fp_scrolloverflow ? $.fn.fp_scrolloverflow.iscrollHandler : null, + scrollOverflowOptions: null, + touchSensitivity: 5, + normalScrollElementTouchThreshold: 5, + bigSectionsDestination: null, + + //Accessibility + keyboardScrolling: true, + animateAnchor: true, + recordHistory: true, + + //design + controlArrows: true, + controlArrowColor: '#fff', + verticalCentered: true, + sectionsColor : [], + paddingTop: 0, + paddingBottom: 0, + fixedElements: null, + responsive: 0, //backwards compabitility with responsiveWiddth + responsiveWidth: 0, + responsiveHeight: 0, + responsiveSlides: false, + parallax: false, + parallaxOptions: { + type: 'reveal', + percentage: 62, + property: 'translate' + }, + + //Custom selectors + sectionSelector: SECTION_DEFAULT_SEL, + slideSelector: SLIDE_DEFAULT_SEL, + + //events + afterLoad: null, + onLeave: null, + afterRender: null, + afterResize: null, + afterReBuild: null, + afterSlideLoad: null, + onSlideLeave: null, + afterResponsive: null, + + lazyLoading: true + }, options); + + //flag to avoid very fast sliding for landscape sliders + var slideMoving = false; + + var isTouchDevice = navigator.userAgent.match(/(iPhone|iPod|iPad|Android|playbook|silk|BlackBerry|BB10|Windows Phone|Tizen|Bada|webOS|IEMobile|Opera Mini)/); + var isTouch = (('ontouchstart' in window) || (navigator.msMaxTouchPoints > 0) || (navigator.maxTouchPoints)); + var container = $(this); + var windowsHeight = $window.height(); + var isResizing = false; + var isWindowFocused = true; + var lastScrolledDestiny; + var lastScrolledSlide; + var canScroll = true; + var scrollings = []; + var controlPressed; + var startingSection; + var isScrollAllowed = {}; + isScrollAllowed.m = { 'up':true, 'down':true, 'left':true, 'right':true }; + isScrollAllowed.k = $.extend(true,{}, isScrollAllowed.m); + var MSPointer = getMSPointer(); + var events = { + touchmove: 'ontouchmove' in window ? 'touchmove' : MSPointer.move, + touchstart: 'ontouchstart' in window ? 'touchstart' : MSPointer.down + }; + var scrollBarHandler; + + // taken from https://github.com/udacity/ud891/blob/gh-pages/lesson2-focus/07-modals-and-keyboard-traps/solution/modal.js + var focusableElementsString = 'a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, [tabindex="0"], [contenteditable]'; + + //timeouts + var resizeId; + var afterSectionLoadsId; + var afterSlideLoadsId; + var scrollId; + var scrollId2; + var keydownId; + var originals = $.extend(true, {}, options); //deep copy + + displayWarnings(); + + //easeInOutCubic animation included in the plugin + $.extend($.easing,{ easeInOutCubic: function (x, t, b, c, d) {if ((t/=d/2) < 1) return c/2*t*t*t + b;return c/2*((t-=2)*t*t + 2) + b;}}); + + /** + * Sets the autoScroll option. + * It changes the scroll bar visibility and the history of the site as a result. + */ + function setAutoScrolling(value, type){ + //removing the transformation + if(!value){ + silentScroll(0); + } + + setVariableState('autoScrolling', value, type); + + var element = $(SECTION_ACTIVE_SEL); + + if(options.autoScrolling && !options.scrollBar){ + $htmlBody.css({ + 'overflow' : 'hidden', + 'height' : '100%' + }); + + setRecordHistory(originals.recordHistory, 'internal'); + + //for IE touch devices + container.css({ + '-ms-touch-action': 'none', + 'touch-action': 'none' + }); + + if(element.length){ + //moving the container up + silentScroll(element.position().top); + } + + }else{ + $htmlBody.css({ + 'overflow' : 'visible', + 'height' : 'initial' + }); + + setRecordHistory(false, 'internal'); + + //for IE touch devices + container.css({ + '-ms-touch-action': '', + 'touch-action': '' + }); + + //scrolling the page to the section with no animation + if (element.length) { + $htmlBody.scrollTop(element.position().top); + } + } + } + + /** + * Defines wheter to record the history for each hash change in the URL. + */ + function setRecordHistory(value, type){ + setVariableState('recordHistory', value, type); + } + + /** + * Defines the scrolling speed + */ + function setScrollingSpeed(value, type){ + setVariableState('scrollingSpeed', value, type); + } + + /** + * Sets fitToSection + */ + function setFitToSection(value, type){ + setVariableState('fitToSection', value, type); + } + + /** + * Sets lockAnchors + */ + function setLockAnchors(value){ + options.lockAnchors = value; + } + + /** + * Adds or remove the possibility of scrolling through sections by using the mouse wheel or the trackpad. + */ + function setMouseWheelScrolling(value){ + if(value){ + addMouseWheelHandler(); + addMiddleWheelHandler(); + }else{ + removeMouseWheelHandler(); + removeMiddleWheelHandler(); + } + } + + /** + * Adds or remove the possibility of scrolling through sections by using the mouse wheel/trackpad or touch gestures. + * Optionally a second parameter can be used to specify the direction for which the action will be applied. + * + * @param directions string containing the direction or directions separated by comma. + */ + function setAllowScrolling(value, directions){ + if(typeof directions !== 'undefined'){ + directions = directions.replace(/ /g,'').split(','); + + $.each(directions, function (index, direction){ + setIsScrollAllowed(value, direction, 'm'); + }); + } + else{ + setIsScrollAllowed(value, 'all', 'm'); + + if(value){ + setMouseWheelScrolling(true); + addTouchHandler(); + }else{ + setMouseWheelScrolling(false); + removeTouchHandler(); + } + } + } + + /** + * Adds or remove the possibility of scrolling through sections by using the keyboard arrow keys + */ + function setKeyboardScrolling(value, directions){ + if(typeof directions !== 'undefined'){ + directions = directions.replace(/ /g,'').split(','); + + $.each(directions, function (index, direction){ + setIsScrollAllowed(value, direction, 'k'); + }); + }else{ + setIsScrollAllowed(value, 'all', 'k'); + options.keyboardScrolling = value; + } + } + + /** + * Moves the page up one section. + */ + function moveSectionUp(){ + var prev = $(SECTION_ACTIVE_SEL).prev(SECTION_SEL); + + //looping to the bottom if there's no more sections above + if (!prev.length && (options.loopTop || options.continuousVertical)) { + prev = $(SECTION_SEL).last(); + } + + if (prev.length) { + scrollPage(prev, null, true); + } + } + + /** + * Moves the page down one section. + */ + function moveSectionDown(){ + var next = $(SECTION_ACTIVE_SEL).next(SECTION_SEL); + + //looping to the top if there's no more sections below + if(!next.length && + (options.loopBottom || options.continuousVertical)){ + next = $(SECTION_SEL).first(); + } + + if(next.length){ + scrollPage(next, null, false); + } + } + + /** + * Moves the page to the given section and slide with no animation. + * Anchors or index positions can be used as params. + */ + function silentMoveTo(sectionAnchor, slideAnchor){ + setScrollingSpeed (0, 'internal'); + moveTo(sectionAnchor, slideAnchor); + setScrollingSpeed (originals.scrollingSpeed, 'internal'); + } + + /** + * Moves the page to the given section and slide. + * Anchors or index positions can be used as params. + */ + function moveTo(sectionAnchor, slideAnchor){ + var destiny = getSectionByAnchor(sectionAnchor); + + if (typeof slideAnchor !== 'undefined'){ + scrollPageAndSlide(sectionAnchor, slideAnchor); + }else if(destiny.length > 0){ + scrollPage(destiny); + } + } + + /** + * Slides right the slider of the active section. + * Optional `section` param. + */ + function moveSlideRight(section){ + moveSlide('right', section); + } + + /** + * Slides left the slider of the active section. + * Optional `section` param. + */ + function moveSlideLeft(section){ + moveSlide('left', section); + } + + /** + * When resizing is finished, we adjust the slides sizes and positions + */ + function reBuild(resizing){ + if(container.hasClass(DESTROYED)){ return; } //nothing to do if the plugin was destroyed + + isResizing = true; + + windowsHeight = $window.height(); //updating global var + + $(SECTION_SEL).each(function(){ + var slidesWrap = $(this).find(SLIDES_WRAPPER_SEL); + var slides = $(this).find(SLIDE_SEL); + + //adjusting the height of the table-cell for IE and Firefox + if(options.verticalCentered){ + $(this).find(TABLE_CELL_SEL).css('height', getTableHeight($(this)) + 'px'); + } + + $(this).css('height', windowsHeight + 'px'); + + //adjusting the position fo the FULL WIDTH slides... + if (slides.length > 1) { + landscapeScroll(slidesWrap, slidesWrap.find(SLIDE_ACTIVE_SEL)); + } + }); + + if(options.scrollOverflow){ + scrollBarHandler.createScrollBarForAll(); + } + + var activeSection = $(SECTION_ACTIVE_SEL); + var sectionIndex = activeSection.index(SECTION_SEL); + + //isn't it the first section? + if(sectionIndex){ + //adjusting the position for the current section + silentMoveTo(sectionIndex + 1); + } + + isResizing = false; + $.isFunction( options.afterResize ) && resizing && options.afterResize.call(container); + $.isFunction( options.afterReBuild ) && !resizing && options.afterReBuild.call(container); + } + + /** + * Turns fullPage.js to normal scrolling mode when the viewport `width` or `height` + * are smaller than the set limit values. + */ + function setResponsive(active){ + var isResponsive = $body.hasClass(RESPONSIVE); + + if(active){ + if(!isResponsive){ + setAutoScrolling(false, 'internal'); + setFitToSection(false, 'internal'); + $(SECTION_NAV_SEL).hide(); + $body.addClass(RESPONSIVE); + $.isFunction( options.afterResponsive ) && options.afterResponsive.call( container, active); + } + } + else if(isResponsive){ + setAutoScrolling(originals.autoScrolling, 'internal'); + setFitToSection(originals.autoScrolling, 'internal'); + $(SECTION_NAV_SEL).show(); + $body.removeClass(RESPONSIVE); + $.isFunction( options.afterResponsive ) && options.afterResponsive.call( container, active); + } + } + + if($(this).length){ + //public functions + FP.version = '2.9.7'; + FP.setAutoScrolling = setAutoScrolling; + FP.setRecordHistory = setRecordHistory; + FP.setScrollingSpeed = setScrollingSpeed; + FP.setFitToSection = setFitToSection; + FP.setLockAnchors = setLockAnchors; + FP.setMouseWheelScrolling = setMouseWheelScrolling; + FP.setAllowScrolling = setAllowScrolling; + FP.setKeyboardScrolling = setKeyboardScrolling; + FP.moveSectionUp = moveSectionUp; + FP.moveSectionDown = moveSectionDown; + FP.silentMoveTo = silentMoveTo; + FP.moveTo = moveTo; + FP.moveSlideRight = moveSlideRight; + FP.moveSlideLeft = moveSlideLeft; + FP.fitToSection = fitToSection; + FP.reBuild = reBuild; + FP.setResponsive = setResponsive; + FP.destroy = destroy; + + //functions we want to share across files but which are not + //mean to be used on their own by developers + FP.shared ={ + afterRenderActions: afterRenderActions + }; + + init(); + + bindEvents(); + } + + function init(){ + //if css3 is not supported, it will use jQuery animations + if(options.css3){ + options.css3 = support3d(); + } + + options.scrollBar = options.scrollBar || options.hybrid; + + setOptionsFromDOM(); + prepareDom(); + setAllowScrolling(true); + setAutoScrolling(options.autoScrolling, 'internal'); + responsive(); + + //setting the class for the body element + setBodyClass(); + + if(document.readyState === 'complete'){ + scrollToAnchor(); + } + $window.on('load', scrollToAnchor); + } + + function bindEvents(){ + $window + //when scrolling... + .on('scroll', scrollHandler) + + //detecting any change on the URL to scroll to the given anchor link + //(a way to detect back history button as we play with the hashes on the URL) + .on('hashchange', hashChangeHandler) + + //when opening a new tab (ctrl + t), `control` won't be pressed when coming back. + .blur(blurHandler) + + //when resizing the site, we adjust the heights of the sections, slimScroll... + .resize(resizeHandler); + + $document + //Sliding with arrow keys, both, vertical and horizontal + .keydown(keydownHandler) + + //to prevent scrolling while zooming + .keyup(keyUpHandler) + + //Scrolls to the section when clicking the navigation bullet + .on('click touchstart', SECTION_NAV_SEL + ' a', sectionBulletHandler) + + //Scrolls the slider to the given slide destination for the given section + .on('click touchstart', SLIDES_NAV_LINK_SEL, slideBulletHandler) + + .on('click', SECTION_NAV_TOOLTIP_SEL, tooltipTextHandler); + + //Scrolling horizontally when clicking on the slider controls. + $(SECTION_SEL).on('click touchstart', SLIDES_ARROW_SEL, slideArrowHandler); + + /** + * Applying normalScroll elements. + * Ignoring the scrolls over the specified selectors. + */ + if(options.normalScrollElements){ + $document.on('mouseenter touchstart', options.normalScrollElements, function () { + setAllowScrolling(false); + }); + + $document.on('mouseleave touchend', options.normalScrollElements, function(){ + setAllowScrolling(true); + }); + } + } + + /** + * Setting options from DOM elements if they are not provided. + */ + function setOptionsFromDOM(){ + var sections = container.find(options.sectionSelector); + + //no anchors option? Checking for them in the DOM attributes + if(!options.anchors.length){ + options.anchors = sections.filter('[data-anchor]').map(function(){ + return $(this).data('anchor').toString(); + }).get(); + } + + //no tooltips option? Checking for them in the DOM attributes + if(!options.navigationTooltips.length){ + options.navigationTooltips = sections.filter('[data-tooltip]').map(function(){ + return $(this).data('tooltip').toString(); + }).get(); + } + } + + /** + * Works over the DOM structure to set it up for the current fullpage options. + */ + function prepareDom(){ + container.css({ + 'height': '100%', + 'position': 'relative' + }); + + //adding a class to recognize the container internally in the code + container.addClass(WRAPPER); + $('html').addClass(ENABLED); + + //due to https://github.com/alvarotrigo/fullPage.js/issues/1502 + windowsHeight = $window.height(); + + container.removeClass(DESTROYED); //in case it was destroyed before initializing it again + + addInternalSelectors(); + + //styling the sections / slides / menu + $(SECTION_SEL).each(function(index){ + var section = $(this); + var slides = section.find(SLIDE_SEL); + var numSlides = slides.length; + + //caching the original styles to add them back on destroy('all') + section.data('fp-styles', section.attr('style')); + + styleSection(section, index); + styleMenu(section, index); + + // if there's any slide + if (numSlides > 0) { + styleSlides(section, slides, numSlides); + }else{ + if(options.verticalCentered){ + addTableClass(section); + } + } + }); + + //fixed elements need to be moved out of the plugin container due to problems with CSS3. + if(options.fixedElements && options.css3){ + $(options.fixedElements).appendTo($body); + } + + //vertical centered of the navigation + active bullet + if(options.navigation){ + addVerticalNavigation(); + } + + enableYoutubeAPI(); + + if(options.scrollOverflow){ + scrollBarHandler = options.scrollOverflowHandler.init(options); + }else{ + afterRenderActions(); + } + } + + /** + * Styles the horizontal slides for a section. + */ + function styleSlides(section, slides, numSlides){ + var sliderWidth = numSlides * 100; + var slideWidth = 100 / numSlides; + + slides.wrapAll('
'); + slides.parent().wrap('
'); + + section.find(SLIDES_CONTAINER_SEL).css('width', sliderWidth + '%'); + + if(numSlides > 1){ + if(options.controlArrows){ + createSlideArrows(section); + } + + if(options.slidesNavigation){ + addSlidesNavigation(section, numSlides); + } + } + + slides.each(function(index) { + $(this).css('width', slideWidth + '%'); + + if(options.verticalCentered){ + addTableClass($(this)); + } + }); + + var startingSlide = section.find(SLIDE_ACTIVE_SEL); + + //if the slide won't be an starting point, the default will be the first one + //the active section isn't the first one? Is not the first slide of the first section? Then we load that section/slide by default. + if( startingSlide.length && ($(SECTION_ACTIVE_SEL).index(SECTION_SEL) !== 0 || ($(SECTION_ACTIVE_SEL).index(SECTION_SEL) === 0 && startingSlide.index() !== 0))){ + silentLandscapeScroll(startingSlide, 'internal'); + }else{ + slides.eq(0).addClass(ACTIVE); + } + } + + /** + * Styling vertical sections + */ + function styleSection(section, index){ + //if no active section is defined, the 1st one will be the default one + if(!index && $(SECTION_ACTIVE_SEL).length === 0) { + section.addClass(ACTIVE); + } + startingSection = $(SECTION_ACTIVE_SEL); + + section.css('height', windowsHeight + 'px'); + + if(options.paddingTop){ + section.css('padding-top', options.paddingTop); + } + + if(options.paddingBottom){ + section.css('padding-bottom', options.paddingBottom); + } + + if (typeof options.sectionsColor[index] !== 'undefined') { + section.css('background-color', options.sectionsColor[index]); + } + + if (typeof options.anchors[index] !== 'undefined') { + section.attr('data-anchor', options.anchors[index]); + } + } + + /** + * Sets the data-anchor attributes to the menu elements and activates the current one. + */ + function styleMenu(section, index){ + if (typeof options.anchors[index] !== 'undefined') { + //activating the menu / nav element on load + if(section.hasClass(ACTIVE)){ + activateMenuAndNav(options.anchors[index], index); + } + } + + //moving the menu outside the main container if it is inside (avoid problems with fixed positions when using CSS3 tranforms) + if(options.menu && options.css3 && $(options.menu).closest(WRAPPER_SEL).length){ + $(options.menu).appendTo($body); + } + } + + /** + * Adds internal classes to be able to provide customizable selectors + * keeping the link with the style sheet. + */ + function addInternalSelectors(){ + container.find(options.sectionSelector).addClass(SECTION); + container.find(options.slideSelector).addClass(SLIDE); + } + + /** + * Creates the control arrows for the given section + */ + function createSlideArrows(section){ + section.find(SLIDES_WRAPPER_SEL).after('
'); + + if(options.controlArrowColor!='#fff'){ + section.find(SLIDES_ARROW_NEXT_SEL).css('border-color', 'transparent transparent transparent '+options.controlArrowColor); + section.find(SLIDES_ARROW_PREV_SEL).css('border-color', 'transparent '+ options.controlArrowColor + ' transparent transparent'); + } + + if(!options.loopHorizontal){ + section.find(SLIDES_ARROW_PREV_SEL).hide(); + } + } + + /** + * Creates a vertical navigation bar. + */ + function addVerticalNavigation(){ + $body.append('
    '); + var nav = $(SECTION_NAV_SEL); + + nav.addClass(function() { + return options.showActiveTooltip ? SHOW_ACTIVE_TOOLTIP + ' ' + options.navigationPosition : options.navigationPosition; + }); + + for (var i = 0; i < $(SECTION_SEL).length; i++) { + var link = ''; + if (options.anchors.length) { + link = options.anchors[i]; + } + + var li = '
  • '; + + // Only add tooltip if needed (defined by user) + var tooltip = options.navigationTooltips[i]; + + if (typeof tooltip !== 'undefined' && tooltip !== '') { + li += '
    ' + tooltip + '
    '; + } + + li += '
  • '; + + nav.find('ul').append(li); + } + + //centering it vertically + $(SECTION_NAV_SEL).css('margin-top', '-' + ($(SECTION_NAV_SEL).height()/2) + 'px'); + + //activating the current active section + $(SECTION_NAV_SEL).find('li').eq($(SECTION_ACTIVE_SEL).index(SECTION_SEL)).find('a').addClass(ACTIVE); + } + + /* + * Enables the Youtube videos API so we can control their flow if necessary. + */ + function enableYoutubeAPI(){ + container.find('iframe[src*="youtube.com/embed/"]').each(function(){ + addURLParam($(this), 'enablejsapi=1'); + }); + } + + /** + * Adds a new parameter and its value to the `src` of a given element + */ + function addURLParam(element, newParam){ + var originalSrc = element.attr('src'); + element.attr('src', originalSrc + getUrlParamSign(originalSrc) + newParam); + } + + /* + * Returns the prefix sign to use for a new parameter in an existen URL. + * + * @return {String} ? | & + */ + function getUrlParamSign(url){ + return ( !/\?/.test( url ) ) ? '?' : '&'; + } + + /** + * Actions and callbacks to fire afterRender + */ + function afterRenderActions(){ + var section = $(SECTION_ACTIVE_SEL); + + section.addClass(COMPLETELY); + + lazyLoad(section); + playMedia(section); + + if(options.scrollOverflow){ + options.scrollOverflowHandler.afterLoad(); + } + + if(isDestinyTheStartingSection()){ + $.isFunction( options.afterLoad ) && options.afterLoad.call(section, section.data('anchor'), (section.index(SECTION_SEL) + 1)); + } + + $.isFunction( options.afterRender ) && options.afterRender.call(container); + } + + /** + * Determines if the URL anchor destiny is the starting section (the one using 'active' class before initialization) + */ + function isDestinyTheStartingSection(){ + var destinationSection = getSectionByAnchor(getAnchorsURL().section); + return !destinationSection || destinationSection.length && destinationSection.index() === startingSection.index(); + } + + + var isScrolling = false; + var lastScroll = 0; + + //when scrolling... + function scrollHandler(){ + var currentSection; + + if(!options.autoScrolling || options.scrollBar){ + var currentScroll = $window.scrollTop(); + var scrollDirection = getScrollDirection(currentScroll); + var visibleSectionIndex = 0; + var screen_mid = currentScroll + ($window.height() / 2.0); + var isAtBottom = $body.height() - $window.height() === currentScroll; + var sections = document.querySelectorAll(SECTION_SEL); + + //when using `auto-height` for a small last section it won't be centered in the viewport + if(isAtBottom){ + visibleSectionIndex = sections.length - 1; + } + //is at top? when using `auto-height` for a small first section it won't be centered in the viewport + else if(!currentScroll){ + visibleSectionIndex = 0; + } + + //taking the section which is showing more content in the viewport + else{ + for (var i = 0; i < sections.length; ++i) { + var section = sections[i]; + + // Pick the the last section which passes the middle line of the screen. + if (section.offsetTop <= screen_mid) + { + visibleSectionIndex = i; + } + } + } + + if(isCompletelyInViewPort(scrollDirection)){ + if(!$(SECTION_ACTIVE_SEL).hasClass(COMPLETELY)){ + $(SECTION_ACTIVE_SEL).addClass(COMPLETELY).siblings().removeClass(COMPLETELY); + } + } + + //geting the last one, the current one on the screen + currentSection = $(sections).eq(visibleSectionIndex); + + //setting the visible section as active when manually scrolling + //executing only once the first time we reach the section + if(!currentSection.hasClass(ACTIVE)){ + isScrolling = true; + var leavingSection = $(SECTION_ACTIVE_SEL); + var leavingSectionIndex = leavingSection.index(SECTION_SEL) + 1; + var yMovement = getYmovement(currentSection); + var anchorLink = currentSection.data('anchor'); + var sectionIndex = currentSection.index(SECTION_SEL) + 1; + var activeSlide = currentSection.find(SLIDE_ACTIVE_SEL); + var slideIndex; + var slideAnchorLink; + + if(activeSlide.length){ + slideAnchorLink = activeSlide.data('anchor'); + slideIndex = activeSlide.index(); + } + + if(canScroll){ + currentSection.addClass(ACTIVE).siblings().removeClass(ACTIVE); + + $.isFunction( options.onLeave ) && options.onLeave.call( leavingSection, leavingSectionIndex, sectionIndex, yMovement); + $.isFunction( options.afterLoad ) && options.afterLoad.call( currentSection, anchorLink, sectionIndex); + + stopMedia(leavingSection); + lazyLoad(currentSection); + playMedia(currentSection); + + activateMenuAndNav(anchorLink, sectionIndex - 1); + + if(options.anchors.length){ + //needed to enter in hashChange event when using the menu with anchor links + lastScrolledDestiny = anchorLink; + } + setState(slideIndex, slideAnchorLink, anchorLink, sectionIndex); + } + + //small timeout in order to avoid entering in hashChange event when scrolling is not finished yet + clearTimeout(scrollId); + scrollId = setTimeout(function(){ + isScrolling = false; + }, 100); + } + + if(options.fitToSection){ + //for the auto adjust of the viewport to fit a whole section + clearTimeout(scrollId2); + + scrollId2 = setTimeout(function(){ + //checking it again in case it changed during the delay + if(options.fitToSection && + + //is the destination element bigger than the viewport? + $(SECTION_ACTIVE_SEL).outerHeight() <= windowsHeight + ){ + fitToSection(); + } + }, options.fitToSectionDelay); + } + } + } + + /** + * Fits the site to the nearest active section + */ + function fitToSection(){ + //checking fitToSection again in case it was set to false before the timeout delay + if(canScroll){ + //allows to scroll to an active section and + //if the section is already active, we prevent firing callbacks + isResizing = true; + + scrollPage($(SECTION_ACTIVE_SEL)); + isResizing = false; + } + } + + /** + * Determines whether the active section has seen in its whole or not. + */ + function isCompletelyInViewPort(movement){ + var top = $(SECTION_ACTIVE_SEL).position().top; + var bottom = top + $window.height(); + + if(movement == 'up'){ + return bottom >= ($window.scrollTop() + $window.height()); + } + return top <= $window.scrollTop(); + } + + /** + * Gets the directon of the the scrolling fired by the scroll event. + */ + function getScrollDirection(currentScroll){ + var direction = currentScroll > lastScroll ? 'down' : 'up'; + + lastScroll = currentScroll; + + //needed for auto-height sections to determine if we want to scroll to the top or bottom of the destination + previousDestTop = currentScroll; + + return direction; + } + + /** + * Determines the way of scrolling up or down: + * by 'automatically' scrolling a section or by using the default and normal scrolling. + */ + function scrolling(type){ + if (!isScrollAllowed.m[type]){ + return; + } + + var scrollSection = (type === 'down') ? moveSectionDown : moveSectionUp; + + if(options.scrollOverflow){ + var scrollable = options.scrollOverflowHandler.scrollable($(SECTION_ACTIVE_SEL)); + var check = (type === 'down') ? 'bottom' : 'top'; + + if(scrollable.length > 0 ){ + //is the scrollbar at the start/end of the scroll? + if(options.scrollOverflowHandler.isScrolled(check, scrollable)){ + scrollSection(); + }else{ + return true; + } + }else{ + // moved up/down + scrollSection(); + } + }else{ + // moved up/down + scrollSection(); + } + } + + /* + * Preventing bouncing in iOS #2285 + */ + function preventBouncing(event){ + var e = event.originalEvent; + if(options.autoScrolling && isReallyTouch(e)){ + //preventing the easing on iOS devices + event.preventDefault(); + } + } + + var touchStartY = 0; + var touchStartX = 0; + var touchEndY = 0; + var touchEndX = 0; + + /* Detecting touch events + + * As we are changing the top property of the page on scrolling, we can not use the traditional way to detect it. + * This way, the touchstart and the touch moves shows an small difference between them which is the + * used one to determine the direction. + */ + function touchMoveHandler(event){ + var e = event.originalEvent; + var activeSection = $(e.target).closest(SECTION_SEL); + + // additional: if one of the normalScrollElements isn't within options.normalScrollElementTouchThreshold hops up the DOM chain + if (isReallyTouch(e) ) { + + if(options.autoScrolling){ + //preventing the easing on iOS devices + event.preventDefault(); + } + + var touchEvents = getEventsPage(e); + + touchEndY = touchEvents.y; + touchEndX = touchEvents.x; + + //if movement in the X axys is greater than in the Y and the currect section has slides... + if (activeSection.find(SLIDES_WRAPPER_SEL).length && Math.abs(touchStartX - touchEndX) > (Math.abs(touchStartY - touchEndY))) { + + //is the movement greater than the minimum resistance to scroll? + if (!slideMoving && Math.abs(touchStartX - touchEndX) > ($window.outerWidth() / 100 * options.touchSensitivity)) { + if (touchStartX > touchEndX) { + if(isScrollAllowed.m.right){ + moveSlideRight(activeSection); //next + } + } else { + if(isScrollAllowed.m.left){ + moveSlideLeft(activeSection); //prev + } + } + } + } + + //vertical scrolling (only when autoScrolling is enabled) + else if(options.autoScrolling && canScroll){ + + //is the movement greater than the minimum resistance to scroll? + if (Math.abs(touchStartY - touchEndY) > ($window.height() / 100 * options.touchSensitivity)) { + if (touchStartY > touchEndY) { + scrolling('down'); + } else if (touchEndY > touchStartY) { + scrolling('up'); + } + } + } + } + } + + /** + * As IE >= 10 fires both touch and mouse events when using a mouse in a touchscreen + * this way we make sure that is really a touch event what IE is detecting. + */ + function isReallyTouch(e){ + //if is not IE || IE is detecting `touch` or `pen` + return typeof e.pointerType === 'undefined' || e.pointerType != 'mouse'; + } + + /** + * Handler for the touch start event. + */ + function touchStartHandler(event){ + var e = event.originalEvent; + + //stopping the auto scroll to adjust to a section + if(options.fitToSection){ + $htmlBody.stop(); + } + + if(isReallyTouch(e)){ + var touchEvents = getEventsPage(e); + touchStartY = touchEvents.y; + touchStartX = touchEvents.x; + } + } + + /** + * Gets the average of the last `number` elements of the given array. + */ + function getAverage(elements, number){ + var sum = 0; + + //taking `number` elements from the end to make the average, if there are not enought, 1 + var lastElements = elements.slice(Math.max(elements.length - number, 1)); + + for(var i = 0; i < lastElements.length; i++){ + sum = sum + lastElements[i]; + } + + return Math.ceil(sum/number); + } + + /** + * Detecting mousewheel scrolling + * + * http://blogs.sitepointstatic.com/examples/tech/mouse-wheel/index.html + * http://www.sitepoint.com/html5-javascript-mouse-wheel/ + */ + var prevTime = new Date().getTime(); + + function MouseWheelHandler(e) { + var curTime = new Date().getTime(); + var isNormalScroll = $(COMPLETELY_SEL).hasClass(NORMAL_SCROLL); + + //autoscrolling and not zooming? + if(options.autoScrolling && !controlPressed && !isNormalScroll){ + // cross-browser wheel delta + e = e || window.event; + var value = e.wheelDelta || -e.deltaY || -e.detail; + var delta = Math.max(-1, Math.min(1, value)); + + var horizontalDetection = typeof e.wheelDeltaX !== 'undefined' || typeof e.deltaX !== 'undefined'; + var isScrollingVertically = (Math.abs(e.wheelDeltaX) < Math.abs(e.wheelDelta)) || (Math.abs(e.deltaX ) < Math.abs(e.deltaY) || !horizontalDetection); + + //Limiting the array to 150 (lets not waste memory!) + if(scrollings.length > 149){ + scrollings.shift(); + } + + //keeping record of the previous scrollings + scrollings.push(Math.abs(value)); + + //preventing to scroll the site on mouse wheel when scrollbar is present + if(options.scrollBar){ + e.preventDefault ? e.preventDefault() : e.returnValue = false; + } + + //time difference between the last scroll and the current one + var timeDiff = curTime-prevTime; + prevTime = curTime; + + //haven't they scrolled in a while? + //(enough to be consider a different scrolling action to scroll another section) + if(timeDiff > 200){ + //emptying the array, we dont care about old scrollings for our averages + scrollings = []; + } + + if(canScroll){ + var averageEnd = getAverage(scrollings, 10); + var averageMiddle = getAverage(scrollings, 70); + var isAccelerating = averageEnd >= averageMiddle; + + //to avoid double swipes... + if(isAccelerating && isScrollingVertically){ + //scrolling down? + if (delta < 0) { + scrolling('down'); + + //scrolling up? + }else { + scrolling('up'); + } + } + } + + return false; + } + + if(options.fitToSection){ + //stopping the auto scroll to adjust to a section + $htmlBody.stop(); + } + } + + /** + * Slides a slider to the given direction. + * Optional `section` param. + */ + function moveSlide(direction, section){ + var activeSection = typeof section === 'undefined' ? $(SECTION_ACTIVE_SEL) : section; + var slides = activeSection.find(SLIDES_WRAPPER_SEL); + var numSlides = slides.find(SLIDE_SEL).length; + + // more than one slide needed and nothing should be sliding + if (!slides.length || slideMoving || numSlides < 2) { + return; + } + + var currentSlide = slides.find(SLIDE_ACTIVE_SEL); + var destiny = null; + + if(direction === 'left'){ + destiny = currentSlide.prev(SLIDE_SEL); + }else{ + destiny = currentSlide.next(SLIDE_SEL); + } + + //isn't there a next slide in the secuence? + if(!destiny.length){ + //respect loopHorizontal settin + if (!options.loopHorizontal) return; + + if(direction === 'left'){ + destiny = currentSlide.siblings(':last'); + }else{ + destiny = currentSlide.siblings(':first'); + } + } + + slideMoving = true; + + landscapeScroll(slides, destiny, direction); + } + + /** + * Maintains the active slides in the viewport + * (Because the `scroll` animation might get lost with some actions, such as when using continuousVertical) + */ + function keepSlidesPosition(){ + $(SLIDE_ACTIVE_SEL).each(function(){ + silentLandscapeScroll($(this), 'internal'); + }); + } + + var previousDestTop = 0; + /** + * Returns the destination Y position based on the scrolling direction and + * the height of the section. + */ + function getDestinationPosition(element){ + var elemPosition = element.position(); + + //top of the desination will be at the top of the viewport + var position = elemPosition.top; + var isScrollingDown = elemPosition.top > previousDestTop; + var sectionBottom = position - windowsHeight + element.outerHeight(); + var bigSectionsDestination = options.bigSectionsDestination; + + //is the destination element bigger than the viewport? + if(element.outerHeight() > windowsHeight){ + //scrolling up? + if(!isScrollingDown && !bigSectionsDestination || bigSectionsDestination === 'bottom' ){ + position = sectionBottom; + } + } + + //sections equal or smaller than the viewport height && scrolling down? || is resizing and its in the last section + else if(isScrollingDown || (isResizing && element.is(':last-child')) ){ + //The bottom of the destination will be at the bottom of the viewport + position = sectionBottom; + } + + /* + Keeping record of the last scrolled position to determine the scrolling direction. + No conventional methods can be used as the scroll bar might not be present + AND the section might not be active if it is auto-height and didnt reach the middle + of the viewport. + */ + previousDestTop = position; + return position; + } + + /** + * Scrolls the site to the given element and scrolls to the slide if a callback is given. + */ + function scrollPage(element, callback, isMovementUp){ + if(typeof element === 'undefined'){ return; } //there's no element to scroll, leaving the function + + var dtop = getDestinationPosition(element); + var slideAnchorLink; + var slideIndex; + + //local variables + var v = { + element: element, + callback: callback, + isMovementUp: isMovementUp, + dtop: dtop, + yMovement: getYmovement(element), + anchorLink: element.data('anchor'), + sectionIndex: element.index(SECTION_SEL), + activeSlide: element.find(SLIDE_ACTIVE_SEL), + activeSection: $(SECTION_ACTIVE_SEL), + leavingSection: $(SECTION_ACTIVE_SEL).index(SECTION_SEL) + 1, + + //caching the value of isResizing at the momment the function is called + //because it will be checked later inside a setTimeout and the value might change + localIsResizing: isResizing + }; + + //quiting when destination scroll is the same as the current one + if((v.activeSection.is(element) && !isResizing) || (options.scrollBar && $window.scrollTop() === v.dtop && !element.hasClass(AUTO_HEIGHT) )){ return; } + + if(v.activeSlide.length){ + slideAnchorLink = v.activeSlide.data('anchor'); + slideIndex = v.activeSlide.index(); + } + + //callback (onLeave) if the site is not just resizing and readjusting the slides + if($.isFunction(options.onLeave) && !v.localIsResizing){ + var direction = v.yMovement; + + //required for continousVertical + if(typeof isMovementUp !== 'undefined'){ + direction = isMovementUp ? 'up' : 'down'; + } + + if(options.onLeave.call(v.activeSection, v.leavingSection, (v.sectionIndex + 1), direction) === false){ + return; + } + } + + // If continuousVertical && we need to wrap around + if (options.autoScrolling && options.continuousVertical && typeof (v.isMovementUp) !== "undefined" && + ((!v.isMovementUp && v.yMovement == 'up') || // Intending to scroll down but about to go up or + (v.isMovementUp && v.yMovement == 'down'))) { // intending to scroll up but about to go down + + v = createInfiniteSections(v); + } + + //pausing media of the leaving section (if we are not just resizing, as destinatino will be the same one) + if(!v.localIsResizing){ + stopMedia(v.activeSection); + } + + if(options.scrollOverflow){ + options.scrollOverflowHandler.beforeLeave(); + } + + element.addClass(ACTIVE).siblings().removeClass(ACTIVE); + lazyLoad(element); + + if(options.scrollOverflow){ + options.scrollOverflowHandler.onLeave(); + } + + //preventing from activating the MouseWheelHandler event + //more than once if the page is scrolling + canScroll = false; + + setState(slideIndex, slideAnchorLink, v.anchorLink, v.sectionIndex); + + performMovement(v); + + //flag to avoid callingn `scrollPage()` twice in case of using anchor links + lastScrolledDestiny = v.anchorLink; + + //avoid firing it twice (as it does also on scroll) + activateMenuAndNav(v.anchorLink, v.sectionIndex); + } + + /** + * Performs the vertical movement (by CSS3 or by jQuery) + */ + function performMovement(v){ + // using CSS3 translate functionality + if (options.css3 && options.autoScrolling && !options.scrollBar) { + + // The first section can have a negative value in iOS 10. Not quite sure why: -0.0142822265625 + // that's why we round it to 0. + var translate3d = 'translate3d(0px, -' + Math.round(v.dtop) + 'px, 0px)'; + transformContainer(translate3d, true); + + //even when the scrollingSpeed is 0 there's a little delay, which might cause the + //scrollingSpeed to change in case of using silentMoveTo(); + if(options.scrollingSpeed){ + clearTimeout(afterSectionLoadsId); + afterSectionLoadsId = setTimeout(function () { + afterSectionLoads(v); + }, options.scrollingSpeed); + }else{ + afterSectionLoads(v); + } + } + + // using jQuery animate + else{ + var scrollSettings = getScrollSettings(v); + + $(scrollSettings.element).animate( + scrollSettings.options, + options.scrollingSpeed, options.easing).promise().done(function () { //only one single callback in case of animating `html, body` + if(options.scrollBar){ + + /* Hack! + The timeout prevents setting the most dominant section in the viewport as "active" when the user + scrolled to a smaller section by using the mousewheel (auto scrolling) rather than draging the scroll bar. + + When using scrollBar:true It seems like the scroll events still getting propagated even after the scrolling animation has finished. + */ + setTimeout(function(){ + afterSectionLoads(v); + },30); + }else{ + afterSectionLoads(v); + } + }); + } + } + + /** + * Gets the scrolling settings depending on the plugin autoScrolling option + */ + function getScrollSettings(v){ + var scroll = {}; + + if(options.autoScrolling && !options.scrollBar){ + scroll.options = { 'top': -v.dtop}; + scroll.element = WRAPPER_SEL; + }else{ + scroll.options = { 'scrollTop': v.dtop}; + scroll.element = 'html, body'; + } + + return scroll; + } + + /** + * Adds sections before or after the current one to create the infinite effect. + */ + function createInfiniteSections(v){ + // Scrolling down + if (!v.isMovementUp) { + // Move all previous sections to after the active section + $(SECTION_ACTIVE_SEL).after(v.activeSection.prevAll(SECTION_SEL).get().reverse()); + } + else { // Scrolling up + // Move all next sections to before the active section + $(SECTION_ACTIVE_SEL).before(v.activeSection.nextAll(SECTION_SEL)); + } + + // Maintain the displayed position (now that we changed the element order) + silentScroll($(SECTION_ACTIVE_SEL).position().top); + + // Maintain the active slides visible in the viewport + keepSlidesPosition(); + + // save for later the elements that still need to be reordered + v.wrapAroundElements = v.activeSection; + + // Recalculate animation variables + v.dtop = v.element.position().top; + v.yMovement = getYmovement(v.element); + + //sections will temporally have another position in the DOM + //updating this values in case we need them + v.leavingSection = v.activeSection.index(SECTION_SEL) + 1; + v.sectionIndex = v.element.index(SECTION_SEL); + + return v; + } + + /** + * Fix section order after continuousVertical changes have been animated + */ + function continuousVerticalFixSectionOrder (v) { + // If continuousVertical is in effect (and autoScrolling would also be in effect then), + // finish moving the elements around so the direct navigation will function more simply + if (!v.wrapAroundElements || !v.wrapAroundElements.length) { + return; + } + + if (v.isMovementUp) { + $(SECTION_FIRST_SEL).before(v.wrapAroundElements); + } + else { + $(SECTION_LAST_SEL).after(v.wrapAroundElements); + } + + silentScroll($(SECTION_ACTIVE_SEL).position().top); + + // Maintain the active slides visible in the viewport + keepSlidesPosition(); + } + + + /** + * Actions to do once the section is loaded. + */ + function afterSectionLoads (v){ + continuousVerticalFixSectionOrder(v); + + //callback (afterLoad) if the site is not just resizing and readjusting the slides + $.isFunction(options.afterLoad) && !v.localIsResizing && options.afterLoad.call(v.element, v.anchorLink, (v.sectionIndex + 1)); + + if(options.scrollOverflow){ + options.scrollOverflowHandler.afterLoad(); + } + + if(!v.localIsResizing){ + playMedia(v.element); + } + + v.element.addClass(COMPLETELY).siblings().removeClass(COMPLETELY); + + canScroll = true; + + $.isFunction(v.callback) && v.callback.call(this); + } + + /** + * Sets the value for the given attribute from the `data-` attribute with the same suffix + * ie: data-srcset ==> srcset | data-src ==> src + */ + function setSrc(element, attribute){ + element + .attr(attribute, element.data(attribute)) + .removeAttr('data-' + attribute); + } + + /** + * Lazy loads image, video and audio elements. + */ + function lazyLoad(destiny){ + if (!options.lazyLoading){ + return; + } + + var panel = getSlideOrSection(destiny); + var element; + + panel.find('img[data-src], img[data-srcset], source[data-src], source[data-srcset], video[data-src], audio[data-src], iframe[data-src]').each(function(){ + element = $(this); + + $.each(['src', 'srcset'], function(index, type){ + var attribute = element.attr('data-' + type); + if(typeof attribute !== 'undefined' && attribute){ + setSrc(element, type); + } + }); + + if(element.is('source') && !element.closest('picture').length) { + var typeToPlay = element.closest('video').length ? 'video' : 'audio'; + element.closest(typeToPlay).get(0).load(); + } + }); + } + + /** + * Plays video and audio elements. + */ + function playMedia(destiny){ + var panel = getSlideOrSection(destiny); + + //playing HTML5 media elements + panel.find('video, audio').each(function(){ + var element = $(this).get(0); + + if( element.hasAttribute('data-autoplay') && typeof element.play === 'function' ) { + element.play(); + } + }); + + //youtube videos + panel.find('iframe[src*="youtube.com/embed/"]').each(function(){ + var element = $(this).get(0); + + if ( element.hasAttribute('data-autoplay') ){ + playYoutube(element); + } + + //in case the URL was not loaded yet. On page load we need time for the new URL (with the API string) to load. + element.onload = function() { + if ( element.hasAttribute('data-autoplay') ){ + playYoutube(element); + } + }; + }); + } + + /** + * Plays a youtube video + */ + function playYoutube(element){ + element.contentWindow.postMessage('{"event":"command","func":"playVideo","args":""}', '*'); + } + + /** + * Stops video and audio elements. + */ + function stopMedia(destiny){ + var panel = getSlideOrSection(destiny); + + //stopping HTML5 media elements + panel.find('video, audio').each(function(){ + var element = $(this).get(0); + + if( !element.hasAttribute('data-keepplaying') && typeof element.pause === 'function' ) { + element.pause(); + } + }); + + //youtube videos + panel.find('iframe[src*="youtube.com/embed/"]').each(function(){ + var element = $(this).get(0); + + if( /youtube\.com\/embed\//.test($(this).attr('src')) && !element.hasAttribute('data-keepplaying')){ + $(this).get(0).contentWindow.postMessage('{"event":"command","func":"pauseVideo","args":""}','*'); + } + }); + } + + /** + * Gets the active slide (or section) for the given section + */ + function getSlideOrSection(destiny){ + var slide = destiny.find(SLIDE_ACTIVE_SEL); + if( slide.length ) { + destiny = $(slide); + } + + return destiny; + } + + /** + * Scrolls to the anchor in the URL when loading the site + */ + function scrollToAnchor(){ + var anchors = getAnchorsURL(); + var sectionAnchor = anchors.section; + var slideAnchor = anchors.slide; + + if(sectionAnchor){ //if theres any # + if(options.animateAnchor){ + scrollPageAndSlide(sectionAnchor, slideAnchor); + }else{ + silentMoveTo(sectionAnchor, slideAnchor); + } + } + } + + /** + * Detecting any change on the URL to scroll to the given anchor link + * (a way to detect back history button as we play with the hashes on the URL) + */ + function hashChangeHandler(){ + if(!isScrolling && !options.lockAnchors){ + var anchors = getAnchorsURL(); + var sectionAnchor = anchors.section; + var slideAnchor = anchors.slide; + + //when moving to a slide in the first section for the first time (first time to add an anchor to the URL) + var isFirstSlideMove = (typeof lastScrolledDestiny === 'undefined'); + var isFirstScrollMove = (typeof lastScrolledDestiny === 'undefined' && typeof slideAnchor === 'undefined' && !slideMoving); + + if(sectionAnchor && sectionAnchor.length){ + /*in order to call scrollpage() only once for each destination at a time + It is called twice for each scroll otherwise, as in case of using anchorlinks `hashChange` + event is fired on every scroll too.*/ + if ((sectionAnchor && sectionAnchor !== lastScrolledDestiny) && !isFirstSlideMove + || isFirstScrollMove + || (!slideMoving && lastScrolledSlide != slideAnchor )){ + + scrollPageAndSlide(sectionAnchor, slideAnchor); + } + } + } + } + + //gets the URL anchors (section and slide) + function getAnchorsURL(){ + var section; + var slide; + var hash = window.location.hash; + + if(hash.length){ + //getting the anchor link in the URL and deleting the `#` + var anchorsParts = hash.replace('#', '').split('/'); + + //using / for visual reasons and not as a section/slide separator #2803 + var isFunkyAnchor = hash.indexOf('#/') > -1; + + section = isFunkyAnchor ? '/' + anchorsParts[1] : decodeURIComponent(anchorsParts[0]); + + var slideAnchor = isFunkyAnchor ? anchorsParts[2] : anchorsParts[1]; + if(slideAnchor && slideAnchor.length){ + slide = decodeURIComponent(slideAnchor); + } + } + + return { + section: section, + slide: slide + } + } + + //Sliding with arrow keys, both, vertical and horizontal + function keydownHandler(e) { + clearTimeout(keydownId); + + var activeElement = $(':focus'); + var keyCode = e.which; + + //tab? + if(keyCode === 9){ + onTab(e); + } + + else if(!activeElement.is('textarea') && !activeElement.is('input') && !activeElement.is('select') && + activeElement.attr('contentEditable') !== "true" && activeElement.attr('contentEditable') !== '' && + options.keyboardScrolling && options.autoScrolling){ + + //preventing the scroll with arrow keys & spacebar & Page Up & Down keys + var keyControls = [40, 38, 32, 33, 34]; + if($.inArray(keyCode, keyControls) > -1){ + e.preventDefault(); + } + + controlPressed = e.ctrlKey; + + keydownId = setTimeout(function(){ + onkeydown(e); + },150); + } + } + + function tooltipTextHandler(){ + $(this).prev().trigger('click'); + } + + //to prevent scrolling while zooming + function keyUpHandler(e){ + if(isWindowFocused){ //the keyup gets fired on new tab ctrl + t in Firefox + controlPressed = e.ctrlKey; + } + } + + //binding the mousemove when the mouse's middle button is released + function mouseDownHandler(e){ + //middle button + if (e.which == 2){ + oldPageY = e.pageY; + container.on('mousemove', mouseMoveHandler); + } + } + + //unbinding the mousemove when the mouse's middle button is released + function mouseUpHandler(e){ + //middle button + if (e.which == 2){ + container.off('mousemove'); + } + } + + //Scrolling horizontally when clicking on the slider controls. + function slideArrowHandler(){ + var section = $(this).closest(SECTION_SEL); + + if ($(this).hasClass(SLIDES_PREV)) { + if(isScrollAllowed.m.left){ + moveSlideLeft(section); + } + } else { + if(isScrollAllowed.m.right){ + moveSlideRight(section); + } + } + } + + //when opening a new tab (ctrl + t), `control` won't be pressed when coming back. + function blurHandler(){ + isWindowFocused = false; + controlPressed = false; + } + + //Scrolls to the section when clicking the navigation bullet + function sectionBulletHandler(e){ + e.preventDefault(); + var index = $(this).parent().index(); + scrollPage($(SECTION_SEL).eq(index)); + } + + //Scrolls the slider to the given slide destination for the given section + function slideBulletHandler(e){ + e.preventDefault(); + var slides = $(this).closest(SECTION_SEL).find(SLIDES_WRAPPER_SEL); + var destiny = slides.find(SLIDE_SEL).eq($(this).closest('li').index()); + + landscapeScroll(slides, destiny); + } + + /** + * Keydown event + */ + function onkeydown(e){ + var shiftPressed = e.shiftKey; + + //do nothing if we can not scroll or we are not using horizotnal key arrows. + if(!canScroll && [37,39].indexOf(e.which) < 0){ + return; + } + + switch (e.which) { + //up + case 38: + case 33: + if(isScrollAllowed.k.up){ + moveSectionUp(); + } + break; + + //down + case 32: //spacebar + if(shiftPressed && isScrollAllowed.k.up){ + moveSectionUp(); + break; + } + /* falls through */ + case 40: + case 34: + if(isScrollAllowed.k.down){ + moveSectionDown(); + } + break; + + //Home + case 36: + if(isScrollAllowed.k.up){ + moveTo(1); + } + break; + + //End + case 35: + if(isScrollAllowed.k.down){ + moveTo( $(SECTION_SEL).length ); + } + break; + + //left + case 37: + if(isScrollAllowed.k.left){ + moveSlideLeft(); + } + break; + + //right + case 39: + if(isScrollAllowed.k.right){ + moveSlideRight(); + } + break; + + default: + return; // exit this handler for other keys + } + } + + /** + * Makes sure the tab key will only focus elements within the current section/slide + * preventing this way from breaking the page. + * Based on "Modals and keyboard traps" + * from https://developers.google.com/web/fundamentals/accessibility/focus/using-tabindex + */ + function onTab(e){ + var isShiftPressed = e.shiftKey; + var activeElement = $(':focus'); + var activeSection = $(SECTION_ACTIVE_SEL); + var activeSlide = activeSection.find(SLIDE_ACTIVE_SEL); + var focusableWrapper = activeSlide.length ? activeSlide : activeSection; + var focusableElements = focusableWrapper.find(focusableElementsString).not('[tabindex="-1"]'); + + function preventAndFocusFirst(e){ + e.preventDefault(); + return focusableElements.first().focus(); + } + + //is there an element with focus? + if(activeElement.length){ + if(!activeElement.closest(SECTION_ACTIVE_SEL, SLIDE_ACTIVE_SEL).length){ + activeElement = preventAndFocusFirst(e); + } + } + + //no element if focused? Let's focus the first one of the section/slide + else{ + preventAndFocusFirst(e); + } + + //when reached the first or last focusable element of the section/slide + //we prevent the tab action to keep it in the last focusable element + if(!isShiftPressed && activeElement.is(focusableElements.last()) || + isShiftPressed && activeElement.is(focusableElements.first()) + ){ + e.preventDefault(); + } + } + + /** + * Detecting the direction of the mouse movement. + * Used only for the middle button of the mouse. + */ + var oldPageY = 0; + function mouseMoveHandler(e){ + if(canScroll){ + // moving up + if (e.pageY < oldPageY && isScrollAllowed.m.up){ + moveSectionUp(); + } + + // moving down + else if(e.pageY > oldPageY && isScrollAllowed.m.down){ + moveSectionDown(); + } + } + oldPageY = e.pageY; + } + + /** + * Scrolls horizontal sliders. + */ + function landscapeScroll(slides, destiny, direction){ + var section = slides.closest(SECTION_SEL); + var v = { + slides: slides, + destiny: destiny, + direction: direction, + destinyPos: destiny.position(), + slideIndex: destiny.index(), + section: section, + sectionIndex: section.index(SECTION_SEL), + anchorLink: section.data('anchor'), + slidesNav: section.find(SLIDES_NAV_SEL), + slideAnchor: getAnchor(destiny), + prevSlide: section.find(SLIDE_ACTIVE_SEL), + prevSlideIndex: section.find(SLIDE_ACTIVE_SEL).index(), + + //caching the value of isResizing at the momment the function is called + //because it will be checked later inside a setTimeout and the value might change + localIsResizing: isResizing + }; + v.xMovement = getXmovement(v.prevSlideIndex, v.slideIndex); + + //important!! Only do it when not resizing + if(!v.localIsResizing){ + //preventing from scrolling to the next/prev section when using scrollHorizontally + canScroll = false; + } + + if(options.onSlideLeave){ + + //if the site is not just resizing and readjusting the slides + if(!v.localIsResizing && v.xMovement!=='none'){ + if($.isFunction( options.onSlideLeave )){ + if(options.onSlideLeave.call( v.prevSlide, v.anchorLink, (v.sectionIndex + 1), v.prevSlideIndex, v.direction, v.slideIndex ) === false){ + slideMoving = false; + return; + } + } + } + } + + destiny.addClass(ACTIVE).siblings().removeClass(ACTIVE); + + if(!v.localIsResizing){ + stopMedia(v.prevSlide); + lazyLoad(destiny); + } + + if(!options.loopHorizontal && options.controlArrows){ + //hidding it for the fist slide, showing for the rest + section.find(SLIDES_ARROW_PREV_SEL).toggle(v.slideIndex!==0); + + //hidding it for the last slide, showing for the rest + section.find(SLIDES_ARROW_NEXT_SEL).toggle(!destiny.is(':last-child')); + } + + //only changing the URL if the slides are in the current section (not for resize re-adjusting) + if(section.hasClass(ACTIVE) && !v.localIsResizing){ + setState(v.slideIndex, v.slideAnchor, v.anchorLink, v.sectionIndex); + } + + performHorizontalMove(slides, v, true); + } + + + function afterSlideLoads(v){ + activeSlidesNavigation(v.slidesNav, v.slideIndex); + + //if the site is not just resizing and readjusting the slides + if(!v.localIsResizing){ + $.isFunction( options.afterSlideLoad ) && options.afterSlideLoad.call( v.destiny, v.anchorLink, (v.sectionIndex + 1), v.slideAnchor, v.slideIndex); + + //needs to be inside the condition to prevent problems with continuousVertical and scrollHorizontally + //and to prevent double scroll right after a windows resize + canScroll = true; + + playMedia(v.destiny); + } + + //letting them slide again + slideMoving = false; + } + + /** + * Performs the horizontal movement. (CSS3 or jQuery) + * + * @param fireCallback {Bool} - determines whether or not to fire the callback + */ + function performHorizontalMove(slides, v, fireCallback){ + var destinyPos = v.destinyPos; + + if(options.css3){ + var translate3d = 'translate3d(-' + Math.round(destinyPos.left) + 'px, 0px, 0px)'; + + addAnimation(slides.find(SLIDES_CONTAINER_SEL)).css(getTransforms(translate3d)); + + afterSlideLoadsId = setTimeout(function(){ + fireCallback && afterSlideLoads(v); + }, options.scrollingSpeed, options.easing); + }else{ + slides.animate({ + scrollLeft : Math.round(destinyPos.left) + }, options.scrollingSpeed, options.easing, function() { + + fireCallback && afterSlideLoads(v); + }); + } + } + + /** + * Sets the state for the horizontal bullet navigations. + */ + function activeSlidesNavigation(slidesNav, slideIndex){ + slidesNav.find(ACTIVE_SEL).removeClass(ACTIVE); + slidesNav.find('li').eq(slideIndex).find('a').addClass(ACTIVE); + } + + var previousHeight = windowsHeight; + + //when resizing the site, we adjust the heights of the sections, slimScroll... + function resizeHandler(){ + //checking if it needs to get responsive + responsive(); + + // rebuild immediately on touch devices + if (isTouchDevice) { + var activeElement = $(document.activeElement); + + //if the keyboard is NOT visible + if (!activeElement.is('textarea') && !activeElement.is('input') && !activeElement.is('select')) { + var currentHeight = $window.height(); + + //making sure the change in the viewport size is enough to force a rebuild. (20 % of the window to avoid problems when hidding scroll bars) + if( Math.abs(currentHeight - previousHeight) > (20 * Math.max(previousHeight, currentHeight) / 100) ){ + reBuild(true); + previousHeight = currentHeight; + } + } + }else{ + //in order to call the functions only when the resize is finished + //http://stackoverflow.com/questions/4298612/jquery-how-to-call-resize-event-only-once-its-finished-resizing + clearTimeout(resizeId); + + resizeId = setTimeout(function(){ + reBuild(true); + }, 350); + } + } + + /** + * Checks if the site needs to get responsive and disables autoScrolling if so. + * A class `fp-responsive` is added to the plugin's container in case the user wants to use it for his own responsive CSS. + */ + function responsive(){ + var widthLimit = options.responsive || options.responsiveWidth; //backwards compatiblity + var heightLimit = options.responsiveHeight; + + //only calculating what we need. Remember its called on the resize event. + var isBreakingPointWidth = widthLimit && $window.outerWidth() < widthLimit; + var isBreakingPointHeight = heightLimit && $window.height() < heightLimit; + + if(widthLimit && heightLimit){ + setResponsive(isBreakingPointWidth || isBreakingPointHeight); + } + else if(widthLimit){ + setResponsive(isBreakingPointWidth); + } + else if(heightLimit){ + setResponsive(isBreakingPointHeight); + } + } + + /** + * Adds transition animations for the given element + */ + function addAnimation(element){ + var transition = 'all ' + options.scrollingSpeed + 'ms ' + options.easingcss3; + + element.removeClass(NO_TRANSITION); + return element.css({ + '-webkit-transition': transition, + 'transition': transition + }); + } + + /** + * Remove transition animations for the given element + */ + function removeAnimation(element){ + return element.addClass(NO_TRANSITION); + } + + /** + * Activating the vertical navigation bullets according to the given slide name. + */ + function activateNavDots(name, sectionIndex){ + if(options.navigation){ + $(SECTION_NAV_SEL).find(ACTIVE_SEL).removeClass(ACTIVE); + if(name){ + $(SECTION_NAV_SEL).find('a[href="#' + name + '"]').addClass(ACTIVE); + }else{ + $(SECTION_NAV_SEL).find('li').eq(sectionIndex).find('a').addClass(ACTIVE); + } + } + } + + /** + * Activating the website main menu elements according to the given slide name. + */ + function activateMenuElement(name){ + if(options.menu){ + $(options.menu).find(ACTIVE_SEL).removeClass(ACTIVE); + $(options.menu).find('[data-menuanchor="'+name+'"]').addClass(ACTIVE); + } + } + + /** + * Sets to active the current menu and vertical nav items. + */ + function activateMenuAndNav(anchor, index){ + activateMenuElement(anchor); + activateNavDots(anchor, index); + } + + /** + * Retuns `up` or `down` depending on the scrolling movement to reach its destination + * from the current section. + */ + function getYmovement(destiny){ + var fromIndex = $(SECTION_ACTIVE_SEL).index(SECTION_SEL); + var toIndex = destiny.index(SECTION_SEL); + if( fromIndex == toIndex){ + return 'none'; + } + if(fromIndex > toIndex){ + return 'up'; + } + return 'down'; + } + + /** + * Retuns `right` or `left` depending on the scrolling movement to reach its destination + * from the current slide. + */ + function getXmovement(fromIndex, toIndex){ + if( fromIndex == toIndex){ + return 'none'; + } + if(fromIndex > toIndex){ + return 'left'; + } + return 'right'; + } + + function addTableClass(element){ + //In case we are styling for the 2nd time as in with reponsiveSlides + if(!element.hasClass(TABLE)){ + var wrapper = $('
    ').height(getTableHeight(element)); + element.addClass(TABLE).wrapInner(wrapper); + } + } + + function getTableHeight(element){ + var sectionHeight = windowsHeight; + + if(options.paddingTop || options.paddingBottom){ + var section = element; + if(!section.hasClass(SECTION)){ + section = element.closest(SECTION_SEL); + } + + var paddings = parseInt(section.css('padding-top')) + parseInt(section.css('padding-bottom')); + sectionHeight = (windowsHeight - paddings); + } + + return sectionHeight; + } + + /** + * Adds a css3 transform property to the container class with or without animation depending on the animated param. + */ + function transformContainer(translate3d, animated){ + if(animated){ + addAnimation(container); + }else{ + removeAnimation(container); + } + + container.css(getTransforms(translate3d)); + + //syncronously removing the class after the animation has been applied. + setTimeout(function(){ + container.removeClass(NO_TRANSITION); + },10); + } + + /** + * Gets a section by its anchor / index + */ + function getSectionByAnchor(sectionAnchor){ + var section = container.find(SECTION_SEL + '[data-anchor="'+sectionAnchor+'"]'); + if(!section.length){ + var sectionIndex = typeof sectionAnchor !== 'undefined' ? sectionAnchor -1 : 0; + section = $(SECTION_SEL).eq(sectionIndex); + } + + return section; + } + + /** + * Gets a slide inside a given section by its anchor / index + */ + function getSlideByAnchor(slideAnchor, section){ + var slide = section.find(SLIDE_SEL + '[data-anchor="'+slideAnchor+'"]'); + if(!slide.length){ + slideAnchor = typeof slideAnchor !== 'undefined' ? slideAnchor : 0; + slide = section.find(SLIDE_SEL).eq(slideAnchor); + } + + return slide; + } + + /** + * Scrolls to the given section and slide anchors + */ + function scrollPageAndSlide(sectionAnchor, slideAnchor){ + var section = getSectionByAnchor(sectionAnchor); + + //do nothing if there's no section with the given anchor name + if(!section.length) return; + + var slide = getSlideByAnchor(slideAnchor, section); + + //we need to scroll to the section and then to the slide + if (sectionAnchor !== lastScrolledDestiny && !section.hasClass(ACTIVE)){ + scrollPage(section, function(){ + scrollSlider(slide); + }); + } + //if we were already in the section + else{ + scrollSlider(slide); + } + } + + /** + * Scrolls the slider to the given slide destination for the given section + */ + function scrollSlider(slide){ + if(slide.length){ + landscapeScroll(slide.closest(SLIDES_WRAPPER_SEL), slide); + } + } + + /** + * Creates a landscape navigation bar with dots for horizontal sliders. + */ + function addSlidesNavigation(section, numSlides){ + section.append('
      '); + var nav = section.find(SLIDES_NAV_SEL); + + //top or bottom + nav.addClass(options.slidesNavPosition); + + for(var i=0; i< numSlides; i++){ + nav.find('ul').append('
    • '); + } + + //centering it + nav.css('margin-left', '-' + (nav.width()/2) + 'px'); + + nav.find('li').first().find('a').addClass(ACTIVE); + } + + + /** + * Sets the state of the website depending on the active section/slide. + * It changes the URL hash when needed and updates the body class. + */ + function setState(slideIndex, slideAnchor, anchorLink, sectionIndex){ + var sectionHash = ''; + + if(options.anchors.length && !options.lockAnchors){ + + //isn't it the first slide? + if(slideIndex){ + if(typeof anchorLink !== 'undefined'){ + sectionHash = anchorLink; + } + + //slide without anchor link? We take the index instead. + if(typeof slideAnchor === 'undefined'){ + slideAnchor = slideIndex; + } + + lastScrolledSlide = slideAnchor; + setUrlHash(sectionHash + '/' + slideAnchor); + + //first slide won't have slide anchor, just the section one + }else if(typeof slideIndex !== 'undefined'){ + lastScrolledSlide = slideAnchor; + setUrlHash(anchorLink); + } + + //section without slides + else{ + setUrlHash(anchorLink); + } + } + + setBodyClass(); + } + + /** + * Sets the URL hash. + */ + function setUrlHash(url){ + if(options.recordHistory){ + location.hash = url; + }else{ + //Mobile Chrome doesn't work the normal way, so... lets use HTML5 for phones :) + if(isTouchDevice || isTouch){ + window.history.replaceState(undefined, undefined, '#' + url); + }else{ + var baseUrl = window.location.href.split('#')[0]; + window.location.replace( baseUrl + '#' + url ); + } + } + } + + /** + * Gets the anchor for the given slide / section. Its index will be used if there's none. + */ + function getAnchor(element){ + var anchor = element.data('anchor'); + var index = element.index(); + + //Slide without anchor link? We take the index instead. + if(typeof anchor === 'undefined'){ + anchor = index; + } + + return anchor; + } + + /** + * Sets a class for the body of the page depending on the active section / slide + */ + function setBodyClass(){ + var section = $(SECTION_ACTIVE_SEL); + var slide = section.find(SLIDE_ACTIVE_SEL); + + var sectionAnchor = getAnchor(section); + var slideAnchor = getAnchor(slide); + + var text = String(sectionAnchor); + + if(slide.length){ + text = text + '-' + slideAnchor; + } + + //changing slash for dash to make it a valid CSS style + text = text.replace('/', '-').replace('#',''); + + //removing previous anchor classes + var classRe = new RegExp('\\b\\s?' + VIEWING_PREFIX + '-[^\\s]+\\b', "g"); + $body[0].className = $body[0].className.replace(classRe, ''); + + //adding the current anchor + $body.addClass(VIEWING_PREFIX + '-' + text); + } + + /** + * Checks for translate3d support + * @return boolean + * http://stackoverflow.com/questions/5661671/detecting-transform-translate3d-support + */ + function support3d() { + var el = document.createElement('p'), + has3d, + transforms = { + 'webkitTransform':'-webkit-transform', + 'OTransform':'-o-transform', + 'msTransform':'-ms-transform', + 'MozTransform':'-moz-transform', + 'transform':'transform' + }; + + // Add it to the body to get the computed style. + document.body.insertBefore(el, null); + + for (var t in transforms) { + if (el.style[t] !== undefined) { + el.style[t] = 'translate3d(1px,1px,1px)'; + has3d = window.getComputedStyle(el).getPropertyValue(transforms[t]); + } + } + + document.body.removeChild(el); + + return (has3d !== undefined && has3d.length > 0 && has3d !== 'none'); + } + + /** + * Removes the auto scrolling action fired by the mouse wheel and trackpad. + * After this function is called, the mousewheel and trackpad movements won't scroll through sections. + */ + function removeMouseWheelHandler(){ + if (document.addEventListener) { + document.removeEventListener('mousewheel', MouseWheelHandler, false); //IE9, Chrome, Safari, Oper + document.removeEventListener('wheel', MouseWheelHandler, false); //Firefox + document.removeEventListener('MozMousePixelScroll', MouseWheelHandler, false); //old Firefox + } else { + document.detachEvent('onmousewheel', MouseWheelHandler); //IE 6/7/8 + } + } + + /** + * Adds the auto scrolling action for the mouse wheel and trackpad. + * After this function is called, the mousewheel and trackpad movements will scroll through sections + * https://developer.mozilla.org/en-US/docs/Web/Events/wheel + */ + function addMouseWheelHandler(){ + var prefix = ''; + var _addEventListener; + + if (window.addEventListener){ + _addEventListener = "addEventListener"; + }else{ + _addEventListener = "attachEvent"; + prefix = 'on'; + } + + // detect available wheel event + var support = 'onwheel' in document.createElement('div') ? 'wheel' : // Modern browsers support "wheel" + document.onmousewheel !== undefined ? 'mousewheel' : // Webkit and IE support at least "mousewheel" + 'DOMMouseScroll'; // let's assume that remaining browsers are older Firefox + + + if(support == 'DOMMouseScroll'){ + document[ _addEventListener ](prefix + 'MozMousePixelScroll', MouseWheelHandler, false); + } + + //handle MozMousePixelScroll in older Firefox + else{ + document[ _addEventListener ](prefix + support, MouseWheelHandler, false); + } + } + + /** + * Binding the mousemove when the mouse's middle button is pressed + */ + function addMiddleWheelHandler(){ + container + .on('mousedown', mouseDownHandler) + .on('mouseup', mouseUpHandler); + } + + /** + * Unbinding the mousemove when the mouse's middle button is released + */ + function removeMiddleWheelHandler(){ + container + .off('mousedown', mouseDownHandler) + .off('mouseup', mouseUpHandler); + } + + /** + * Adds the possibility to auto scroll through sections on touch devices. + */ + function addTouchHandler(){ + if(isTouchDevice || isTouch){ + if(options.autoScrolling){ + $body.off(events.touchmove).on(events.touchmove, preventBouncing); + } + + $(WRAPPER_SEL) + .off(events.touchstart).on(events.touchstart, touchStartHandler) + .off(events.touchmove).on(events.touchmove, touchMoveHandler); + } + } + + /** + * Removes the auto scrolling for touch devices. + */ + function removeTouchHandler(){ + if(isTouchDevice || isTouch){ + if(options.autoScrolling){ + $body.off(events.touchmove); + } + + $(WRAPPER_SEL) + .off(events.touchstart) + .off(events.touchmove); + } + } + + /* + * Returns and object with Microsoft pointers (for IE<11 and for IE >= 11) + * http://msdn.microsoft.com/en-us/library/ie/dn304886(v=vs.85).aspx + */ + function getMSPointer(){ + var pointer; + + //IE >= 11 & rest of browsers + if(window.PointerEvent){ + pointer = { down: 'pointerdown', move: 'pointermove'}; + } + + //IE < 11 + else{ + pointer = { down: 'MSPointerDown', move: 'MSPointerMove'}; + } + + return pointer; + } + + /** + * Gets the pageX and pageY properties depending on the browser. + * https://github.com/alvarotrigo/fullPage.js/issues/194#issuecomment-34069854 + */ + function getEventsPage(e){ + var events = []; + + events.y = (typeof e.pageY !== 'undefined' && (e.pageY || e.pageX) ? e.pageY : e.touches[0].pageY); + events.x = (typeof e.pageX !== 'undefined' && (e.pageY || e.pageX) ? e.pageX : e.touches[0].pageX); + + //in touch devices with scroll bar, e.pageY is detected, but we have to deal with touch events. #1008 + if(isTouch && isReallyTouch(e) && (options.scrollBar || !options.autoScrolling)){ + events.y = e.touches[0].pageY; + events.x = e.touches[0].pageX; + } + + return events; + } + + /** + * Slides silently (with no animation) the active slider to the given slide. + * @param noCallback {bool} true or defined -> no callbacks + */ + function silentLandscapeScroll(activeSlide, noCallbacks){ + setScrollingSpeed (0, 'internal'); + + if(typeof noCallbacks !== 'undefined'){ + //preventing firing callbacks afterSlideLoad etc. + isResizing = true; + } + + landscapeScroll(activeSlide.closest(SLIDES_WRAPPER_SEL), activeSlide); + + if(typeof noCallbacks !== 'undefined'){ + isResizing = false; + } + + setScrollingSpeed(originals.scrollingSpeed, 'internal'); + } + + /** + * Scrolls silently (with no animation) the page to the given Y position. + */ + function silentScroll(top){ + // The first section can have a negative value in iOS 10. Not quite sure why: -0.0142822265625 + // that's why we round it to 0. + var roundedTop = Math.round(top); + + if (options.css3 && options.autoScrolling && !options.scrollBar){ + var translate3d = 'translate3d(0px, -' + roundedTop + 'px, 0px)'; + transformContainer(translate3d, false); + } + else if(options.autoScrolling && !options.scrollBar){ + container.css('top', -roundedTop); + } + else{ + $htmlBody.scrollTop(roundedTop); + } + } + + /** + * Returns the cross-browser transform string. + */ + function getTransforms(translate3d){ + return { + '-webkit-transform': translate3d, + '-moz-transform': translate3d, + '-ms-transform':translate3d, + 'transform': translate3d + }; + } + + /** + * Allowing or disallowing the mouse/swipe scroll in a given direction. (not for keyboard) + * @type m (mouse) or k (keyboard) + */ + function setIsScrollAllowed(value, direction, type){ + //up, down, left, right + if(direction !== 'all'){ + isScrollAllowed[type][direction] = value; + } + + //all directions? + else{ + $.each(Object.keys(isScrollAllowed[type]), function(index, key){ + isScrollAllowed[type][key] = value; + }); + } + } + + /* + * Destroys fullpage.js plugin events and optinally its html markup and styles + */ + function destroy(all){ + setAutoScrolling(false, 'internal'); + setAllowScrolling(false); + setKeyboardScrolling(false); + container.addClass(DESTROYED); + + clearTimeout(afterSlideLoadsId); + clearTimeout(afterSectionLoadsId); + clearTimeout(resizeId); + clearTimeout(scrollId); + clearTimeout(scrollId2); + + $window + .off('scroll', scrollHandler) + .off('hashchange', hashChangeHandler) + .off('resize', resizeHandler); + + $document + .off('keydown', keydownHandler) + .off('keyup', keyUpHandler) + .off('click touchstart', SECTION_NAV_SEL + ' a') + .off('mouseenter', SECTION_NAV_SEL + ' li') + .off('mouseleave', SECTION_NAV_SEL + ' li') + .off('click touchstart', SLIDES_NAV_LINK_SEL) + .off('mouseover', options.normalScrollElements) + .off('mouseout', options.normalScrollElements); + + $(SECTION_SEL) + .off('click touchstart', SLIDES_ARROW_SEL); + + clearTimeout(afterSlideLoadsId); + clearTimeout(afterSectionLoadsId); + + //lets make a mess! + if(all){ + destroyStructure(); + } + } + + /* + * Removes inline styles added by fullpage.js + */ + function destroyStructure(){ + //reseting the `top` or `translate` properties to 0 + silentScroll(0); + + //loading all the lazy load content + container.find('img[data-src], source[data-src], audio[data-src], iframe[data-src]').each(function(){ + setSrc($(this), 'src'); + }); + + container.find('img[data-srcset]').each(function(){ + setSrc($(this), 'srcset'); + }); + + $(SECTION_NAV_SEL + ', ' + SLIDES_NAV_SEL + ', ' + SLIDES_ARROW_SEL).remove(); + + //removing inline styles + $(SECTION_SEL).css( { + 'height': '', + 'background-color' : '', + 'padding': '' + }); + + $(SLIDE_SEL).css( { + 'width': '' + }); + + container.css({ + 'height': '', + 'position': '', + '-ms-touch-action': '', + 'touch-action': '' + }); + + $htmlBody.css({ + 'overflow': '', + 'height': '' + }); + + // remove .fp-enabled class + $('html').removeClass(ENABLED); + + // remove .fp-responsive class + $body.removeClass(RESPONSIVE); + + // remove all of the .fp-viewing- classes + $.each($body.get(0).className.split(/\s+/), function (index, className) { + if (className.indexOf(VIEWING_PREFIX) === 0) { + $body.removeClass(className); + } + }); + + //removing added classes + $(SECTION_SEL + ', ' + SLIDE_SEL).each(function(){ + if(options.scrollOverflowHandler){ + options.scrollOverflowHandler.remove($(this)); + } + $(this).removeClass(TABLE + ' ' + ACTIVE); + $(this).attr('style', $(this).data('fp-styles')); + }); + + removeAnimation(container); + + //Unwrapping content + container.find(TABLE_CELL_SEL + ', ' + SLIDES_CONTAINER_SEL + ', ' + SLIDES_WRAPPER_SEL).each(function(){ + //unwrap not being use in case there's no child element inside and its just text + $(this).replaceWith(this.childNodes); + }); + + //removing the applied transition from the fullpage wrapper + container.css({ + '-webkit-transition': 'none', + 'transition': 'none' + }); + + //scrolling the page to the top with no animation + $htmlBody.scrollTop(0); + + //removing selectors + var usedSelectors = [SECTION, SLIDE, SLIDES_CONTAINER]; + $.each(usedSelectors, function(index, value){ + $('.' + value).removeClass(value); + }); + } + + /* + * Sets the state for a variable with multiple states (original, and temporal) + * Some variables such as `autoScrolling` or `recordHistory` might change automatically its state when using `responsive` or `autoScrolling:false`. + * This function is used to keep track of both states, the original and the temporal one. + * If type is not 'internal', then we assume the user is globally changing the variable. + */ + function setVariableState(variable, value, type){ + options[variable] = value; + if(type !== 'internal'){ + originals[variable] = value; + } + } + + /** + * Displays warnings + */ + function displayWarnings(){ + var extensions = ['fadingEffect', 'continuousHorizontal', 'scrollHorizontally', 'interlockedSlides', 'resetSliders', 'responsiveSlides', 'offsetSections', 'dragAndMove', 'scrollOverflowReset', 'parallax']; + if($('html').hasClass(ENABLED)){ + showError('error', 'Fullpage.js can only be initialized once and you are doing it multiple times!'); + return; + } + + // Disable mutually exclusive settings + if (options.continuousVertical && + (options.loopTop || options.loopBottom)) { + options.continuousVertical = false; + showError('warn', 'Option `loopTop/loopBottom` is mutually exclusive with `continuousVertical`; `continuousVertical` disabled'); + } + + if(options.scrollBar && options.scrollOverflow){ + showError('warn', 'Option `scrollBar` is mutually exclusive with `scrollOverflow`. Sections with scrollOverflow might not work well in Firefox'); + } + + if(options.continuousVertical && (options.scrollBar || !options.autoScrolling)){ + options.continuousVertical = false; + showError('warn', 'Scroll bars (`scrollBar:true` or `autoScrolling:false`) are mutually exclusive with `continuousVertical`; `continuousVertical` disabled'); + } + + if(options.scrollOverflow && !options.scrollOverflowHandler){ + options.scrollOverflow = false; + showError('error', 'The option `scrollOverflow:true` requires the file `scrolloverflow.min.js`. Please include it before fullPage.js.'); + } + + //using extensions? Wrong file! + $.each(extensions, function(index, extension){ + //is the option set to true? + if(options[extension]){ + showError('warn', 'fullpage.js extensions require jquery.fullpage.extensions.min.js file instead of the usual jquery.fullpage.js. Requested: '+ extension); + } + }); + + //anchors can not have the same value as any element ID or NAME + $.each(options.anchors, function(index, name){ + + //case insensitive selectors (http://stackoverflow.com/a/19465187/1081396) + var nameAttr = $document.find('[name]').filter(function() { + return $(this).attr('name') && $(this).attr('name').toLowerCase() == name.toLowerCase(); + }); + + var idAttr = $document.find('[id]').filter(function() { + return $(this).attr('id') && $(this).attr('id').toLowerCase() == name.toLowerCase(); + }); + + if(idAttr.length || nameAttr.length ){ + showError('error', 'data-anchor tags can not have the same value as any `id` element on the site (or `name` element for IE).'); + idAttr.length && showError('error', '"' + name + '" is is being used by another element `id` property'); + nameAttr.length && showError('error', '"' + name + '" is is being used by another element `name` property'); + } + }); + } + + /** + * Shows a message in the console of the given type. + */ + function showError(type, text){ + console && console[type] && console[type]('fullPage: ' + text); + } + + }; //end of $.fn.fullpage +}); diff --git a/user/themes/anissabensalah/js/script.js b/user/themes/anissabensalah/js/script.js index 6d6b918..c0f7a68 100644 --- a/user/themes/anissabensalah/js/script.js +++ b/user/themes/anissabensalah/js/script.js @@ -1,8 +1,44 @@ -function left() { - $('#start > div:nth-of-type(4) .red').prependTo( ".content" ); +function activenav() { + // Cache selectors + var lastId, + topMenu = $(".navigation"), + topMenuHeight = topMenu.outerHeight()+500, + // All list items + menuItems = topMenu.find("a"), + // Anchors corresponding to menu items + scrollItems = menuItems.map(function(){ + var item = $($(this).attr("href")); + if (item.length) { return item; } + }); + + // Bind click handler to menu items + // so we can get a fancy scroll animation + + + // Bind to scroll + $(window).scroll(function(){ + // Get container scroll position + var fromTop = $(this).scrollTop()+topMenuHeight; + + // Get id of current scroll item + var cur = scrollItems.map(function(){ + if ($(this).offset().top < fromTop) + return this; + }); + // Get the id of the current element + cur = cur[cur.length-1]; + var id = cur && cur.length ? cur[0].id : ""; + + if (lastId !== id) { + lastId = id; + // Set/remove active class + menuItems + .parent().removeClass("active") + .end().filter("[href='#"+id+"']").parent().addClass("active"); + } + }); } - jQuery(document).ready(function($) { - // left(); + activenav(); }); diff --git a/user/themes/anissabensalah/scss/theme/fonts.scss b/user/themes/anissabensalah/scss/theme/fonts.scss index 844effb..13c5707 100644 --- a/user/themes/anissabensalah/scss/theme/fonts.scss +++ b/user/themes/anissabensalah/scss/theme/fonts.scss @@ -31,6 +31,15 @@ body{ line-height: 2rem; } } + .citation{ + p{ + font-size: $font16; + font-family: $Regular; + font-weight: normal; + line-height: 2rem; + color: white; + } + } #home, #contact{ h1{ font-family: $Thin; diff --git a/user/themes/anissabensalah/scss/theme/section.scss b/user/themes/anissabensalah/scss/theme/section.scss index c78d2a9..9e306ff 100644 --- a/user/themes/anissabensalah/scss/theme/section.scss +++ b/user/themes/anissabensalah/scss/theme/section.scss @@ -1,4 +1,7 @@ #start{ + & > div{ + height: 100vh; + } div:nth-child(n+3){ display: flex; &:nth-child(even){ @@ -6,11 +9,21 @@ } & > div{ width: 50%; - height: 100vh; overflow: auto; &:first-child{ + position: relative; display: flex; + flex-direction: column; + justify-content: center; background-image: linear-gradient(#98272D, #4f100B); + .citation{ + text-align: center; + position: absolute; + top: 20%; + width: 450px; + left: 50%; + margin-left: -225px; + } .chap{ margin: auto; text-align: center; @@ -39,9 +52,9 @@ .grav-youtube{ margin: 0; } + #home{ display: flex; - height: 100vh; .visu-album{ position: absolute; } @@ -105,12 +118,12 @@ } } #presse{ + #sovaj, #matriz{ display: flex; flex-flow: wrap; justify-content: center; margin-bottom: 100px; - } p{ font-size: $font14!important; line-height: 1.2rem; @@ -130,6 +143,7 @@ } } } + } } #contact{ diff --git a/user/themes/anissabensalah/templates/modular.html.twig b/user/themes/anissabensalah/templates/modular.html.twig index 0f79f04..b410ff5 100644 --- a/user/themes/anissabensalah/templates/modular.html.twig +++ b/user/themes/anissabensalah/templates/modular.html.twig @@ -6,6 +6,7 @@ {% block javascripts %} {% if show_onpage_menu %} {% do assets.add('theme://js/singlepagenav.min.js') %} + {% endif %} {{ parent() }} {% endblock %} @@ -49,7 +50,7 @@ {% block body %} -
      +
      {% set header_image_media = page.media.images|first %} {{header_image_media}} @@ -68,7 +69,7 @@
      {% for module in page.collection() %} -
      +
      {{ module.content }}
      {% endfor %} diff --git a/user/themes/anissabensalah/templates/modular/submodular.html.twig b/user/themes/anissabensalah/templates/modular/submodular.html.twig index 31e031f..99eec8d 100644 --- a/user/themes/anissabensalah/templates/modular/submodular.html.twig +++ b/user/themes/anissabensalah/templates/modular/submodular.html.twig @@ -3,10 +3,12 @@ {% block body %}
      -
      - -

      {{page.title|upper}}

      +
      {{page.content}} +
      + +
      +

      {{page.title|upper}}

      {% for module in page.collection() %} {{module.title|upper}} diff --git a/user/themes/anissabensalah/templates/partials/base.html.twig b/user/themes/anissabensalah/templates/partials/base.html.twig index 00a2300..a217b99 100644 --- a/user/themes/anissabensalah/templates/partials/base.html.twig +++ b/user/themes/anissabensalah/templates/partials/base.html.twig @@ -24,6 +24,7 @@ {% do assets.addJs('jquery', 101) %} {% do assets.addJs('theme://js/jquery.treemenu.js', {group:'bottom'}) %} {% do assets.addJs('theme://js/site.js', {group:'bottom'}) %} + {% do assets.add('theme://js/fullPage.js') %} {% do assets.add('theme://js/script.js') %} {% endblock %}