Bladeren bron

added publications and some skrollr animations to home v2

Bachir Soussi Chiadmi 10 jaren geleden
bovenliggende
commit
e12a664fa5
54 gewijzigde bestanden met toevoegingen van 3756 en 78 verwijderingen
  1. 24 0
      sites/all/modules/features/materio_home_v2/materio_home_v2.features.inc
  2. 2 0
      sites/all/modules/features/materio_home_v2/materio_home_v2.info
  3. 2 1
      sites/all/modules/features/materio_home_v2/materio_home_v2.views_default.inc
  4. 2 1
      sites/all/themes/gui/materiobasetheme/bower.json
  5. 39 0
      sites/all/themes/gui/materiobasetheme/bower_components/skrollr/.bower.json
  6. 15 0
      sites/all/themes/gui/materiobasetheme/bower_components/skrollr/CONTRIBUTING.md
  7. 51 0
      sites/all/themes/gui/materiobasetheme/bower_components/skrollr/Gruntfile.js
  8. 168 0
      sites/all/themes/gui/materiobasetheme/bower_components/skrollr/HISTORY.md
  9. 21 0
      sites/all/themes/gui/materiobasetheme/bower_components/skrollr/LICENSE.txt
  10. 142 0
      sites/all/themes/gui/materiobasetheme/bower_components/skrollr/README.md
  11. 28 0
      sites/all/themes/gui/materiobasetheme/bower_components/skrollr/bower.json
  12. 1 0
      sites/all/themes/gui/materiobasetheme/bower_components/skrollr/dist/skrollr.min.js
  13. 14 0
      sites/all/themes/gui/materiobasetheme/bower_components/skrollr/examples/README.md
  14. 74 0
      sites/all/themes/gui/materiobasetheme/bower_components/skrollr/examples/amd.html
  15. 48 0
      sites/all/themes/gui/materiobasetheme/bower_components/skrollr/examples/anchor_target.html
  16. 50 0
      sites/all/themes/gui/materiobasetheme/bower_components/skrollr/examples/anchors.html
  17. 33 0
      sites/all/themes/gui/materiobasetheme/bower_components/skrollr/examples/bg_constant_speed_less.html
  18. 33 0
      sites/all/themes/gui/materiobasetheme/bower_components/skrollr/examples/bg_constant_speed_more.html
  19. 44 0
      sites/all/themes/gui/materiobasetheme/bower_components/skrollr/examples/circular_motion.html
  20. 177 0
      sites/all/themes/gui/materiobasetheme/bower_components/skrollr/examples/classic.html
  21. 23 0
      sites/all/themes/gui/materiobasetheme/bower_components/skrollr/examples/docu/1.html
  22. 23 0
      sites/all/themes/gui/materiobasetheme/bower_components/skrollr/examples/docu/2.html
  23. 23 0
      sites/all/themes/gui/materiobasetheme/bower_components/skrollr/examples/docu/3.html
  24. 23 0
      sites/all/themes/gui/materiobasetheme/bower_components/skrollr/examples/docu/4.html
  25. 46 0
      sites/all/themes/gui/materiobasetheme/bower_components/skrollr/examples/fixed-positioning.css
  26. 61 0
      sites/all/themes/gui/materiobasetheme/bower_components/skrollr/examples/fixed_nav.html
  27. 65 0
      sites/all/themes/gui/materiobasetheme/bower_components/skrollr/examples/gradientsmotherfucker.html
  28. BIN
      sites/all/themes/gui/materiobasetheme/bower_components/skrollr/examples/images/bubbles.png
  29. BIN
      sites/all/themes/gui/materiobasetheme/bower_components/skrollr/examples/images/bubbles2.png
  30. BIN
      sites/all/themes/gui/materiobasetheme/bower_components/skrollr/examples/images/bubbles3.png
  31. BIN
      sites/all/themes/gui/materiobasetheme/bower_components/skrollr/examples/images/bubbles_small.png
  32. BIN
      sites/all/themes/gui/materiobasetheme/bower_components/skrollr/examples/images/face.png
  33. BIN
      sites/all/themes/gui/materiobasetheme/bower_components/skrollr/examples/images/kitteh1.jpg
  34. BIN
      sites/all/themes/gui/materiobasetheme/bower_components/skrollr/examples/images/kitteh2.jpg
  35. BIN
      sites/all/themes/gui/materiobasetheme/bower_components/skrollr/examples/images/kitteh3.jpg
  36. 57 0
      sites/all/themes/gui/materiobasetheme/bower_components/skrollr/examples/images/path.svg
  37. BIN
      sites/all/themes/gui/materiobasetheme/bower_components/skrollr/examples/images/slj.png
  38. 197 0
      sites/all/themes/gui/materiobasetheme/bower_components/skrollr/examples/main.css
  39. 17 0
      sites/all/themes/gui/materiobasetheme/bower_components/skrollr/examples/path.html
  40. 79 0
      sites/all/themes/gui/materiobasetheme/bower_components/skrollr/examples/pausing.html
  41. 19 0
      sites/all/themes/gui/materiobasetheme/bower_components/skrollr/examples/scripts/main.js
  42. 6 0
      sites/all/themes/gui/materiobasetheme/bower_components/skrollr/examples/scripts/require.js
  43. 21 0
      sites/all/themes/gui/materiobasetheme/bower_components/skrollr/examples/svg.html
  44. BIN
      sites/all/themes/gui/materiobasetheme/bower_components/skrollr/guide/anchor-position-guide.pdf
  45. BIN
      sites/all/themes/gui/materiobasetheme/bower_components/skrollr/guide/anchor-position-guide.png
  46. 86 0
      sites/all/themes/gui/materiobasetheme/bower_components/skrollr/index.html
  47. 40 0
      sites/all/themes/gui/materiobasetheme/bower_components/skrollr/package.json
  48. 37 0
      sites/all/themes/gui/materiobasetheme/bower_components/skrollr/shim.html
  49. 1779 0
      sites/all/themes/gui/materiobasetheme/bower_components/skrollr/src/skrollr.js
  50. 130 69
      sites/all/themes/gui/materiobasetheme/css/styles.css
  51. 1 1
      sites/all/themes/gui/materiobasetheme/inc/template.theme-overrides.inc
  52. 22 0
      sites/all/themes/gui/materiobasetheme/js/script.js
  53. 1 0
      sites/all/themes/gui/materiobasetheme/materiobasetheme.info
  54. 32 6
      sites/all/themes/gui/materiobasetheme/scss/styles.scss

+ 24 - 0
sites/all/modules/features/materio_home_v2/materio_home_v2.features.inc

@@ -22,3 +22,27 @@ function materio_home_v2_ctools_plugin_api($module = NULL, $api = NULL) {
 function materio_home_v2_views_api($module = NULL, $api = NULL) {
   return array("api" => "3.0");
 }
+
+/**
+ * Implements hook_image_default_styles().
+ */
+function materio_home_v2_image_default_styles() {
+  $styles = array();
+
+  // Exported image style: publications-home.
+  $styles['publications-home'] = array(
+    'label' => 'publications-home',
+    'effects' => array(
+      15 => array(
+        'name' => 'image_scale_and_crop',
+        'data' => array(
+          'width' => 210,
+          'height' => 295,
+        ),
+        'weight' => 1,
+      ),
+    ),
+  );
+
+  return $styles;
+}

+ 2 - 0
sites/all/modules/features/materio_home_v2/materio_home_v2.info

@@ -4,6 +4,7 @@ package = Materio
 dependencies[] = ctools
 dependencies[] = entity
 dependencies[] = features
+dependencies[] = image
 dependencies[] = materio_publications
 dependencies[] = menu
 dependencies[] = page_manager
@@ -16,6 +17,7 @@ features[ctools][] = page_manager:pages_default:1
 features[ctools][] = panels_mini:panels_default:1
 features[ctools][] = views:views_default:3.0
 features[features_api][] = api:2
+features[image][] = publications-home
 features[menu_custom][] = menu-home-v2
 features[page_manager_pages][] = home_v2
 features[panels_mini][] = news_home_v2

+ 2 - 1
sites/all/modules/features/materio_home_v2/materio_home_v2.views_default.inc

@@ -184,7 +184,7 @@ function materio_home_v2_views_default_views() {
   $handler->display->display_options['pager']['options']['offset'] = '0';
   $handler->display->display_options['style_plugin'] = 'default';
   $handler->display->display_options['row_plugin'] = 'entity';
-  $handler->display->display_options['row_options']['view_mode'] = 'teaser';
+  $handler->display->display_options['row_options']['view_mode'] = 'homeblock';
   /* Champ: Contenu : Titre */
   $handler->display->display_options['fields']['title']['id'] = 'title';
   $handler->display->display_options['fields']['title']['table'] = 'node';
@@ -216,6 +216,7 @@ function materio_home_v2_views_default_views() {
   $handler->display->display_options['filters']['sid']['table'] = 'workflow_node';
   $handler->display->display_options['filters']['sid']['field'] = 'sid';
   $handler->display->display_options['filters']['sid']['value'] = array(
+    2 => '2',
     3 => '3',
   );
 

+ 2 - 1
sites/all/themes/gui/materiobasetheme/bower.json

@@ -18,6 +18,7 @@
     "history.js": "~1.8.0",
     "jquery.columnizer": "~1.6.2",
     "jquery.hotkeys": "jeresig/jquery.hotkeys#~0.2.0",
-    "jquery.lazyload": "~1.9.5"
+    "jquery.lazyload": "~1.9.5",
+    "skrollr": "~0.6.29"
   }
 }

+ 39 - 0
sites/all/themes/gui/materiobasetheme/bower_components/skrollr/.bower.json

@@ -0,0 +1,39 @@
+{
+  "name": "skrollr",
+  "homepage": "http://prinzhorn.github.io/skrollr/",
+  "authors": [
+    "Alexander Prinzhorn"
+  ],
+  "description": "Stand-alone parallax scrolling library for mobile (Android + iOS) and desktop",
+  "main": "src/skrollr.js",
+  "moduleType": [
+    "globals"
+  ],
+  "keywords": [
+    "parallax",
+    "scroll",
+    "animation",
+    "html5",
+    "css3",
+    "transition"
+  ],
+  "license": "MIT",
+  "ignore": [
+    "**/.*",
+    "node_modules",
+    "bower_components",
+    "test",
+    "tests"
+  ],
+  "version": "0.6.29",
+  "_release": "0.6.29",
+  "_resolution": {
+    "type": "version",
+    "tag": "0.6.29",
+    "commit": "1da1627e80ffb5c569880e4c77845e116905cf9f"
+  },
+  "_source": "git://github.com/Prinzhorn/skrollr.git",
+  "_target": "~0.6.29",
+  "_originalSource": "skrollr",
+  "_direct": true
+}

+ 15 - 0
sites/all/themes/gui/materiobasetheme/bower_components/skrollr/CONTRIBUTING.md

@@ -0,0 +1,15 @@
+Questions belong to StackOverflow
+=====
+
+GitHub is for issues and feature requests. Anything else belongs to [StackOverflow](http://stackoverflow.com/questions/ask?tags=skrollr).
+
+Pull requests
+=====
+
+Will be ignored if the Travis build fails. Install grunt and run `grunt jshint qunit` locally before submitting pull requests.
+
+Do not include build files in your pull request (e.g. `skrollr.min.js`).
+
+Do not change the version number in your pull request.
+
+Do not try to fix multiple issues or add multiple features with a single pull request. A pull request should only do one thing.

+ 51 - 0
sites/all/themes/gui/materiobasetheme/bower_components/skrollr/Gruntfile.js

@@ -0,0 +1,51 @@
+module.exports = function(grunt) {
+	//Configuration.
+	grunt.initConfig({
+		pkg: grunt.file.readJSON('package.json') ,
+		jshint: {
+			options: {
+				smarttabs: false,
+				curly: true,
+				immed: true,
+				latedef: true,
+				noarg: true,
+				quotmark: 'single',
+				undef: true,
+				unused: true,
+				strict: true,
+				trailing: true,
+				globals: {
+					window: true,
+					document: true,
+					navigator: true,
+					define: true,
+					module: true
+				}
+			},
+			all: ['src/**/*.js']
+		},
+		qunit: {
+			all: ['test/index.html', 'test/loading.html']
+		},
+		uglify: {
+			options: {
+				banner: '/*! skrollr <%= pkg.version %> (<%= grunt.template.today("yyyy-mm-dd") %>) | Alexander Prinzhorn - https://github.com/Prinzhorn/skrollr | Free to use under terms of MIT license */\n'
+			},
+
+			all: {
+				files: {
+					'dist/skrollr.min.js': 'src/skrollr.js'
+				}
+			}
+		}
+	});
+
+	//Dependencies.
+	grunt.loadNpmTasks('grunt-contrib-jshint');
+	grunt.loadNpmTasks('grunt-contrib-qunit');
+	grunt.loadNpmTasks('grunt-contrib-uglify');
+
+	//Tasks.
+	grunt.registerTask('default', ['jshint', 'qunit', 'uglify']);
+	grunt.registerTask('travis', ['jshint', 'qunit']);
+};

File diff suppressed because it is too large
+ 168 - 0
sites/all/themes/gui/materiobasetheme/bower_components/skrollr/HISTORY.md


+ 21 - 0
sites/all/themes/gui/materiobasetheme/bower_components/skrollr/LICENSE.txt

@@ -0,0 +1,21 @@
+The MIT License
+
+Copyright (c) 2012-2014 Alexander Prinzhorn (@Prinzhorn)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.

File diff suppressed because it is too large
+ 142 - 0
sites/all/themes/gui/materiobasetheme/bower_components/skrollr/README.md


+ 28 - 0
sites/all/themes/gui/materiobasetheme/bower_components/skrollr/bower.json

@@ -0,0 +1,28 @@
+{
+  "name": "skrollr",
+  "homepage": "http://prinzhorn.github.io/skrollr/",
+  "authors": [
+    "Alexander Prinzhorn"
+  ],
+  "description": "Stand-alone parallax scrolling library for mobile (Android + iOS) and desktop",
+  "main": "src/skrollr.js",
+  "moduleType": [
+    "globals"
+  ],
+  "keywords": [
+    "parallax",
+    "scroll",
+    "animation",
+    "html5",
+    "css3",
+    "transition"
+  ],
+  "license": "MIT",
+  "ignore": [
+    "**/.*",
+    "node_modules",
+    "bower_components",
+    "test",
+    "tests"
+  ]
+}

File diff suppressed because it is too large
+ 1 - 0
sites/all/themes/gui/materiobasetheme/bower_components/skrollr/dist/skrollr.min.js


+ 14 - 0
sites/all/themes/gui/materiobasetheme/bower_components/skrollr/examples/README.md

@@ -0,0 +1,14 @@
+Examples
+------
+
+Showcasing the awesomeness of skrollr.
+
+* [The "main" example](http://prinzhorn.github.io/skrollr/)
+* ["Classic" parallax with different sections and parallax images between the gaps](http://prinzhorn.github.io/skrollr/examples/classic.html)
+* [Demonstrating different anchors](http://prinzhorn.github.io/skrollr/examples/anchors.html)
+* [Demonstrating data-anchor-target](http://prinzhorn.github.io/skrollr/examples/anchor_target.html)
+* [Pausing the scrolling for a moment to do other animations](http://prinzhorn.github.io/skrollr/examples/pausing.html)
+* [Drawing a SVG path](http://prinzhorn.github.io/skrollr/examples/path.html)
+* [Using two custom easing functions to create a circular motion](http://prinzhorn.github.io/skrollr/examples/circular_motion.html)
+* [Parallax background with constant speed](http://prinzhorn.github.io/skrollr/examples/bg_constant_speed_less.html)
+* [gradientsmotherfucker](http://prinzhorn.github.io/skrollr/examples/gradientsmotherfucker.html)

+ 74 - 0
sites/all/themes/gui/materiobasetheme/bower_components/skrollr/examples/amd.html

@@ -0,0 +1,74 @@
+<!DOCTYPE html>
+<html>
+<head>
+	<meta charset="utf-8">
+
+	<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+
+	<title>skrollr - parallax scrolling for the masses</title>
+
+	<link href="fixed-positioning.css" rel="stylesheet" type="text/css" />
+	<link href="main.css" rel="stylesheet" type="text/css" />
+</head>
+
+<body>
+	<div id="bg1" data-0="background-position:0px 0px;" data-end="background-position:-500px -10000px;"></div>
+	<div id="bg2" data-0="background-position:0px 0px;" data-end="background-position:-500px -8000px;"></div>
+	<div id="bg3" data-0="background-position:0px 0px;" data-end="background-position:-500px -6000px;"></div>
+
+	<div id="progress" data-0="width:0%;background:hsl(200, 100%, 50%);" data-end="width:100%;background:hsl(920, 100%, 50%);"></div>
+
+	<div id="intro" data-0="opacity:1;top:3%;transform:rotate(0deg);transform-origin:0 0;" data-500="opacity:0;top:-10%;transform:rotate(-90deg);">
+		<h1><a href="https://github.com/Prinzhorn/skrollr">skrollr</a></h1>
+		<h2>parallax scrolling for the masses</h2>
+		<p>let's get scrollin' ;-)</p>
+		<p class="arrows">▼&nbsp;▼&nbsp;▼</p>
+	</div>
+
+	<div id="transform" data-500="transform:scale(0) rotate(0deg);" data-1000="transform:scale(1) rotate(1440deg);opacity:1;" data-1600="" data-1700="transform:scale(5) rotate(3240deg);opacity:0;">
+		<h2>transform</h2>
+		<p>scale, skew and rotate the sh** out of any element</p>
+	</div>
+
+	<div id="properties" data-1700="top:100%;" data-2200="top:0%;" data-3000="display:block;" data-3700="top:-100%;display:none;">
+		<h2>all numeric properties</h2>
+		<p>width, height, padding, font-size, z-index, blah blah blah</p>
+	</div>
+
+	<div id="easing_wrapper" data-0="display:none;" data-3900="display:block;" data-4900="background:rgba(0, 0, 0, 0);color[swing]:rgb(0,0,0);" data-5900="background:rgba(0,0,0,1);color:rgb(255,255,255);" data-10000="top:0%;" data-12000="top:-100%;">
+		<div id="easing" data-3900="left:100%" data-4600="left:25%;">
+			<h2>easing?</h2>
+			<p>sure.</p>
+			<p>let me dim the <span data-3900="" data-4900="color[swing]:rgb(0,0,0);" data-5900="color:rgb(255,255,0);">lights</span> for this one...</p>
+			<p data-5900="opacity:0;font-size:100%;" data-6500="opacity:1;font-size:150%;">you can set easings for each property and define own easing functions</p>
+		</div>
+
+		<div class="drop" data-6500="left:15%;bottom:100%;" data-9500="bottom:0%;">linear</div>
+		<div class="drop" data-6500="left:25%;bottom[quadratic]:100%;" data-9500="bottom:0%;">quadratic</div>
+		<div class="drop" data-6500="left:35%;bottom[cubic]:100%;" data-9500="bottom:0%;">cubic</div>
+		<div class="drop" data-6500="left:45%;bottom[swing]:100%;" data-9500="bottom:0%;">swing</div>
+		<div class="drop" data-6500="left:55%;bottom[WTF]:100%;" data-9500="bottom:0%;">WTF</div>
+		<div class="drop" data-6500="left:65%;bottom[inverted]:100%;" data-9500="bottom:0%;">inverted</div>
+		<div class="drop" data-6500="left:75%;bottom[bounce]:100%;" data-9500="bottom:0%;">bounce</div>
+	</div>
+
+	<div id="download" data-10000="top[cubic]:100%;border-radius[cubic]:0em;background:rgb(0,50,100);border-width:0px;" data-12000="top:10%;border-radius:2em;background:rgb(190,230,255);border-width:10px;">
+		<h2>the end</h2>
+		<p>by the way, you can also animate colors (you did notice this, didn't you?)</p>
+		<p><strong>Now get this thing on <a href="https://github.com/Prinzhorn/skrollr">GitHub</a> and spread the word, it's open source!</strong> <a href="https://twitter.com/share" class="twitter-share-button" data-url="http://prinzhorn.github.com/skrollr/" data-via="Prinzhorn">Tweet</a>
+		<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src="//platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");</script></p>
+		<p>Check out more <a href="https://github.com/Prinzhorn/skrollr/tree/master/examples#examples">examples</a>.</p>
+		<p>Handcrafted by <a href="https://twitter.com/Prinzhorn" class="twitter-follow-button" data-show-count="false">Follow @Prinzhorn</a>
+		<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src="//platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");</script></p>
+	</div>
+
+	<div id="scrollbar" data-0="top:0%;margin-top:2px;" data-end="top:100%;margin-top:-52px;"></div>
+
+	<script data-main="scripts/main" src="scripts/require.js"></script>
+
+	<!--[if lt IE 9]>
+	<script type="text/javascript" src="dist/skrollr.ie.min.js"></script>
+	<![endif]-->
+</body>
+
+</html>

File diff suppressed because it is too large
+ 48 - 0
sites/all/themes/gui/materiobasetheme/bower_components/skrollr/examples/anchor_target.html


File diff suppressed because it is too large
+ 50 - 0
sites/all/themes/gui/materiobasetheme/bower_components/skrollr/examples/anchors.html


File diff suppressed because it is too large
+ 33 - 0
sites/all/themes/gui/materiobasetheme/bower_components/skrollr/examples/bg_constant_speed_less.html


File diff suppressed because it is too large
+ 33 - 0
sites/all/themes/gui/materiobasetheme/bower_components/skrollr/examples/bg_constant_speed_more.html


+ 44 - 0
sites/all/themes/gui/materiobasetheme/bower_components/skrollr/examples/circular_motion.html

@@ -0,0 +1,44 @@
+<!DOCTYPE html>
+<html>
+<head>
+	<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
+
+	<title>Creating a circular motion (easing === awesome)</title>
+
+	<link href="fixed-positioning.css" rel="stylesheet" type="text/css" />
+
+	<style type="text/css">
+	#thing {
+		width:32px;
+		height:32px;
+		border-radius:16px;
+		background:#000;
+	}
+	</style>
+</head>
+
+<body>
+	<div id="thing" data-0="left[cos]:10%;top[sin]:10%;" data-10000="left:90%;top:90%;"></div>
+
+	<script type="text/javascript" src="../dist/skrollr.min.js"></script>
+	<script type="text/javascript">
+	skrollr.init({
+		easing: {
+			sin: function(p) {
+				return (Math.sin(p * Math.PI * 2 - Math.PI/2) + 1) / 2;
+			},
+			cos: function(p) {
+				return (Math.cos(p * Math.PI * 2 - Math.PI/2) + 1) / 2;
+			},
+		},
+		render: function(data) {
+			//Loop
+			if(data.curTop === data.maxTop) {
+				this.setScrollTop(0, true);
+			}
+		}
+	});
+	</script>
+</body>
+
+</html>

File diff suppressed because it is too large
+ 177 - 0
sites/all/themes/gui/materiobasetheme/bower_components/skrollr/examples/classic.html


File diff suppressed because it is too large
+ 23 - 0
sites/all/themes/gui/materiobasetheme/bower_components/skrollr/examples/docu/1.html


File diff suppressed because it is too large
+ 23 - 0
sites/all/themes/gui/materiobasetheme/bower_components/skrollr/examples/docu/2.html


File diff suppressed because it is too large
+ 23 - 0
sites/all/themes/gui/materiobasetheme/bower_components/skrollr/examples/docu/3.html


File diff suppressed because it is too large
+ 23 - 0
sites/all/themes/gui/materiobasetheme/bower_components/skrollr/examples/docu/4.html


+ 46 - 0
sites/all/themes/gui/materiobasetheme/bower_components/skrollr/examples/fixed-positioning.css

@@ -0,0 +1,46 @@
+/*
+ * This file is NOT needed in order to use skrollr.
+ * The demo uses it and it may help you as well.
+ */
+
+
+html, body {
+	width:100%;
+	height:100%;
+	padding:0;
+	margin:0;
+	overflow-x:hidden;
+}
+
+.skrollable {
+	/*
+	 * First-level skrollables are positioned relative to window
+	 */
+	position:fixed;
+
+	/*
+	 * Skrollables by default have a z-index of 100 in order to make it easy to position elements in front/back without changing each skrollable
+	 */
+	z-index:100;
+}
+
+.skrollr-mobile .skrollable {
+	/*
+		May cause issues on Android default browser (see #331 on GitHub).
+	*/
+	position:absolute;
+}
+
+.skrollable .skrollable {
+	/*
+	 * Second-level skrollables are positioned relative their parent skrollable
+	 */
+	position:absolute;
+}
+
+.skrollable .skrollable .skrollable {
+	/*
+	 * Third-level (and below) skrollables are positioned static
+	 */
+	position:static;
+}

File diff suppressed because it is too large
+ 61 - 0
sites/all/themes/gui/materiobasetheme/bower_components/skrollr/examples/fixed_nav.html


+ 65 - 0
sites/all/themes/gui/materiobasetheme/bower_components/skrollr/examples/gradientsmotherfucker.html

@@ -0,0 +1,65 @@
+<!DOCTYPE html>
+<html>
+<head>
+	<meta charset="utf-8">
+
+	<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
+
+	<title>What’s the best way to appease Samuel L. Jackson’s design-lust?</title>
+
+	<style type="text/css">
+	html, body {
+		padding:0;
+		margin:0;
+		width:100%;
+		height:100%;
+		background-attachment:fixed;
+		color:#fff;
+		font-family:sans-serif;
+		text-align:center;
+	}
+
+	a {color:#eee;}
+
+	#top {padding-top:10em;}
+
+	#bottom {
+		position:fixed;
+		right:0;
+		bottom:0;
+		left:0;
+	}
+
+	#bottom > img {
+		display:block;
+		margin:auto;
+	}
+
+	.hidden {display:none;}
+	</style>
+</head>
+
+<body data-0="background-image:linear-gradient(0deg, hsl(0, 100%, 50%), hsl(40, 50%, 50%));" data-5000="background-image:linear-gradient(3600deg, hsl(360, 100%, 50%), hsl(400, 100%, 50%));">
+	<div id="skrollr-body">
+		<div id="top">
+			<h1>What’s the best way to appease Samuel L. Jackson’s design-lust?</h1>
+			<p>Scroll to find out</p>
+			<p>↓</p>
+		</div>
+	</div>
+
+	<div id="bottom" data-500-end="opacity:0;" data-end="opacity:1;">
+		<h1>Rotating gradients, motherfucker</h1>
+		<p>Inspired by: <a href="http://gradientsmotherfucker.com/">http://gradientsmotherfucker.com/</a></p>
+		<p>Created with: <a href="https://github.com/Prinzhorn/skrollr">skrollr</a></p>
+		<img src="images/slj.png" />
+	</div>
+
+	<script type="text/javascript" src="../dist/skrollr.min.js"></script>
+
+	<script type="text/javascript">
+	skrollr.init();
+	</script>
+</body>
+
+</html>

BIN
sites/all/themes/gui/materiobasetheme/bower_components/skrollr/examples/images/bubbles.png


BIN
sites/all/themes/gui/materiobasetheme/bower_components/skrollr/examples/images/bubbles2.png


BIN
sites/all/themes/gui/materiobasetheme/bower_components/skrollr/examples/images/bubbles3.png


BIN
sites/all/themes/gui/materiobasetheme/bower_components/skrollr/examples/images/bubbles_small.png


BIN
sites/all/themes/gui/materiobasetheme/bower_components/skrollr/examples/images/face.png


BIN
sites/all/themes/gui/materiobasetheme/bower_components/skrollr/examples/images/kitteh1.jpg


BIN
sites/all/themes/gui/materiobasetheme/bower_components/skrollr/examples/images/kitteh2.jpg


BIN
sites/all/themes/gui/materiobasetheme/bower_components/skrollr/examples/images/kitteh3.jpg


File diff suppressed because it is too large
+ 57 - 0
sites/all/themes/gui/materiobasetheme/bower_components/skrollr/examples/images/path.svg


BIN
sites/all/themes/gui/materiobasetheme/bower_components/skrollr/examples/images/slj.png


+ 197 - 0
sites/all/themes/gui/materiobasetheme/bower_components/skrollr/examples/main.css

@@ -0,0 +1,197 @@
+html, body, div, span, p, a, del, em, img, ol, ul, li, fieldset, form, label {
+	margin: 0;
+	padding: 0;
+	border: 0;
+	font-size: 100%;
+	font: inherit;
+	vertical-align: baseline;
+}
+
+article, aside, details, figcaption, figure,
+footer, header, hgroup, menu, nav, section {
+	display: block;
+}
+
+html, body {
+	line-height: 1;
+	min-height:100%;
+	font-family:Artial, Verdana, sans-serif;
+}
+
+body {
+	background: #eeeeee;
+	background: -webkit-linear-gradient(top, #eeeeee, #cccccc 100%);
+	background: -moz-linear-gradient(top, #eeeeee, #cccccc 100%);
+	background: -o-linear-gradient(top, #eeeeee, #cccccc 100%);
+	background: -ms-linear-gradient(top, #eeeeee, #cccccc 100%);
+	background: linear-gradient(top, #eeeeee, #cccccc 100%);
+	background-attachment:fixed;
+}
+
+ol, ul {
+	list-style: none;
+}
+
+p {
+	margin:1em 0;
+	line-height:1.1em;
+}
+
+q {
+	font-style:italic;
+	color:#333;
+}
+
+h1 {
+	font-size:2.91em;
+	margin:0;
+}
+
+h1 > small {
+	text-align:right;
+	display:inline-block;
+	font-size:.71em;
+	text-indent:15em;
+	color:#444;
+}
+
+h2 {
+	color:inherit;
+	font-size:1.91em;
+	margin:2em 0 1em 0;
+}
+
+h2:first-child {margin-top:0;}
+
+h3 {
+	color:#333;
+	font-size:1.41em;
+	margin:1em 0;
+}
+
+h4 {
+	color:#444;
+	font-size:1.11em;
+	margin:1em 0;
+}
+
+#progress {
+	height:2%;
+	background:#444;
+	bottom:0;
+	z-index:200;
+}
+
+#scrollbar {
+	position:fixed;
+	right:2px;
+	height:50px;
+	width:6px;
+	background:#444;
+	background:rgba(0,0,0,0.6);
+	border:1px solid rgba(255,255,255,0.6);
+	z-index:300;
+	border-radius:3px;
+}
+
+.skrollr-desktop #scrollbar {display:none;}
+
+#bg1, #bg2, #bg3 {
+	z-index:50;
+	top:0;
+	left:0;
+	width:100%;
+	height:100%;
+	background:url(images/bubbles.png) repeat 0 0;
+}
+
+#bg2 {
+	z-index:49;
+	background-image:url(images/bubbles2.png);
+}
+
+#bg3 {
+	z-index:48;
+	background-image:url(images/bubbles3.png);
+}
+
+#intro {
+	width:80%;
+	left:50%;
+	top:1em;
+	margin-left:-40%;
+	padding:2em;
+	background:#fff;
+	text-align:center;
+	border-radius:1em;
+
+	-webkit-transform-origin:0 0;
+	-moz-transform-origin:0 0;
+	-ms-transform-origin:0 0;
+	-o-transform-origin:0 0;
+	transform-origin:0 0;
+
+	-webkit-box-sizing: border-box;
+	-moz-box-sizing: border-box;
+	box-sizing: border-box;
+}
+
+#intro .arrows {
+	font-size:2em;
+	color:#09f;
+}
+
+#transform {
+	width:70%;
+	left:50%;
+	top:20%;
+	margin-left:-35%;
+	text-align:center;
+	font-size:150%;
+
+	.transform-origin(50%, 50%);
+}
+
+#properties {
+	width:100%;
+	height:100%;
+	padding-top:10%;
+	text-align:center;
+
+	-webkit-box-sizing: border-box;
+	-moz-box-sizing: border-box;
+	box-sizing: border-box;
+}
+
+#easing_wrapper {
+	width:100%;
+	height:100%;
+}
+
+#easing {
+	top:10%;
+	width:50%;
+	z-index:101;
+}
+
+.drop {
+	background:#09f;
+	font-weight:bold;
+	padding:1em;
+}
+
+#download {
+	width:80%;
+	left:10%;
+	height:80%;
+	padding:3em;
+	border:0 solid #222;
+
+	-webkit-box-sizing: border-box;
+	-moz-box-sizing: border-box;
+	box-sizing: border-box;
+}
+
+.twitter-share-button, .twitter-follow-button {
+	vertical-align:middle;
+}

File diff suppressed because it is too large
+ 17 - 0
sites/all/themes/gui/materiobasetheme/bower_components/skrollr/examples/path.html


+ 79 - 0
sites/all/themes/gui/materiobasetheme/bower_components/skrollr/examples/pausing.html

@@ -0,0 +1,79 @@
+<!DOCTYPE html>
+<html>
+<head>
+	<meta charset="utf-8">
+
+	<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
+
+	<title>Pausing</title>
+
+	<style type="text/css">
+	* {
+		margin:0;
+		padding:0;
+	}
+
+	html, body {
+		width:100%;
+		height:100%;
+	}
+
+	body {font-family:sans-serif;}
+
+	body > div {
+		position:fixed;
+		top:0;
+		left:0;
+		width:100%;
+		height:100%;
+		background:transparent center no-repeat;
+		background-size:cover;
+	}
+
+	body > div:nth-child(1) {
+		background-image:url(http://placekitten.com/800/600?image=1);
+	}
+
+	body > div:nth-child(2) {
+		background:#f0f0f0;
+		overflow:hidden;
+	}
+
+	body > div:nth-child(3) {
+		background-image:url(http://placekitten.com/800/600?image=3);
+	}
+
+	.box {
+		position:absolute;
+		left:0;
+		height:100%;
+		background:#09f;
+	}
+
+	p {margin:1em 0;}
+	</style>
+</head>
+
+<body>
+	<div data-0="transform:translate(0,0%);" data-100p="transform:translate(0,-100%);"></div>
+
+	<div data-0="transform:translate(0,100%);" data-100p="transform:translate(0,0%)" data-_box-100p="" data-_box-200p="transform:translate(0,-100%)">
+		<div class="box" data-100p="width:0%;" data-_box-100p="width:100%"></div>
+	</div>
+
+	<div data-_box-100p="transform:translate(0,100%);" data-_box-200p="transform:translate(0,0%);"></div>
+
+	<script type="text/javascript" src="../dist/skrollr.min.js"></script>
+
+	<script type="text/javascript">
+	skrollr.init({
+		constants: {
+			//fill the box for a "duration" of 150% of the viewport (pause for 150%)
+			//adjust for shorter/longer pause
+			box: '150p'
+		}
+	});
+	</script>
+</body>
+
+</html>

+ 19 - 0
sites/all/themes/gui/materiobasetheme/bower_components/skrollr/examples/scripts/main.js

@@ -0,0 +1,19 @@
+require.config({
+	baseUrl: "../dist",
+	paths: {
+		'skrollr' : "skrollr.min"
+	},
+	waitSeconds: 15
+});
+
+require(['skrollr'], function(skrollr){
+	var s = skrollr.init({
+		edgeStrategy: 'set',
+		easing: {
+			WTF: Math.random,
+			inverted: function(p) {
+				return 1-p;
+			}
+		}
+	});
+});

File diff suppressed because it is too large
+ 6 - 0
sites/all/themes/gui/materiobasetheme/bower_components/skrollr/examples/scripts/require.js


+ 21 - 0
sites/all/themes/gui/materiobasetheme/bower_components/skrollr/examples/svg.html

@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<html>
+<head>
+	<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
+
+	<title>SVG</title>
+</head>
+
+<body>
+	<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="1000px" height="1000px">
+		<rect x="0" y="0" width="100%" height="100%" stroke="black" data-0="fill:rgb(255,0,0);" data-500="fill:rgb(0,0,255);" />
+		<circle cx="50%" cy="50%" r="25%" style="stroke: black;" data-0="fill:rgb(0,0,255);" data-500="fill:rgb(0,255,0);" />
+	</svg>
+
+	<script type="text/javascript" src="../dist/skrollr.min.js"></script>
+	<script type="text/javascript">
+	skrollr.init();
+	</script>
+</body>
+
+</html>

BIN
sites/all/themes/gui/materiobasetheme/bower_components/skrollr/guide/anchor-position-guide.pdf


BIN
sites/all/themes/gui/materiobasetheme/bower_components/skrollr/guide/anchor-position-guide.png


+ 86 - 0
sites/all/themes/gui/materiobasetheme/bower_components/skrollr/index.html

@@ -0,0 +1,86 @@
+<!DOCTYPE html>
+<html>
+<head>
+	<meta charset="utf-8">
+
+	<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+
+	<title>skrollr - parallax scrolling for the masses</title>
+
+	<link href="examples/fixed-positioning.css" rel="stylesheet" type="text/css" />
+	<link href="examples/main.css" rel="stylesheet" type="text/css" />
+</head>
+
+<body>
+	<div id="bg1" data-0="background-position:0px 0px;" data-end="background-position:-500px -10000px;"></div>
+	<div id="bg2" data-0="background-position:0px 0px;" data-end="background-position:-500px -8000px;"></div>
+	<div id="bg3" data-0="background-position:0px 0px;" data-end="background-position:-500px -6000px;"></div>
+
+	<div id="progress" data-0="width:0%;background:hsl(200, 100%, 50%);" data-end="width:100%;background:hsl(920, 100%, 50%);"></div>
+
+	<div id="intro" data-0="opacity:1;top:3%;transform:rotate(0deg);transform-origin:0 0;" data-500="opacity:0;top:-10%;transform:rotate(-90deg);">
+		<h1><a href="https://github.com/Prinzhorn/skrollr">skrollr</a></h1>
+		<h2>parallax scrolling for the masses</h2>
+		<p>let's get scrollin' ;-)</p>
+		<p class="arrows">▼&nbsp;▼&nbsp;▼</p>
+	</div>
+
+	<div id="transform" data-500="transform:scale(0) rotate(0deg);" data-1000="transform:scale(1) rotate(1440deg);opacity:1;" data-1600="" data-1700="transform:scale(5) rotate(3240deg);opacity:0;">
+		<h2>transform</h2>
+		<p>scale, skew and rotate the sh** out of any element</p>
+	</div>
+
+	<div id="properties" data-1700="top:100%;" data-2200="top:0%;" data-3000="display:block;" data-3700="top:-100%;display:none;">
+		<h2>all numeric properties</h2>
+		<p>width, height, padding, font-size, z-index, blah blah blah</p>
+	</div>
+
+	<div id="easing_wrapper" data-0="display:none;" data-3900="display:block;" data-4900="background:rgba(0, 0, 0, 0);color[swing]:rgb(0,0,0);" data-5900="background:rgba(0,0,0,1);color:rgb(255,255,255);" data-10000="top:0%;" data-12000="top:-100%;">
+		<div id="easing" data-3900="left:100%" data-4600="left:25%;">
+			<h2>easing?</h2>
+			<p>sure.</p>
+			<p>let me dim the <span data-3900="" data-4900="color[swing]:rgb(0,0,0);" data-5900="color:rgb(255,255,0);">lights</span> for this one...</p>
+			<p data-5900="opacity:0;font-size:100%;" data-6500="opacity:1;font-size:150%;">you can set easings for each property and define own easing functions</p>
+		</div>
+
+		<div class="drop" data-6500="left:15%;bottom:100%;" data-9500="bottom:0%;">linear</div>
+		<div class="drop" data-6500="left:25%;bottom[quadratic]:100%;" data-9500="bottom:0%;">quadratic</div>
+		<div class="drop" data-6500="left:35%;bottom[cubic]:100%;" data-9500="bottom:0%;">cubic</div>
+		<div class="drop" data-6500="left:45%;bottom[swing]:100%;" data-9500="bottom:0%;">swing</div>
+		<div class="drop" data-6500="left:55%;bottom[WTF]:100%;" data-9500="bottom:0%;">WTF</div>
+		<div class="drop" data-6500="left:65%;bottom[inverted]:100%;" data-9500="bottom:0%;">inverted</div>
+		<div class="drop" data-6500="left:75%;bottom[bounce]:100%;" data-9500="bottom:0%;">bounce</div>
+	</div>
+
+	<div id="download" data-10000="top[cubic]:100%;border-radius[cubic]:0em;background:rgb(0,50,100);border-width:0px;" data-12000="top:10%;border-radius:2em;background:rgb(190,230,255);border-width:10px;">
+		<h2>the end</h2>
+		<p>by the way, you can also animate colors (you did notice this, didn't you?)</p>
+		<p><strong>Now get this thing on <a href="https://github.com/Prinzhorn/skrollr">GitHub</a> and spread the word, it's open source!</strong> <a href="https://twitter.com/share" class="twitter-share-button" data-url="http://prinzhorn.github.com/skrollr/" data-via="Prinzhorn">Tweet</a>
+		<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src="//platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");</script></p>
+		<p>Check out more <a href="https://github.com/Prinzhorn/skrollr/tree/master/examples#examples">examples</a>.</p>
+		<p>Handcrafted by <a href="https://twitter.com/Prinzhorn" class="twitter-follow-button" data-show-count="false">Follow @Prinzhorn</a>
+		<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src="//platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");</script></p>
+	</div>
+
+	<div id="scrollbar" data-0="top:0%;margin-top:2px;" data-end="top:100%;margin-top:-52px;"></div>
+
+	<script type="text/javascript" src="dist/skrollr.min.js"></script>
+
+	<!--[if lt IE 9]>
+	<script type="text/javascript" src="../skrollr-ie/dist/skrollr.ie.min.js"></script>
+	<![endif]-->
+
+	<script type="text/javascript">
+	var s = skrollr.init({
+		edgeStrategy: 'set',
+		easing: {
+			WTF: Math.random,
+			inverted: function(p) {
+				return 1-p;
+			}
+		}
+	});
+	</script>
+</body>
+
+</html>

+ 40 - 0
sites/all/themes/gui/materiobasetheme/bower_components/skrollr/package.json

@@ -0,0 +1,40 @@
+{
+  "name": "skrollr",
+  "title": "skrollr",
+  "description": "Stand-alone parallax scrolling library with zero dependencies.",
+  "version": "0.6.29",
+  "homepage": "https://github.com/Prinzhorn/skrollr",
+  "author": {
+    "name": "Alexander Prinzhorn",
+    "email": "alexander@prinzhorn.it",
+    "url": "http://www.prinzhorn.it/"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/Prinzhorn/skrollr.git"
+  },
+  "bugs": {
+    "url": "https://github.com/Prinzhorn/skrollr/issues"
+  },
+  "licenses": [
+    {
+      "type": "MIT",
+      "url": "https://github.com/Prinzhorn/skrollr/blob/master/LICENSE.txt"
+    }
+  ],
+  "main": "dist/skrollr.min.js",
+  "engines": {
+    "node": "0.10.x"
+  },
+  "scripts": {
+    "test": "grunt travis --verbose"
+  },
+  "devDependencies": {
+    "grunt-cli": "~0.1.7",
+    "grunt": "~0.4.1",
+    "grunt-contrib-uglify": "~0.2.0",
+    "grunt-contrib-jshint": "~0.3.0",
+    "grunt-contrib-qunit": "~0.2.0"
+  },
+  "keywords": []
+}

+ 37 - 0
sites/all/themes/gui/materiobasetheme/bower_components/skrollr/shim.html

@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<html>
+<head class="no-skrollr">
+	<meta charset="utf-8">
+
+	<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
+
+	<title>Your title</title>
+</head>
+
+<body>
+	<div id="skrollr-body">
+	<!--
+		Put all your elements here.
+	-->
+	</div>
+
+	<script type="text/javascript" src="dist/skrollr.min.js"></script>
+
+	<!--[if lt IE 9]>
+	<script type="text/javascript" src="dist/skrollr.ie.min.js"></script>
+	<![endif]-->
+
+	<script type="text/javascript">
+	var s = skrollr.init();
+
+	//Or you may call the init-function at some other point. You could for example use an image preloader.
+	/*
+	window.onload = function() {
+		//Calling it twice doesn't hurt.
+		skrollr.init();
+	};
+	*/
+	</script>
+</body>
+
+</html>

+ 1779 - 0
sites/all/themes/gui/materiobasetheme/bower_components/skrollr/src/skrollr.js

@@ -0,0 +1,1779 @@
+/*!
+ * skrollr core
+ *
+ * Alexander Prinzhorn - https://github.com/Prinzhorn/skrollr
+ *
+ * Free to use under terms of MIT license
+ */
+(function(window, document, undefined) {
+	'use strict';
+
+	/*
+	 * Global api.
+	 */
+	var skrollr = {
+		get: function() {
+			return _instance;
+		},
+		//Main entry point.
+		init: function(options) {
+			return _instance || new Skrollr(options);
+		},
+		VERSION: '0.6.29'
+	};
+
+	//Minify optimization.
+	var hasProp = Object.prototype.hasOwnProperty;
+	var Math = window.Math;
+	var getStyle = window.getComputedStyle;
+
+	//They will be filled when skrollr gets initialized.
+	var documentElement;
+	var body;
+
+	var EVENT_TOUCHSTART = 'touchstart';
+	var EVENT_TOUCHMOVE = 'touchmove';
+	var EVENT_TOUCHCANCEL = 'touchcancel';
+	var EVENT_TOUCHEND = 'touchend';
+
+	var SKROLLABLE_CLASS = 'skrollable';
+	var SKROLLABLE_BEFORE_CLASS = SKROLLABLE_CLASS + '-before';
+	var SKROLLABLE_BETWEEN_CLASS = SKROLLABLE_CLASS + '-between';
+	var SKROLLABLE_AFTER_CLASS = SKROLLABLE_CLASS + '-after';
+
+	var SKROLLR_CLASS = 'skrollr';
+	var NO_SKROLLR_CLASS = 'no-' + SKROLLR_CLASS;
+	var SKROLLR_DESKTOP_CLASS = SKROLLR_CLASS + '-desktop';
+	var SKROLLR_MOBILE_CLASS = SKROLLR_CLASS + '-mobile';
+
+	var DEFAULT_EASING = 'linear';
+	var DEFAULT_DURATION = 1000;//ms
+	var DEFAULT_MOBILE_DECELERATION = 0.004;//pixel/ms²
+
+	var DEFAULT_SKROLLRBODY = 'skrollr-body';
+
+	var DEFAULT_SMOOTH_SCROLLING_DURATION = 200;//ms
+
+	var ANCHOR_START = 'start';
+	var ANCHOR_END = 'end';
+	var ANCHOR_CENTER = 'center';
+	var ANCHOR_BOTTOM = 'bottom';
+
+	//The property which will be added to the DOM element to hold the ID of the skrollable.
+	var SKROLLABLE_ID_DOM_PROPERTY = '___skrollable_id';
+
+	var rxTouchIgnoreTags = /^(?:input|textarea|button|select)$/i;
+
+	var rxTrim = /^\s+|\s+$/g;
+
+	//Find all data-attributes. data-[_constant]-[offset]-[anchor]-[anchor].
+	var rxKeyframeAttribute = /^data(?:-(_\w+))?(?:-?(-?\d*\.?\d+p?))?(?:-?(start|end|top|center|bottom))?(?:-?(top|center|bottom))?$/;
+
+	var rxPropValue = /\s*(@?[\w\-\[\]]+)\s*:\s*(.+?)\s*(?:;|$)/gi;
+
+	//Easing function names follow the property in square brackets.
+	var rxPropEasing = /^(@?[a-z\-]+)\[(\w+)\]$/;
+
+	var rxCamelCase = /-([a-z0-9_])/g;
+	var rxCamelCaseFn = function(str, letter) {
+		return letter.toUpperCase();
+	};
+
+	//Numeric values with optional sign.
+	var rxNumericValue = /[\-+]?[\d]*\.?[\d]+/g;
+
+	//Used to replace occurences of {?} with a number.
+	var rxInterpolateString = /\{\?\}/g;
+
+	//Finds rgb(a) colors, which don't use the percentage notation.
+	var rxRGBAIntegerColor = /rgba?\(\s*-?\d+\s*,\s*-?\d+\s*,\s*-?\d+/g;
+
+	//Finds all gradients.
+	var rxGradient = /[a-z\-]+-gradient/g;
+
+	//Vendor prefix. Will be set once skrollr gets initialized.
+	var theCSSPrefix = '';
+	var theDashedCSSPrefix = '';
+
+	//Will be called once (when skrollr gets initialized).
+	var detectCSSPrefix = function() {
+		//Only relevant prefixes. May be extended.
+		//Could be dangerous if there will ever be a CSS property which actually starts with "ms". Don't hope so.
+		var rxPrefixes = /^(?:O|Moz|webkit|ms)|(?:-(?:o|moz|webkit|ms)-)/;
+
+		//Detect prefix for current browser by finding the first property using a prefix.
+		if(!getStyle) {
+			return;
+		}
+
+		var style = getStyle(body, null);
+
+		for(var k in style) {
+			//We check the key and if the key is a number, we check the value as well, because safari's getComputedStyle returns some weird array-like thingy.
+			theCSSPrefix = (k.match(rxPrefixes) || (+k == k && style[k].match(rxPrefixes)));
+
+			if(theCSSPrefix) {
+				break;
+			}
+		}
+
+		//Did we even detect a prefix?
+		if(!theCSSPrefix) {
+			theCSSPrefix = theDashedCSSPrefix = '';
+
+			return;
+		}
+
+		theCSSPrefix = theCSSPrefix[0];
+
+		//We could have detected either a dashed prefix or this camelCaseish-inconsistent stuff.
+		if(theCSSPrefix.slice(0,1) === '-') {
+			theDashedCSSPrefix = theCSSPrefix;
+
+			//There's no logic behind these. Need a look up.
+			theCSSPrefix = ({
+				'-webkit-': 'webkit',
+				'-moz-': 'Moz',
+				'-ms-': 'ms',
+				'-o-': 'O'
+			})[theCSSPrefix];
+		} else {
+			theDashedCSSPrefix = '-' + theCSSPrefix.toLowerCase() + '-';
+		}
+	};
+
+	var polyfillRAF = function() {
+		var requestAnimFrame = window.requestAnimationFrame || window[theCSSPrefix.toLowerCase() + 'RequestAnimationFrame'];
+
+		var lastTime = _now();
+
+		if(_isMobile || !requestAnimFrame) {
+			requestAnimFrame = function(callback) {
+				//How long did it take to render?
+				var deltaTime = _now() - lastTime;
+				var delay = Math.max(0, 1000 / 60 - deltaTime);
+
+				return window.setTimeout(function() {
+					lastTime = _now();
+					callback();
+				}, delay);
+			};
+		}
+
+		return requestAnimFrame;
+	};
+
+	var polyfillCAF = function() {
+		var cancelAnimFrame = window.cancelAnimationFrame || window[theCSSPrefix.toLowerCase() + 'CancelAnimationFrame'];
+
+		if(_isMobile || !cancelAnimFrame) {
+			cancelAnimFrame = function(timeout) {
+				return window.clearTimeout(timeout);
+			};
+		}
+
+		return cancelAnimFrame;
+	};
+
+	//Built-in easing functions.
+	var easings = {
+		begin: function() {
+			return 0;
+		},
+		end: function() {
+			return 1;
+		},
+		linear: function(p) {
+			return p;
+		},
+		quadratic: function(p) {
+			return p * p;
+		},
+		cubic: function(p) {
+			return p * p * p;
+		},
+		swing: function(p) {
+			return (-Math.cos(p * Math.PI) / 2) + 0.5;
+		},
+		sqrt: function(p) {
+			return Math.sqrt(p);
+		},
+		outCubic: function(p) {
+			return (Math.pow((p - 1), 3) + 1);
+		},
+		//see https://www.desmos.com/calculator/tbr20s8vd2 for how I did this
+		bounce: function(p) {
+			var a;
+
+			if(p <= 0.5083) {
+				a = 3;
+			} else if(p <= 0.8489) {
+				a = 9;
+			} else if(p <= 0.96208) {
+				a = 27;
+			} else if(p <= 0.99981) {
+				a = 91;
+			} else {
+				return 1;
+			}
+
+			return 1 - Math.abs(3 * Math.cos(p * a * 1.028) / a);
+		}
+	};
+
+	/**
+	 * Constructor.
+	 */
+	function Skrollr(options) {
+		documentElement = document.documentElement;
+		body = document.body;
+
+		detectCSSPrefix();
+
+		_instance = this;
+
+		options = options || {};
+
+		_constants = options.constants || {};
+
+		//We allow defining custom easings or overwrite existing.
+		if(options.easing) {
+			for(var e in options.easing) {
+				easings[e] = options.easing[e];
+			}
+		}
+
+		_edgeStrategy = options.edgeStrategy || 'set';
+
+		_listeners = {
+			//Function to be called right before rendering.
+			beforerender: options.beforerender,
+
+			//Function to be called right after finishing rendering.
+			render: options.render,
+
+			//Function to be called whenever an element with the `data-emit-events` attribute passes a keyframe.
+			keyframe: options.keyframe
+		};
+
+		//forceHeight is true by default
+		_forceHeight = options.forceHeight !== false;
+
+		if(_forceHeight) {
+			_scale = options.scale || 1;
+		}
+
+		_mobileDeceleration = options.mobileDeceleration || DEFAULT_MOBILE_DECELERATION;
+
+		_smoothScrollingEnabled = options.smoothScrolling !== false;
+		_smoothScrollingDuration = options.smoothScrollingDuration || DEFAULT_SMOOTH_SCROLLING_DURATION;
+
+		//Dummy object. Will be overwritten in the _render method when smooth scrolling is calculated.
+		_smoothScrolling = {
+			targetTop: _instance.getScrollTop()
+		};
+
+		//A custom check function may be passed.
+		_isMobile = ((options.mobileCheck || function() {
+			return (/Android|iPhone|iPad|iPod|BlackBerry/i).test(navigator.userAgent || navigator.vendor || window.opera);
+		})());
+
+		if(_isMobile) {
+			_skrollrBody = document.getElementById(options.skrollrBody || DEFAULT_SKROLLRBODY);
+
+			//Detect 3d transform if there's a skrollr-body (only needed for #skrollr-body).
+			if(_skrollrBody) {
+				_detect3DTransforms();
+			}
+
+			_initMobile();
+			_updateClass(documentElement, [SKROLLR_CLASS, SKROLLR_MOBILE_CLASS], [NO_SKROLLR_CLASS]);
+		} else {
+			_updateClass(documentElement, [SKROLLR_CLASS, SKROLLR_DESKTOP_CLASS], [NO_SKROLLR_CLASS]);
+		}
+
+		//Triggers parsing of elements and a first reflow.
+		_instance.refresh();
+
+		_addEvent(window, 'resize orientationchange', function() {
+			var width = documentElement.clientWidth;
+			var height = documentElement.clientHeight;
+
+			//Only reflow if the size actually changed (#271).
+			if(height !== _lastViewportHeight || width !== _lastViewportWidth) {
+				_lastViewportHeight = height;
+				_lastViewportWidth = width;
+
+				_requestReflow = true;
+			}
+		});
+
+		var requestAnimFrame = polyfillRAF();
+
+		//Let's go.
+		(function animloop(){
+			_render();
+			_animFrame = requestAnimFrame(animloop);
+		}());
+
+		return _instance;
+	}
+
+	/**
+	 * (Re)parses some or all elements.
+	 */
+	Skrollr.prototype.refresh = function(elements) {
+		var elementIndex;
+		var elementsLength;
+		var ignoreID = false;
+
+		//Completely reparse anything without argument.
+		if(elements === undefined) {
+			//Ignore that some elements may already have a skrollable ID.
+			ignoreID = true;
+
+			_skrollables = [];
+			_skrollableIdCounter = 0;
+
+			elements = document.getElementsByTagName('*');
+		} else if(elements.length === undefined) {
+			//We also accept a single element as parameter.
+			elements = [elements];
+		}
+
+		elementIndex = 0;
+		elementsLength = elements.length;
+
+		for(; elementIndex < elementsLength; elementIndex++) {
+			var el = elements[elementIndex];
+			var anchorTarget = el;
+			var keyFrames = [];
+
+			//If this particular element should be smooth scrolled.
+			var smoothScrollThis = _smoothScrollingEnabled;
+
+			//The edge strategy for this particular element.
+			var edgeStrategy = _edgeStrategy;
+
+			//If this particular element should emit keyframe events.
+			var emitEvents = false;
+
+			//If we're reseting the counter, remove any old element ids that may be hanging around.
+			if(ignoreID && SKROLLABLE_ID_DOM_PROPERTY in el) {
+				delete el[SKROLLABLE_ID_DOM_PROPERTY];
+			}
+
+			if(!el.attributes) {
+				continue;
+			}
+
+			//Iterate over all attributes and search for key frame attributes.
+			var attributeIndex = 0;
+			var attributesLength = el.attributes.length;
+
+			for (; attributeIndex < attributesLength; attributeIndex++) {
+				var attr = el.attributes[attributeIndex];
+
+				if(attr.name === 'data-anchor-target') {
+					anchorTarget = document.querySelector(attr.value);
+
+					if(anchorTarget === null) {
+						throw 'Unable to find anchor target "' + attr.value + '"';
+					}
+
+					continue;
+				}
+
+				//Global smooth scrolling can be overridden by the element attribute.
+				if(attr.name === 'data-smooth-scrolling') {
+					smoothScrollThis = attr.value !== 'off';
+
+					continue;
+				}
+
+				//Global edge strategy can be overridden by the element attribute.
+				if(attr.name === 'data-edge-strategy') {
+					edgeStrategy = attr.value;
+
+					continue;
+				}
+
+				//Is this element tagged with the `data-emit-events` attribute?
+				if(attr.name === 'data-emit-events') {
+					emitEvents = true;
+
+					continue;
+				}
+
+				var match = attr.name.match(rxKeyframeAttribute);
+
+				if(match === null) {
+					continue;
+				}
+
+				var kf = {
+					props: attr.value,
+					//Point back to the element as well.
+					element: el,
+					//The name of the event which this keyframe will fire, if emitEvents is
+					eventType: attr.name.replace(rxCamelCase, rxCamelCaseFn)
+				};
+
+				keyFrames.push(kf);
+
+				var constant = match[1];
+
+				if(constant) {
+					//Strip the underscore prefix.
+					kf.constant = constant.substr(1);
+				}
+
+				//Get the key frame offset.
+				var offset = match[2];
+
+				//Is it a percentage offset?
+				if(/p$/.test(offset)) {
+					kf.isPercentage = true;
+					kf.offset = (offset.slice(0, -1) | 0) / 100;
+				} else {
+					kf.offset = (offset | 0);
+				}
+
+				var anchor1 = match[3];
+
+				//If second anchor is not set, the first will be taken for both.
+				var anchor2 = match[4] || anchor1;
+
+				//"absolute" (or "classic") mode, where numbers mean absolute scroll offset.
+				if(!anchor1 || anchor1 === ANCHOR_START || anchor1 === ANCHOR_END) {
+					kf.mode = 'absolute';
+
+					//data-end needs to be calculated after all key frames are known.
+					if(anchor1 === ANCHOR_END) {
+						kf.isEnd = true;
+					} else if(!kf.isPercentage) {
+						//For data-start we can already set the key frame w/o calculations.
+						//#59: "scale" options should only affect absolute mode.
+						kf.offset = kf.offset * _scale;
+					}
+				}
+				//"relative" mode, where numbers are relative to anchors.
+				else {
+					kf.mode = 'relative';
+					kf.anchors = [anchor1, anchor2];
+				}
+			}
+
+			//Does this element have key frames?
+			if(!keyFrames.length) {
+				continue;
+			}
+
+			//Will hold the original style and class attributes before we controlled the element (see #80).
+			var styleAttr, classAttr;
+
+			var id;
+
+			if(!ignoreID && SKROLLABLE_ID_DOM_PROPERTY in el) {
+				//We already have this element under control. Grab the corresponding skrollable id.
+				id = el[SKROLLABLE_ID_DOM_PROPERTY];
+				styleAttr = _skrollables[id].styleAttr;
+				classAttr = _skrollables[id].classAttr;
+			} else {
+				//It's an unknown element. Asign it a new skrollable id.
+				id = (el[SKROLLABLE_ID_DOM_PROPERTY] = _skrollableIdCounter++);
+				styleAttr = el.style.cssText;
+				classAttr = _getClass(el);
+			}
+
+			_skrollables[id] = {
+				element: el,
+				styleAttr: styleAttr,
+				classAttr: classAttr,
+				anchorTarget: anchorTarget,
+				keyFrames: keyFrames,
+				smoothScrolling: smoothScrollThis,
+				edgeStrategy: edgeStrategy,
+				emitEvents: emitEvents,
+				lastFrameIndex: -1
+			};
+
+			_updateClass(el, [SKROLLABLE_CLASS], []);
+		}
+
+		//Reflow for the first time.
+		_reflow();
+
+		//Now that we got all key frame numbers right, actually parse the properties.
+		elementIndex = 0;
+		elementsLength = elements.length;
+
+		for(; elementIndex < elementsLength; elementIndex++) {
+			var sk = _skrollables[elements[elementIndex][SKROLLABLE_ID_DOM_PROPERTY]];
+
+			if(sk === undefined) {
+				continue;
+			}
+
+			//Parse the property string to objects
+			_parseProps(sk);
+
+			//Fill key frames with missing properties from left and right
+			_fillProps(sk);
+		}
+
+		return _instance;
+	};
+
+	/**
+	 * Transform "relative" mode to "absolute" mode.
+	 * That is, calculate anchor position and offset of element.
+	 */
+	Skrollr.prototype.relativeToAbsolute = function(element, viewportAnchor, elementAnchor) {
+		var viewportHeight = documentElement.clientHeight;
+		var box = element.getBoundingClientRect();
+		var absolute = box.top;
+
+		//#100: IE doesn't supply "height" with getBoundingClientRect.
+		var boxHeight = box.bottom - box.top;
+
+		if(viewportAnchor === ANCHOR_BOTTOM) {
+			absolute -= viewportHeight;
+		} else if(viewportAnchor === ANCHOR_CENTER) {
+			absolute -= viewportHeight / 2;
+		}
+
+		if(elementAnchor === ANCHOR_BOTTOM) {
+			absolute += boxHeight;
+		} else if(elementAnchor === ANCHOR_CENTER) {
+			absolute += boxHeight / 2;
+		}
+
+		//Compensate scrolling since getBoundingClientRect is relative to viewport.
+		absolute += _instance.getScrollTop();
+
+		return (absolute + 0.5) | 0;
+	};
+
+	/**
+	 * Animates scroll top to new position.
+	 */
+	Skrollr.prototype.animateTo = function(top, options) {
+		options = options || {};
+
+		var now = _now();
+		var scrollTop = _instance.getScrollTop();
+
+		//Setting this to a new value will automatically cause the current animation to stop, if any.
+		_scrollAnimation = {
+			startTop: scrollTop,
+			topDiff: top - scrollTop,
+			targetTop: top,
+			duration: options.duration || DEFAULT_DURATION,
+			startTime: now,
+			endTime: now + (options.duration || DEFAULT_DURATION),
+			easing: easings[options.easing || DEFAULT_EASING],
+			done: options.done
+		};
+
+		//Don't queue the animation if there's nothing to animate.
+		if(!_scrollAnimation.topDiff) {
+			if(_scrollAnimation.done) {
+				_scrollAnimation.done.call(_instance, false);
+			}
+
+			_scrollAnimation = undefined;
+		}
+
+		return _instance;
+	};
+
+	/**
+	 * Stops animateTo animation.
+	 */
+	Skrollr.prototype.stopAnimateTo = function() {
+		if(_scrollAnimation && _scrollAnimation.done) {
+			_scrollAnimation.done.call(_instance, true);
+		}
+
+		_scrollAnimation = undefined;
+	};
+
+	/**
+	 * Returns if an animation caused by animateTo is currently running.
+	 */
+	Skrollr.prototype.isAnimatingTo = function() {
+		return !!_scrollAnimation;
+	};
+
+	Skrollr.prototype.isMobile = function() {
+		return _isMobile;
+	};
+
+	Skrollr.prototype.setScrollTop = function(top, force) {
+		_forceRender = (force === true);
+
+		if(_isMobile) {
+			_mobileOffset = Math.min(Math.max(top, 0), _maxKeyFrame);
+		} else {
+			window.scrollTo(0, top);
+		}
+
+		return _instance;
+	};
+
+	Skrollr.prototype.getScrollTop = function() {
+		if(_isMobile) {
+			return _mobileOffset;
+		} else {
+			return window.pageYOffset || documentElement.scrollTop || body.scrollTop || 0;
+		}
+	};
+
+	Skrollr.prototype.getMaxScrollTop = function() {
+		return _maxKeyFrame;
+	};
+
+	Skrollr.prototype.on = function(name, fn) {
+		_listeners[name] = fn;
+
+		return _instance;
+	};
+
+	Skrollr.prototype.off = function(name) {
+		delete _listeners[name];
+
+		return _instance;
+	};
+
+	Skrollr.prototype.destroy = function() {
+		var cancelAnimFrame = polyfillCAF();
+		cancelAnimFrame(_animFrame);
+		_removeAllEvents();
+
+		_updateClass(documentElement, [NO_SKROLLR_CLASS], [SKROLLR_CLASS, SKROLLR_DESKTOP_CLASS, SKROLLR_MOBILE_CLASS]);
+
+		var skrollableIndex = 0;
+		var skrollablesLength = _skrollables.length;
+
+		for(; skrollableIndex < skrollablesLength; skrollableIndex++) {
+			_reset(_skrollables[skrollableIndex].element);
+		}
+
+		documentElement.style.overflow = body.style.overflow = '';
+		documentElement.style.height = body.style.height = '';
+
+		if(_skrollrBody) {
+			skrollr.setStyle(_skrollrBody, 'transform', 'none');
+		}
+
+		_instance = undefined;
+		_skrollrBody = undefined;
+		_listeners = undefined;
+		_forceHeight = undefined;
+		_maxKeyFrame = 0;
+		_scale = 1;
+		_constants = undefined;
+		_mobileDeceleration = undefined;
+		_direction = 'down';
+		_lastTop = -1;
+		_lastViewportWidth = 0;
+		_lastViewportHeight = 0;
+		_requestReflow = false;
+		_scrollAnimation = undefined;
+		_smoothScrollingEnabled = undefined;
+		_smoothScrollingDuration = undefined;
+		_smoothScrolling = undefined;
+		_forceRender = undefined;
+		_skrollableIdCounter = 0;
+		_edgeStrategy = undefined;
+		_isMobile = false;
+		_mobileOffset = 0;
+		_translateZ = undefined;
+	};
+
+	/*
+		Private methods.
+	*/
+
+	var _initMobile = function() {
+		var initialElement;
+		var initialTouchY;
+		var initialTouchX;
+		var currentElement;
+		var currentTouchY;
+		var currentTouchX;
+		var lastTouchY;
+		var deltaY;
+
+		var initialTouchTime;
+		var currentTouchTime;
+		var lastTouchTime;
+		var deltaTime;
+
+		_addEvent(documentElement, [EVENT_TOUCHSTART, EVENT_TOUCHMOVE, EVENT_TOUCHCANCEL, EVENT_TOUCHEND].join(' '), function(e) {
+			var touch = e.changedTouches[0];
+
+			currentElement = e.target;
+
+			//We don't want text nodes.
+			while(currentElement.nodeType === 3) {
+				currentElement = currentElement.parentNode;
+			}
+
+			currentTouchY = touch.clientY;
+			currentTouchX = touch.clientX;
+			currentTouchTime = e.timeStamp;
+
+			if(!rxTouchIgnoreTags.test(currentElement.tagName)) {
+				e.preventDefault();
+			}
+
+			switch(e.type) {
+				case EVENT_TOUCHSTART:
+					//The last element we tapped on.
+					if(initialElement) {
+						initialElement.blur();
+					}
+
+					_instance.stopAnimateTo();
+
+					initialElement = currentElement;
+
+					initialTouchY = lastTouchY = currentTouchY;
+					initialTouchX = currentTouchX;
+					initialTouchTime = currentTouchTime;
+
+					break;
+				case EVENT_TOUCHMOVE:
+					//Prevent default event on touchIgnore elements in case they don't have focus yet.
+					if(rxTouchIgnoreTags.test(currentElement.tagName) && document.activeElement !== currentElement) {
+						e.preventDefault();
+					}
+
+					deltaY = currentTouchY - lastTouchY;
+					deltaTime = currentTouchTime - lastTouchTime;
+
+					_instance.setScrollTop(_mobileOffset - deltaY, true);
+
+					lastTouchY = currentTouchY;
+					lastTouchTime = currentTouchTime;
+					break;
+				default:
+				case EVENT_TOUCHCANCEL:
+				case EVENT_TOUCHEND:
+					var distanceY = initialTouchY - currentTouchY;
+					var distanceX = initialTouchX - currentTouchX;
+					var distance2 = distanceX * distanceX + distanceY * distanceY;
+
+					//Check if it was more like a tap (moved less than 7px).
+					if(distance2 < 49) {
+						if(!rxTouchIgnoreTags.test(initialElement.tagName)) {
+							initialElement.focus();
+
+							//It was a tap, click the element.
+							var clickEvent = document.createEvent('MouseEvents');
+							clickEvent.initMouseEvent('click', true, true, e.view, 1, touch.screenX, touch.screenY, touch.clientX, touch.clientY, e.ctrlKey, e.altKey, e.shiftKey, e.metaKey, 0, null);
+							initialElement.dispatchEvent(clickEvent);
+						}
+
+						return;
+					}
+
+					initialElement = undefined;
+
+					var speed = deltaY / deltaTime;
+
+					//Cap speed at 3 pixel/ms.
+					speed = Math.max(Math.min(speed, 3), -3);
+
+					var duration = Math.abs(speed / _mobileDeceleration);
+					var targetOffset = speed * duration + 0.5 * _mobileDeceleration * duration * duration;
+					var targetTop = _instance.getScrollTop() - targetOffset;
+
+					//Relative duration change for when scrolling above bounds.
+					var targetRatio = 0;
+
+					//Change duration proportionally when scrolling would leave bounds.
+					if(targetTop > _maxKeyFrame) {
+						targetRatio = (_maxKeyFrame - targetTop) / targetOffset;
+
+						targetTop = _maxKeyFrame;
+					} else if(targetTop < 0) {
+						targetRatio = -targetTop / targetOffset;
+
+						targetTop = 0;
+					}
+
+					duration = duration * (1 - targetRatio);
+
+					_instance.animateTo((targetTop + 0.5) | 0, {easing: 'outCubic', duration: duration});
+					break;
+			}
+		});
+
+		//Just in case there has already been some native scrolling, reset it.
+		window.scrollTo(0, 0);
+		documentElement.style.overflow = body.style.overflow = 'hidden';
+	};
+
+	/**
+	 * Updates key frames which depend on others / need to be updated on resize.
+	 * That is "end" in "absolute" mode and all key frames in "relative" mode.
+	 * Also handles constants, because they may change on resize.
+	 */
+	var _updateDependentKeyFrames = function() {
+		var viewportHeight = documentElement.clientHeight;
+		var processedConstants = _processConstants();
+		var skrollable;
+		var element;
+		var anchorTarget;
+		var keyFrames;
+		var keyFrameIndex;
+		var keyFramesLength;
+		var kf;
+		var skrollableIndex;
+		var skrollablesLength;
+		var offset;
+		var constantValue;
+
+		//First process all relative-mode elements and find the max key frame.
+		skrollableIndex = 0;
+		skrollablesLength = _skrollables.length;
+
+		for(; skrollableIndex < skrollablesLength; skrollableIndex++) {
+			skrollable = _skrollables[skrollableIndex];
+			element = skrollable.element;
+			anchorTarget = skrollable.anchorTarget;
+			keyFrames = skrollable.keyFrames;
+
+			keyFrameIndex = 0;
+			keyFramesLength = keyFrames.length;
+
+			for(; keyFrameIndex < keyFramesLength; keyFrameIndex++) {
+				kf = keyFrames[keyFrameIndex];
+
+				offset = kf.offset;
+				constantValue = processedConstants[kf.constant] || 0;
+
+				kf.frame = offset;
+
+				if(kf.isPercentage) {
+					//Convert the offset to percentage of the viewport height.
+					offset = offset * viewportHeight;
+
+					//Absolute + percentage mode.
+					kf.frame = offset;
+				}
+
+				if(kf.mode === 'relative') {
+					_reset(element);
+
+					kf.frame = _instance.relativeToAbsolute(anchorTarget, kf.anchors[0], kf.anchors[1]) - offset;
+
+					_reset(element, true);
+				}
+
+				kf.frame += constantValue;
+
+				//Only search for max key frame when forceHeight is enabled.
+				if(_forceHeight) {
+					//Find the max key frame, but don't use one of the data-end ones for comparison.
+					if(!kf.isEnd && kf.frame > _maxKeyFrame) {
+						_maxKeyFrame = kf.frame;
+					}
+				}
+			}
+		}
+
+		//#133: The document can be larger than the maxKeyFrame we found.
+		_maxKeyFrame = Math.max(_maxKeyFrame, _getDocumentHeight());
+
+		//Now process all data-end keyframes.
+		skrollableIndex = 0;
+		skrollablesLength = _skrollables.length;
+
+		for(; skrollableIndex < skrollablesLength; skrollableIndex++) {
+			skrollable = _skrollables[skrollableIndex];
+			keyFrames = skrollable.keyFrames;
+
+			keyFrameIndex = 0;
+			keyFramesLength = keyFrames.length;
+
+			for(; keyFrameIndex < keyFramesLength; keyFrameIndex++) {
+				kf = keyFrames[keyFrameIndex];
+
+				constantValue = processedConstants[kf.constant] || 0;
+
+				if(kf.isEnd) {
+					kf.frame = _maxKeyFrame - kf.offset + constantValue;
+				}
+			}
+
+			skrollable.keyFrames.sort(_keyFrameComparator);
+		}
+	};
+
+	/**
+	 * Calculates and sets the style properties for the element at the given frame.
+	 * @param fakeFrame The frame to render at when smooth scrolling is enabled.
+	 * @param actualFrame The actual frame we are at.
+	 */
+	var _calcSteps = function(fakeFrame, actualFrame) {
+		//Iterate over all skrollables.
+		var skrollableIndex = 0;
+		var skrollablesLength = _skrollables.length;
+
+		for(; skrollableIndex < skrollablesLength; skrollableIndex++) {
+			var skrollable = _skrollables[skrollableIndex];
+			var element = skrollable.element;
+			var frame = skrollable.smoothScrolling ? fakeFrame : actualFrame;
+			var frames = skrollable.keyFrames;
+			var framesLength = frames.length;
+			var firstFrame = frames[0];
+			var lastFrame = frames[frames.length - 1];
+			var beforeFirst = frame < firstFrame.frame;
+			var afterLast = frame > lastFrame.frame;
+			var firstOrLastFrame = beforeFirst ? firstFrame : lastFrame;
+			var emitEvents = skrollable.emitEvents;
+			var lastFrameIndex = skrollable.lastFrameIndex;
+			var key;
+			var value;
+
+			//If we are before/after the first/last frame, set the styles according to the given edge strategy.
+			if(beforeFirst || afterLast) {
+				//Check if we already handled this edge case last time.
+				//Note: using setScrollTop it's possible that we jumped from one edge to the other.
+				if(beforeFirst && skrollable.edge === -1 || afterLast && skrollable.edge === 1) {
+					continue;
+				}
+
+				//Add the skrollr-before or -after class.
+				if(beforeFirst) {
+					_updateClass(element, [SKROLLABLE_BEFORE_CLASS], [SKROLLABLE_AFTER_CLASS, SKROLLABLE_BETWEEN_CLASS]);
+
+					//This handles the special case where we exit the first keyframe.
+					if(emitEvents && lastFrameIndex > -1) {
+						_emitEvent(element, firstFrame.eventType, _direction);
+						skrollable.lastFrameIndex = -1;
+					}
+				} else {
+					_updateClass(element, [SKROLLABLE_AFTER_CLASS], [SKROLLABLE_BEFORE_CLASS, SKROLLABLE_BETWEEN_CLASS]);
+
+					//This handles the special case where we exit the last keyframe.
+					if(emitEvents && lastFrameIndex < framesLength) {
+						_emitEvent(element, lastFrame.eventType, _direction);
+						skrollable.lastFrameIndex = framesLength;
+					}
+				}
+
+				//Remember that we handled the edge case (before/after the first/last keyframe).
+				skrollable.edge = beforeFirst ? -1 : 1;
+
+				switch(skrollable.edgeStrategy) {
+					case 'reset':
+						_reset(element);
+						continue;
+					case 'ease':
+						//Handle this case like it would be exactly at first/last keyframe and just pass it on.
+						frame = firstOrLastFrame.frame;
+						break;
+					default:
+					case 'set':
+						var props = firstOrLastFrame.props;
+
+						for(key in props) {
+							if(hasProp.call(props, key)) {
+								value = _interpolateString(props[key].value);
+
+								//Set style or attribute.
+								if(key.indexOf('@') === 0) {
+									element.setAttribute(key.substr(1), value);
+								} else {
+									skrollr.setStyle(element, key, value);
+								}
+							}
+						}
+
+						continue;
+				}
+			} else {
+				//Did we handle an edge last time?
+				if(skrollable.edge !== 0) {
+					_updateClass(element, [SKROLLABLE_CLASS, SKROLLABLE_BETWEEN_CLASS], [SKROLLABLE_BEFORE_CLASS, SKROLLABLE_AFTER_CLASS]);
+					skrollable.edge = 0;
+				}
+			}
+
+			//Find out between which two key frames we are right now.
+			var keyFrameIndex = 0;
+
+			for(; keyFrameIndex < framesLength - 1; keyFrameIndex++) {
+				if(frame >= frames[keyFrameIndex].frame && frame <= frames[keyFrameIndex + 1].frame) {
+					var left = frames[keyFrameIndex];
+					var right = frames[keyFrameIndex + 1];
+
+					for(key in left.props) {
+						if(hasProp.call(left.props, key)) {
+							var progress = (frame - left.frame) / (right.frame - left.frame);
+
+							//Transform the current progress using the given easing function.
+							progress = left.props[key].easing(progress);
+
+							//Interpolate between the two values
+							value = _calcInterpolation(left.props[key].value, right.props[key].value, progress);
+
+							value = _interpolateString(value);
+
+							//Set style or attribute.
+							if(key.indexOf('@') === 0) {
+								element.setAttribute(key.substr(1), value);
+							} else {
+								skrollr.setStyle(element, key, value);
+							}
+						}
+					}
+
+					//Are events enabled on this element?
+					//This code handles the usual cases of scrolling through different keyframes.
+					//The special cases of before first and after last keyframe are handled above.
+					if(emitEvents) {
+						//Did we pass a new keyframe?
+						if(lastFrameIndex !== keyFrameIndex) {
+							if(_direction === 'down') {
+								_emitEvent(element, left.eventType, _direction);
+							} else {
+								_emitEvent(element, right.eventType, _direction);
+							}
+
+							skrollable.lastFrameIndex = keyFrameIndex;
+						}
+					}
+
+					break;
+				}
+			}
+		}
+	};
+
+	/**
+	 * Renders all elements.
+	 */
+	var _render = function() {
+		if(_requestReflow) {
+			_requestReflow = false;
+			_reflow();
+		}
+
+		//We may render something else than the actual scrollbar position.
+		var renderTop = _instance.getScrollTop();
+
+		//If there's an animation, which ends in current render call, call the callback after rendering.
+		var afterAnimationCallback;
+		var now = _now();
+		var progress;
+
+		//Before actually rendering handle the scroll animation, if any.
+		if(_scrollAnimation) {
+			//It's over
+			if(now >= _scrollAnimation.endTime) {
+				renderTop = _scrollAnimation.targetTop;
+				afterAnimationCallback = _scrollAnimation.done;
+				_scrollAnimation = undefined;
+			} else {
+				//Map the current progress to the new progress using given easing function.
+				progress = _scrollAnimation.easing((now - _scrollAnimation.startTime) / _scrollAnimation.duration);
+
+				renderTop = (_scrollAnimation.startTop + progress * _scrollAnimation.topDiff) | 0;
+			}
+
+			_instance.setScrollTop(renderTop, true);
+		}
+		//Smooth scrolling only if there's no animation running and if we're not forcing the rendering.
+		else if(!_forceRender) {
+			var smoothScrollingDiff = _smoothScrolling.targetTop - renderTop;
+
+			//The user scrolled, start new smooth scrolling.
+			if(smoothScrollingDiff) {
+				_smoothScrolling = {
+					startTop: _lastTop,
+					topDiff: renderTop - _lastTop,
+					targetTop: renderTop,
+					startTime: _lastRenderCall,
+					endTime: _lastRenderCall + _smoothScrollingDuration
+				};
+			}
+
+			//Interpolate the internal scroll position (not the actual scrollbar).
+			if(now <= _smoothScrolling.endTime) {
+				//Map the current progress to the new progress using easing function.
+				progress = easings.sqrt((now - _smoothScrolling.startTime) / _smoothScrollingDuration);
+
+				renderTop = (_smoothScrolling.startTop + progress * _smoothScrolling.topDiff) | 0;
+			}
+		}
+
+		//That's were we actually "scroll" on mobile.
+		if(_isMobile && _skrollrBody) {
+			//Set the transform ("scroll it").
+			skrollr.setStyle(_skrollrBody, 'transform', 'translate(0, ' + -(_mobileOffset) + 'px) ' + _translateZ);
+		}
+
+		//Did the scroll position even change?
+		if(_forceRender || _lastTop !== renderTop) {
+			//Remember in which direction are we scrolling?
+			_direction = (renderTop > _lastTop) ? 'down' : (renderTop < _lastTop ? 'up' : _direction);
+
+			_forceRender = false;
+
+			var listenerParams = {
+				curTop: renderTop,
+				lastTop: _lastTop,
+				maxTop: _maxKeyFrame,
+				direction: _direction
+			};
+
+			//Tell the listener we are about to render.
+			var continueRendering = _listeners.beforerender && _listeners.beforerender.call(_instance, listenerParams);
+
+			//The beforerender listener function is able the cancel rendering.
+			if(continueRendering !== false) {
+				//Now actually interpolate all the styles.
+				_calcSteps(renderTop, _instance.getScrollTop());
+
+				//Remember when we last rendered.
+				_lastTop = renderTop;
+
+				if(_listeners.render) {
+					_listeners.render.call(_instance, listenerParams);
+				}
+			}
+
+			if(afterAnimationCallback) {
+				afterAnimationCallback.call(_instance, false);
+			}
+		}
+
+		_lastRenderCall = now;
+	};
+
+	/**
+	 * Parses the properties for each key frame of the given skrollable.
+	 */
+	var _parseProps = function(skrollable) {
+		//Iterate over all key frames
+		var keyFrameIndex = 0;
+		var keyFramesLength = skrollable.keyFrames.length;
+
+		for(; keyFrameIndex < keyFramesLength; keyFrameIndex++) {
+			var frame = skrollable.keyFrames[keyFrameIndex];
+			var easing;
+			var value;
+			var prop;
+			var props = {};
+
+			var match;
+
+			while((match = rxPropValue.exec(frame.props)) !== null) {
+				prop = match[1];
+				value = match[2];
+
+				easing = prop.match(rxPropEasing);
+
+				//Is there an easing specified for this prop?
+				if(easing !== null) {
+					prop = easing[1];
+					easing = easing[2];
+				} else {
+					easing = DEFAULT_EASING;
+				}
+
+				//Exclamation point at first position forces the value to be taken literal.
+				value = value.indexOf('!') ? _parseProp(value) : [value.slice(1)];
+
+				//Save the prop for this key frame with his value and easing function
+				props[prop] = {
+					value: value,
+					easing: easings[easing]
+				};
+			}
+
+			frame.props = props;
+		}
+	};
+
+	/**
+	 * Parses a value extracting numeric values and generating a format string
+	 * for later interpolation of the new values in old string.
+	 *
+	 * @param val The CSS value to be parsed.
+	 * @return Something like ["rgba(?%,?%, ?%,?)", 100, 50, 0, .7]
+	 * where the first element is the format string later used
+	 * and all following elements are the numeric value.
+	 */
+	var _parseProp = function(val) {
+		var numbers = [];
+
+		//One special case, where floats don't work.
+		//We replace all occurences of rgba colors
+		//which don't use percentage notation with the percentage notation.
+		rxRGBAIntegerColor.lastIndex = 0;
+		val = val.replace(rxRGBAIntegerColor, function(rgba) {
+			return rgba.replace(rxNumericValue, function(n) {
+				return n / 255 * 100 + '%';
+			});
+		});
+
+		//Handle prefixing of "gradient" values.
+		//For now only the prefixed value will be set. Unprefixed isn't supported anyway.
+		if(theDashedCSSPrefix) {
+			rxGradient.lastIndex = 0;
+			val = val.replace(rxGradient, function(s) {
+				return theDashedCSSPrefix + s;
+			});
+		}
+
+		//Now parse ANY number inside this string and create a format string.
+		val = val.replace(rxNumericValue, function(n) {
+			numbers.push(+n);
+			return '{?}';
+		});
+
+		//Add the formatstring as first value.
+		numbers.unshift(val);
+
+		return numbers;
+	};
+
+	/**
+	 * Fills the key frames with missing left and right hand properties.
+	 * If key frame 1 has property X and key frame 2 is missing X,
+	 * but key frame 3 has X again, then we need to assign X to key frame 2 too.
+	 *
+	 * @param sk A skrollable.
+	 */
+	var _fillProps = function(sk) {
+		//Will collect the properties key frame by key frame
+		var propList = {};
+		var keyFrameIndex;
+		var keyFramesLength;
+
+		//Iterate over all key frames from left to right
+		keyFrameIndex = 0;
+		keyFramesLength = sk.keyFrames.length;
+
+		for(; keyFrameIndex < keyFramesLength; keyFrameIndex++) {
+			_fillPropForFrame(sk.keyFrames[keyFrameIndex], propList);
+		}
+
+		//Now do the same from right to fill the last gaps
+
+		propList = {};
+
+		//Iterate over all key frames from right to left
+		keyFrameIndex = sk.keyFrames.length - 1;
+
+		for(; keyFrameIndex >= 0; keyFrameIndex--) {
+			_fillPropForFrame(sk.keyFrames[keyFrameIndex], propList);
+		}
+	};
+
+	var _fillPropForFrame = function(frame, propList) {
+		var key;
+
+		//For each key frame iterate over all right hand properties and assign them,
+		//but only if the current key frame doesn't have the property by itself
+		for(key in propList) {
+			//The current frame misses this property, so assign it.
+			if(!hasProp.call(frame.props, key)) {
+				frame.props[key] = propList[key];
+			}
+		}
+
+		//Iterate over all props of the current frame and collect them
+		for(key in frame.props) {
+			propList[key] = frame.props[key];
+		}
+	};
+
+	/**
+	 * Calculates the new values for two given values array.
+	 */
+	var _calcInterpolation = function(val1, val2, progress) {
+		var valueIndex;
+		var val1Length = val1.length;
+
+		//They both need to have the same length
+		if(val1Length !== val2.length) {
+			throw 'Can\'t interpolate between "' + val1[0] + '" and "' + val2[0] + '"';
+		}
+
+		//Add the format string as first element.
+		var interpolated = [val1[0]];
+
+		valueIndex = 1;
+
+		for(; valueIndex < val1Length; valueIndex++) {
+			//That's the line where the two numbers are actually interpolated.
+			interpolated[valueIndex] = val1[valueIndex] + ((val2[valueIndex] - val1[valueIndex]) * progress);
+		}
+
+		return interpolated;
+	};
+
+	/**
+	 * Interpolates the numeric values into the format string.
+	 */
+	var _interpolateString = function(val) {
+		var valueIndex = 1;
+
+		rxInterpolateString.lastIndex = 0;
+
+		return val[0].replace(rxInterpolateString, function() {
+			return val[valueIndex++];
+		});
+	};
+
+	/**
+	 * Resets the class and style attribute to what it was before skrollr manipulated the element.
+	 * Also remembers the values it had before reseting, in order to undo the reset.
+	 */
+	var _reset = function(elements, undo) {
+		//We accept a single element or an array of elements.
+		elements = [].concat(elements);
+
+		var skrollable;
+		var element;
+		var elementsIndex = 0;
+		var elementsLength = elements.length;
+
+		for(; elementsIndex < elementsLength; elementsIndex++) {
+			element = elements[elementsIndex];
+			skrollable = _skrollables[element[SKROLLABLE_ID_DOM_PROPERTY]];
+
+			//Couldn't find the skrollable for this DOM element.
+			if(!skrollable) {
+				continue;
+			}
+
+			if(undo) {
+				//Reset class and style to the "dirty" (set by skrollr) values.
+				element.style.cssText = skrollable.dirtyStyleAttr;
+				_updateClass(element, skrollable.dirtyClassAttr);
+			} else {
+				//Remember the "dirty" (set by skrollr) class and style.
+				skrollable.dirtyStyleAttr = element.style.cssText;
+				skrollable.dirtyClassAttr = _getClass(element);
+
+				//Reset class and style to what it originally was.
+				element.style.cssText = skrollable.styleAttr;
+				_updateClass(element, skrollable.classAttr);
+			}
+		}
+	};
+
+	/**
+	 * Detects support for 3d transforms by applying it to the skrollr-body.
+	 */
+	var _detect3DTransforms = function() {
+		_translateZ = 'translateZ(0)';
+		skrollr.setStyle(_skrollrBody, 'transform', _translateZ);
+
+		var computedStyle = getStyle(_skrollrBody);
+		var computedTransform = computedStyle.getPropertyValue('transform');
+		var computedTransformWithPrefix = computedStyle.getPropertyValue(theDashedCSSPrefix + 'transform');
+		var has3D = (computedTransform && computedTransform !== 'none') || (computedTransformWithPrefix && computedTransformWithPrefix !== 'none');
+
+		if(!has3D) {
+			_translateZ = '';
+		}
+	};
+
+	/**
+	 * Set the CSS property on the given element. Sets prefixed properties as well.
+	 */
+	skrollr.setStyle = function(el, prop, val) {
+		var style = el.style;
+
+		//Camel case.
+		prop = prop.replace(rxCamelCase, rxCamelCaseFn).replace('-', '');
+
+		//Make sure z-index gets a <integer>.
+		//This is the only <integer> case we need to handle.
+		if(prop === 'zIndex') {
+			if(isNaN(val)) {
+				//If it's not a number, don't touch it.
+				//It could for example be "auto" (#351).
+				style[prop] = val;
+			} else {
+				//Floor the number.
+				style[prop] = '' + (val | 0);
+			}
+		}
+		//#64: "float" can't be set across browsers. Needs to use "cssFloat" for all except IE.
+		else if(prop === 'float') {
+			style.styleFloat = style.cssFloat = val;
+		}
+		else {
+			//Need try-catch for old IE.
+			try {
+				//Set prefixed property if there's a prefix.
+				if(theCSSPrefix) {
+					style[theCSSPrefix + prop.slice(0,1).toUpperCase() + prop.slice(1)] = val;
+				}
+
+				//Set unprefixed.
+				style[prop] = val;
+			} catch(ignore) {}
+		}
+	};
+
+	/**
+	 * Cross browser event handling.
+	 */
+	var _addEvent = skrollr.addEvent = function(element, names, callback) {
+		var intermediate = function(e) {
+			//Normalize IE event stuff.
+			e = e || window.event;
+
+			if(!e.target) {
+				e.target = e.srcElement;
+			}
+
+			if(!e.preventDefault) {
+				e.preventDefault = function() {
+					e.returnValue = false;
+					e.defaultPrevented = true;
+				};
+			}
+
+			return callback.call(this, e);
+		};
+
+		names = names.split(' ');
+
+		var name;
+		var nameCounter = 0;
+		var namesLength = names.length;
+
+		for(; nameCounter < namesLength; nameCounter++) {
+			name = names[nameCounter];
+
+			if(element.addEventListener) {
+				element.addEventListener(name, callback, false);
+			} else {
+				element.attachEvent('on' + name, intermediate);
+			}
+
+			//Remember the events to be able to flush them later.
+			_registeredEvents.push({
+				element: element,
+				name: name,
+				listener: callback
+			});
+		}
+	};
+
+	var _removeEvent = skrollr.removeEvent = function(element, names, callback) {
+		names = names.split(' ');
+
+		var nameCounter = 0;
+		var namesLength = names.length;
+
+		for(; nameCounter < namesLength; nameCounter++) {
+			if(element.removeEventListener) {
+				element.removeEventListener(names[nameCounter], callback, false);
+			} else {
+				element.detachEvent('on' + names[nameCounter], callback);
+			}
+		}
+	};
+
+	var _removeAllEvents = function() {
+		var eventData;
+		var eventCounter = 0;
+		var eventsLength = _registeredEvents.length;
+
+		for(; eventCounter < eventsLength; eventCounter++) {
+			eventData = _registeredEvents[eventCounter];
+
+			_removeEvent(eventData.element, eventData.name, eventData.listener);
+		}
+
+		_registeredEvents = [];
+	};
+
+	var _emitEvent = function(element, name, direction) {
+		if(_listeners.keyframe) {
+			_listeners.keyframe.call(_instance, element, name, direction);
+		}
+	};
+
+	var _reflow = function() {
+		var pos = _instance.getScrollTop();
+
+		//Will be recalculated by _updateDependentKeyFrames.
+		_maxKeyFrame = 0;
+
+		if(_forceHeight && !_isMobile) {
+			//un-"force" the height to not mess with the calculations in _updateDependentKeyFrames (#216).
+			body.style.height = '';
+		}
+
+		_updateDependentKeyFrames();
+
+		if(_forceHeight && !_isMobile) {
+			//"force" the height.
+			body.style.height = (_maxKeyFrame + documentElement.clientHeight) + 'px';
+		}
+
+		//The scroll offset may now be larger than needed (on desktop the browser/os prevents scrolling farther than the bottom).
+		if(_isMobile) {
+			_instance.setScrollTop(Math.min(_instance.getScrollTop(), _maxKeyFrame));
+		} else {
+			//Remember and reset the scroll pos (#217).
+			_instance.setScrollTop(pos, true);
+		}
+
+		_forceRender = true;
+	};
+
+	/*
+	 * Returns a copy of the constants object where all functions and strings have been evaluated.
+	 */
+	var _processConstants = function() {
+		var viewportHeight = documentElement.clientHeight;
+		var copy = {};
+		var prop;
+		var value;
+
+		for(prop in _constants) {
+			value = _constants[prop];
+
+			if(typeof value === 'function') {
+				value = value.call(_instance);
+			}
+			//Percentage offset.
+			else if((/p$/).test(value)) {
+				value = (value.slice(0, -1) / 100) * viewportHeight;
+			}
+
+			copy[prop] = value;
+		}
+
+		return copy;
+	};
+
+	/*
+	 * Returns the height of the document.
+	 */
+	var _getDocumentHeight = function() {
+		var skrollrBodyHeight = 0;
+		var bodyHeight;
+
+		if(_skrollrBody) {
+			skrollrBodyHeight = Math.max(_skrollrBody.offsetHeight, _skrollrBody.scrollHeight);
+		}
+
+		bodyHeight = Math.max(skrollrBodyHeight, body.scrollHeight, body.offsetHeight, documentElement.scrollHeight, documentElement.offsetHeight, documentElement.clientHeight);
+
+		return bodyHeight - documentElement.clientHeight;
+	};
+
+	/**
+	 * Returns a string of space separated classnames for the current element.
+	 * Works with SVG as well.
+	 */
+	var _getClass = function(element) {
+		var prop = 'className';
+
+		//SVG support by using className.baseVal instead of just className.
+		if(window.SVGElement && element instanceof window.SVGElement) {
+			element = element[prop];
+			prop = 'baseVal';
+		}
+
+		return element[prop];
+	};
+
+	/**
+	 * Adds and removes a CSS classes.
+	 * Works with SVG as well.
+	 * add and remove are arrays of strings,
+	 * or if remove is ommited add is a string and overwrites all classes.
+	 */
+	var _updateClass = function(element, add, remove) {
+		var prop = 'className';
+
+		//SVG support by using className.baseVal instead of just className.
+		if(window.SVGElement && element instanceof window.SVGElement) {
+			element = element[prop];
+			prop = 'baseVal';
+		}
+
+		//When remove is ommited, we want to overwrite/set the classes.
+		if(remove === undefined) {
+			element[prop] = add;
+			return;
+		}
+
+		//Cache current classes. We will work on a string before passing back to DOM.
+		var val = element[prop];
+
+		//All classes to be removed.
+		var classRemoveIndex = 0;
+		var removeLength = remove.length;
+
+		for(; classRemoveIndex < removeLength; classRemoveIndex++) {
+			val = _untrim(val).replace(_untrim(remove[classRemoveIndex]), ' ');
+		}
+
+		val = _trim(val);
+
+		//All classes to be added.
+		var classAddIndex = 0;
+		var addLength = add.length;
+
+		for(; classAddIndex < addLength; classAddIndex++) {
+			//Only add if el not already has class.
+			if(_untrim(val).indexOf(_untrim(add[classAddIndex])) === -1) {
+				val += ' ' + add[classAddIndex];
+			}
+		}
+
+		element[prop] = _trim(val);
+	};
+
+	var _trim = function(a) {
+		return a.replace(rxTrim, '');
+	};
+
+	/**
+	 * Adds a space before and after the string.
+	 */
+	var _untrim = function(a) {
+		return ' ' + a + ' ';
+	};
+
+	var _now = Date.now || function() {
+		return +new Date();
+	};
+
+	var _keyFrameComparator = function(a, b) {
+		return a.frame - b.frame;
+	};
+
+	/*
+	 * Private variables.
+	 */
+
+	//Singleton
+	var _instance;
+
+	/*
+		A list of all elements which should be animated associated with their the metadata.
+		Exmaple skrollable with two key frames animating from 100px width to 20px:
+
+		skrollable = {
+			element: <the DOM element>,
+			styleAttr: <style attribute of the element before skrollr>,
+			classAttr: <class attribute of the element before skrollr>,
+			keyFrames: [
+				{
+					frame: 100,
+					props: {
+						width: {
+							value: ['{?}px', 100],
+							easing: <reference to easing function>
+						}
+					},
+					mode: "absolute"
+				},
+				{
+					frame: 200,
+					props: {
+						width: {
+							value: ['{?}px', 20],
+							easing: <reference to easing function>
+						}
+					},
+					mode: "absolute"
+				}
+			]
+		};
+	*/
+	var _skrollables;
+
+	var _skrollrBody;
+
+	var _listeners;
+	var _forceHeight;
+	var _maxKeyFrame = 0;
+
+	var _scale = 1;
+	var _constants;
+
+	var _mobileDeceleration;
+
+	//Current direction (up/down).
+	var _direction = 'down';
+
+	//The last top offset value. Needed to determine direction.
+	var _lastTop = -1;
+
+	//The last time we called the render method (doesn't mean we rendered!).
+	var _lastRenderCall = _now();
+
+	//For detecting if it actually resized (#271).
+	var _lastViewportWidth = 0;
+	var _lastViewportHeight = 0;
+
+	var _requestReflow = false;
+
+	//Will contain data about a running scrollbar animation, if any.
+	var _scrollAnimation;
+
+	var _smoothScrollingEnabled;
+
+	var _smoothScrollingDuration;
+
+	//Will contain settins for smooth scrolling if enabled.
+	var _smoothScrolling;
+
+	//Can be set by any operation/event to force rendering even if the scrollbar didn't move.
+	var _forceRender;
+
+	//Each skrollable gets an unique ID incremented for each skrollable.
+	//The ID is the index in the _skrollables array.
+	var _skrollableIdCounter = 0;
+
+	var _edgeStrategy;
+
+
+	//Mobile specific vars. Will be stripped by UglifyJS when not in use.
+	var _isMobile = false;
+
+	//The virtual scroll offset when using mobile scrolling.
+	var _mobileOffset = 0;
+
+	//If the browser supports 3d transforms, this will be filled with 'translateZ(0)' (empty string otherwise).
+	var _translateZ;
+
+	//Will contain data about registered events by skrollr.
+	var _registeredEvents = [];
+
+	//Animation frame id returned by RequestAnimationFrame (or timeout when RAF is not supported).
+	var _animFrame;
+
+	//Expose skrollr as either a global variable or a require.js module.
+	if(typeof define === 'function' && define.amd) {
+		define([], function () {
+			return skrollr;
+		});
+	} else if (typeof module !== 'undefined' && module.exports) {
+		module.exports = skrollr;
+	} else {
+		window.skrollr = skrollr;
+	}
+
+}(window, document));

+ 130 - 69
sites/all/themes/gui/materiobasetheme/css/styles.css

@@ -10722,93 +10722,93 @@ body.home-v2 #center {
   padding: 0;
 }
 
-/* line 2792, ../scss/styles.scss */
+/* line 2798, ../scss/styles.scss */
 #home-v2 h2 {
   font-size: 2.1em;
   font-weight: 300;
 }
-/* line 2793, ../scss/styles.scss */
+/* line 2799, ../scss/styles.scss */
 #home-v2 a {
   color: #000;
 }
-/* line 2795, ../scss/styles.scss */
+/* line 2801, ../scss/styles.scss */
 #home-v2 .panel-separator {
   clear: both;
 }
-/* line 2801, ../scss/styles.scss */
+/* line 2805, ../scss/styles.scss */
 #home-v2 > .panel-panel > div > .panel-pane.pane-node {
   border-radius: 5px;
   background-clip: padding-box;
   overflow: hidden;
 }
-/* line 2804, ../scss/styles.scss */
+/* line 2808, ../scss/styles.scss */
 #home-v2 > .panel-panel > div > .panel-pane.pane-node .pane-content, #home-v2 > .panel-panel > div > .panel-pane.pane-node .node {
   position: relative;
   width: 100%;
   height: 100%;
   overflow: hidden;
 }
-/* line 2808, ../scss/styles.scss */
+/* line 2812, ../scss/styles.scss */
 #home-v2 > .panel-panel > div > .panel-pane.pane-node .links a {
   background-color: rgba(255, 255, 255, 0.7);
   border-radius: 5px;
   background-clip: padding-box;
   padding: 15px;
 }
-/* line 2815, ../scss/styles.scss */
+/* line 2818, ../scss/styles.scss */
 #home-v2 > .panel-panel > div > .panel-pane.intro-video {
   height: auto;
   background-color: #f7f8f2;
   margin-top: 0;
   padding-top: 0;
 }
-/* line 2820, ../scss/styles.scss */
+/* line 2823, ../scss/styles.scss */
 #home-v2 > .panel-panel > div > .panel-pane.intro-video .field-name-field-emvideo .embedded-video {
   margin: 0 auto;
 }
 @media only screen and (max-width: 40em) {
-  /* line 2820, ../scss/styles.scss */
+  /* line 2823, ../scss/styles.scss */
   #home-v2 > .panel-panel > div > .panel-pane.intro-video .field-name-field-emvideo .embedded-video {
     width: 320px;
     height: 180px;
   }
 }
 @media only screen and (min-width: 40.063em) and (max-width: 64em) {
-  /* line 2820, ../scss/styles.scss */
+  /* line 2823, ../scss/styles.scss */
   #home-v2 > .panel-panel > div > .panel-pane.intro-video .field-name-field-emvideo .embedded-video {
     width: 640px;
     height: 360px;
   }
 }
 @media only screen and (min-width: 64.063em) and (max-width: 90em) {
-  /* line 2820, ../scss/styles.scss */
+  /* line 2823, ../scss/styles.scss */
   #home-v2 > .panel-panel > div > .panel-pane.intro-video .field-name-field-emvideo .embedded-video {
     width: 800px;
     height: 450px;
   }
 }
 @media only screen and (min-width: 90.063em) {
-  /* line 2820, ../scss/styles.scss */
+  /* line 2823, ../scss/styles.scss */
   #home-v2 > .panel-panel > div > .panel-pane.intro-video .field-name-field-emvideo .embedded-video {
     width: 1024px;
     height: 576px;
   }
 }
-/* line 2834, ../scss/styles.scss */
+/* line 2837, ../scss/styles.scss */
 #home-v2 > .panel-panel > div > .panel-pane.intro-video .field-name-field-emvideo .embedded-video .player, #home-v2 > .panel-panel > div > .panel-pane.intro-video .field-name-field-emvideo .embedded-video iframe {
   width: 100%;
   height: 100%;
 }
-/* line 2840, ../scss/styles.scss */
+/* line 2843, ../scss/styles.scss */
 #home-v2 > .panel-panel > div > .panel-pane.intro-video .field-name-title-field {
   display: none;
 }
-/* line 2844, ../scss/styles.scss */
+/* line 2847, ../scss/styles.scss */
 #home-v2 > .panel-panel > div > .panel-pane.intro-video .field-name-body {
   margin-top: 1em;
   text-align: center;
 }
-/* line 2848, ../scss/styles.scss */
+/* line 2851, ../scss/styles.scss */
 #home-v2 > .panel-panel > div > .panel-pane.intro-video .field-name-body p {
   text-align: left;
   display: moz-inline-stack;
@@ -10820,16 +10820,16 @@ body.home-v2 #center {
   margin-left: 2%;
   font-size: 0.756em;
 }
-/* line 2859, ../scss/styles.scss */
+/* line 2860, ../scss/styles.scss */
 #home-v2 > .panel-panel > div > .panel-pane.pane-menu-menu-home-v2 {
   margin: 2em 0;
 }
-/* line 2861, ../scss/styles.scss */
+/* line 2862, ../scss/styles.scss */
 #home-v2 > .panel-panel > div > .panel-pane.pane-menu-menu-home-v2 ul.menu {
   margin: 0px;
   text-align: center;
 }
-/* line 2864, ../scss/styles.scss */
+/* line 2865, ../scss/styles.scss */
 #home-v2 > .panel-panel > div > .panel-pane.pane-menu-menu-home-v2 li {
   margin: 0 1em 0 0;
   padding: 0px;
@@ -10840,7 +10840,7 @@ body.home-v2 #center {
   zoom: 1;
   *display: inline;
 }
-/* line 2867, ../scss/styles.scss */
+/* line 2868, ../scss/styles.scss */
 #home-v2 > .panel-panel > div > .panel-pane.pane-menu-menu-home-v2 li a {
   background-color: #4d4d4d;
   border-radius: 5px;
@@ -10852,74 +10852,81 @@ body.home-v2 #center {
   -webkit-transition: opacity,background-color 0.2s ease-out;
           transition: opacity,background-color 0.2s ease-out;
 }
-/* line 2879, ../scss/styles.scss */
+/* line 2880, ../scss/styles.scss */
 #home-v2 > .panel-panel > div > .panel-pane.pane-menu-menu-home-v2 li:nth-child(1):hover a {
   background-color: #ff7400;
   color: #4d4d4d;
 }
-/* line 2883, ../scss/styles.scss */
+/* line 2884, ../scss/styles.scss */
 #home-v2 > .panel-panel > div > .panel-pane.pane-menu-menu-home-v2 li:nth-child(2):hover a {
   background-color: #79e644;
   color: #4d4d4d;
 }
-/* line 2887, ../scss/styles.scss */
+/* line 2888, ../scss/styles.scss */
 #home-v2 > .panel-panel > div > .panel-pane.pane-menu-menu-home-v2 li:nth-child(3):hover a {
   background-color: #69cdcf;
   color: #4d4d4d;
 }
-/* line 2891, ../scss/styles.scss */
+/* line 2892, ../scss/styles.scss */
 #home-v2 > .panel-panel > div > .panel-pane.pane-menu-menu-home-v2 li:nth-child(4):hover a {
   background-color: #e6de1c;
   color: #4d4d4d;
 }
-/* line 2895, ../scss/styles.scss */
+/* line 2896, ../scss/styles.scss */
 #home-v2 > .panel-panel > div > .panel-pane.pane-menu-menu-home-v2 li:nth-child(5):hover a {
   background-color: #d476ae;
   color: #4d4d4d;
 }
-/* line 2899, ../scss/styles.scss */
+/* line 2900, ../scss/styles.scss */
 #home-v2 > .panel-panel > div > .panel-pane.pane-menu-menu-home-v2 li:nth-child(6):hover a {
   background-color: #772e88;
   color: #4d4d4d;
 }
-/* line 2903, ../scss/styles.scss */
+/* line 2904, ../scss/styles.scss */
 #home-v2 > .panel-panel > div > .panel-pane.pane-menu-menu-home-v2 li:nth-child(7):hover a {
   background-color: #e62326;
   color: #4d4d4d;
 }
 /* line 2908, ../scss/styles.scss */
 #home-v2 > .panel-panel > div > .panel-pane.showroom {
+  box-shadow: 0 0 5px rgba(0, 0, 0, 0.2);
+  -webkit-transition: box-shadow 0.3s ease-out;
+          transition: box-shadow 0.3s ease-out;
   height: 450px;
   margin-top: 15px;
   background-color: #fff;
   background-size: cover;
   position: relative;
 }
-/* line 2915, ../scss/styles.scss */
+/* line 2793, ../scss/styles.scss */
+#home-v2 > .panel-panel > div > .panel-pane.showroom:hover {
+  box-shadow: 0 0 5px rgba(0, 0, 0, 0.4);
+}
+/* line 2916, ../scss/styles.scss */
 #home-v2 > .panel-panel > div > .panel-pane.showroom .pane-content {
   width: 100%;
   height: 100%;
   position: relative;
 }
-/* line 2917, ../scss/styles.scss */
+/* line 2918, ../scss/styles.scss */
 #home-v2 > .panel-panel > div > .panel-pane.showroom .pane-content .node {
   position: absolute;
   height: 100%;
   width: 100%;
 }
-/* line 2918, ../scss/styles.scss */
+/* line 2919, ../scss/styles.scss */
 #home-v2 > .panel-panel > div > .panel-pane.showroom .pane-content .field-name-field-bandeau {
   position: absolute;
   width: 100%;
   height: 100%;
   overflow: hidden;
 }
-/* line 2920, ../scss/styles.scss */
+/* line 2921, ../scss/styles.scss */
 #home-v2 > .panel-panel > div > .panel-pane.showroom .pane-content .field-name-field-bandeau img {
   width: 100%;
   margin-top: -10%;
 }
-/* line 2922, ../scss/styles.scss */
+/* line 2923, ../scss/styles.scss */
 #home-v2 > .panel-panel > div > .panel-pane.showroom .pane-content .group-content {
   position: relative;
   z-index: 2;
@@ -10930,16 +10937,16 @@ body.home-v2 #center {
   border-radius: 5px;
   background-clip: padding-box;
 }
-/* line 2930, ../scss/styles.scss */
+/* line 2931, ../scss/styles.scss */
 #home-v2 > .panel-panel > div > .panel-pane.showroom .pane-content .group-content .field-name-title-field {
   font-size: 2.1em;
   font-weight: 300;
 }
-/* line 2933, ../scss/styles.scss */
+/* line 2934, ../scss/styles.scss */
 #home-v2 > .panel-panel > div > .panel-pane.showroom .pane-content .group-content .field-name-body {
   margin-top: 1em;
 }
-/* line 2941, ../scss/styles.scss */
+/* line 2942, ../scss/styles.scss */
 #home-v2 > .panel-panel > div > .panel-pane.showroom:after {
   content: url("../img/bulle.png");
   -webkit-transform: scale(0.8);
@@ -10950,18 +10957,25 @@ body.home-v2 #center {
   right: -80px;
   z-index: 10;
 }
-/* line 2950, ../scss/styles.scss */
+/* line 2951, ../scss/styles.scss */
 #home-v2 > .panel-panel > div > .panel-pane.bdd {
+  box-shadow: 0 0 5px rgba(0, 0, 0, 0.2);
+  -webkit-transition: box-shadow 0.3s ease-out;
+          transition: box-shadow 0.3s ease-out;
   height: 450px;
   margin-top: 30px;
   background-color: #FFF;
   position: relative;
 }
-/* line 2955, ../scss/styles.scss */
+/* line 2793, ../scss/styles.scss */
+#home-v2 > .panel-panel > div > .panel-pane.bdd:hover {
+  box-shadow: 0 0 5px rgba(0, 0, 0, 0.4);
+}
+/* line 2957, ../scss/styles.scss */
 #home-v2 > .panel-panel > div > .panel-pane.bdd .links a {
   background-color: #e6e6e6;
 }
-/* line 2957, ../scss/styles.scss */
+/* line 2959, ../scss/styles.scss */
 #home-v2 > .panel-panel > div > .panel-pane.bdd .field-name-field-bandeau {
   display: moz-inline-stack;
   display: inline-block;
@@ -10970,7 +10984,7 @@ body.home-v2 #center {
   *display: inline;
   width: 60%;
 }
-/* line 2960, ../scss/styles.scss */
+/* line 2962, ../scss/styles.scss */
 #home-v2 > .panel-panel > div > .panel-pane.bdd .group-content {
   display: moz-inline-stack;
   display: inline-block;
@@ -10983,16 +10997,16 @@ body.home-v2 #center {
   border-radius: 5px;
   background-clip: padding-box;
 }
-/* line 2965, ../scss/styles.scss */
+/* line 2967, ../scss/styles.scss */
 #home-v2 > .panel-panel > div > .panel-pane.bdd .group-content .field-name-title-field {
   font-size: 2.1em;
   font-weight: 300;
 }
-/* line 2968, ../scss/styles.scss */
+/* line 2970, ../scss/styles.scss */
 #home-v2 > .panel-panel > div > .panel-pane.bdd .group-content .field-name-body {
   margin-top: 1em;
 }
-/* line 2973, ../scss/styles.scss */
+/* line 2975, ../scss/styles.scss */
 #home-v2 > .panel-panel > div > .panel-pane.bdd:after {
   content: url("../img/boule.png");
   -webkit-transform: scale(0.8);
@@ -11002,24 +11016,31 @@ body.home-v2 #center {
   bottom: -50px;
   left: -50px;
 }
-/* line 2981, ../scss/styles.scss */
+/* line 2983, ../scss/styles.scss */
 #home-v2 > .panel-panel > div > .panel-pane.formations {
+  box-shadow: 0 0 5px rgba(0, 0, 0, 0.2);
+  -webkit-transition: box-shadow 0.3s ease-out;
+          transition: box-shadow 0.3s ease-out;
   position: relative;
   height: 300px;
   margin-top: 30px;
   background-color: #000;
   color: #FFF;
 }
-/* line 2987, ../scss/styles.scss */
+/* line 2793, ../scss/styles.scss */
+#home-v2 > .panel-panel > div > .panel-pane.formations:hover {
+  box-shadow: 0 0 5px rgba(0, 0, 0, 0.4);
+}
+/* line 2990, ../scss/styles.scss */
 #home-v2 > .panel-panel > div > .panel-pane.formations a {
   color: #FFF;
 }
-/* line 2989, ../scss/styles.scss */
+/* line 2992, ../scss/styles.scss */
 #home-v2 > .panel-panel > div > .panel-pane.formations .node {
   padding: 0 0 0 30%;
   width: 70%;
 }
-/* line 2992, ../scss/styles.scss */
+/* line 2995, ../scss/styles.scss */
 #home-v2 > .panel-panel > div > .panel-pane.formations .node:before {
   content: " ";
   background: transparent url("../img/formations.png") no-repeat center center;
@@ -11031,32 +11052,39 @@ body.home-v2 #center {
   width: 30%;
   height: 100%;
 }
-/* line 3005, ../scss/styles.scss */
+/* line 3008, ../scss/styles.scss */
 #home-v2 > .panel-panel > div > .panel-pane.formations .group-content {
   padding: 1em;
   position: relative;
 }
-/* line 3007, ../scss/styles.scss */
+/* line 3010, ../scss/styles.scss */
 #home-v2 > .panel-panel > div > .panel-pane.formations .group-content .field-name-title-field {
   font-size: 2.1em;
   font-weight: 300;
 }
-/* line 3010, ../scss/styles.scss */
+/* line 3013, ../scss/styles.scss */
 #home-v2 > .panel-panel > div > .panel-pane.formations .group-content .field-name-body {
   margin-top: 1em;
 }
-/* line 3015, ../scss/styles.scss */
+/* line 3018, ../scss/styles.scss */
 #home-v2 > .panel-panel > div > .panel-pane.services {
+  box-shadow: 0 0 5px rgba(0, 0, 0, 0.2);
+  -webkit-transition: box-shadow 0.3s ease-out;
+          transition: box-shadow 0.3s ease-out;
   background-color: #FFF;
   height: 300px;
   margin-top: 30px;
 }
-/* line 3020, ../scss/styles.scss */
+/* line 2793, ../scss/styles.scss */
+#home-v2 > .panel-panel > div > .panel-pane.services:hover {
+  box-shadow: 0 0 5px rgba(0, 0, 0, 0.4);
+}
+/* line 3024, ../scss/styles.scss */
 #home-v2 > .panel-panel > div > .panel-pane.services .node {
   padding: 0 30% 0 0;
   width: 70%;
 }
-/* line 3023, ../scss/styles.scss */
+/* line 3027, ../scss/styles.scss */
 #home-v2 > .panel-panel > div > .panel-pane.services .node:before {
   content: " ";
   background: transparent url("../img/services.png") no-repeat center center;
@@ -11068,21 +11096,54 @@ body.home-v2 #center {
   width: 30%;
   height: 100%;
 }
-/* line 3036, ../scss/styles.scss */
+/* line 3040, ../scss/styles.scss */
 #home-v2 > .panel-panel > div > .panel-pane.services .group-content {
   padding: 1em;
   position: relative;
 }
-/* line 3038, ../scss/styles.scss */
+/* line 3042, ../scss/styles.scss */
 #home-v2 > .panel-panel > div > .panel-pane.services .group-content .field-name-title-field {
   font-size: 2.1em;
   font-weight: 300;
 }
-/* line 3041, ../scss/styles.scss */
+/* line 3045, ../scss/styles.scss */
 #home-v2 > .panel-panel > div > .panel-pane.services .group-content .field-name-body {
   margin-top: 1em;
 }
-/* line 3048, ../scss/styles.scss */
+/* line 3051, ../scss/styles.scss */
+#home-v2 > .panel-panel > div > .panel-pane.publication {
+  box-shadow: 0 0 5px rgba(0, 0, 0, 0.2);
+  -webkit-transition: box-shadow 0.3s ease-out;
+          transition: box-shadow 0.3s ease-out;
+  position: relative;
+  margin-top: 30px;
+  padding: 1em;
+  background-color: #000;
+  border-radius: 10px;
+  background-clip: padding-box;
+}
+/* line 2793, ../scss/styles.scss */
+#home-v2 > .panel-panel > div > .panel-pane.publication:hover {
+  box-shadow: 0 0 5px rgba(0, 0, 0, 0.4);
+}
+/* line 3058, ../scss/styles.scss */
+#home-v2 > .panel-panel > div > .panel-pane.publication, #home-v2 > .panel-panel > div > .panel-pane.publication a, #home-v2 > .panel-panel > div > .panel-pane.publication h1, #home-v2 > .panel-panel > div > .panel-pane.publication h2 {
+  color: #fff;
+}
+/* line 3062, ../scss/styles.scss */
+#home-v2 > .panel-panel > div > .panel-pane.publication .view-publication-home-v2 .views-row {
+  display: moz-inline-stack;
+  display: inline-block;
+  vertical-align: top;
+  zoom: 1;
+  *display: inline;
+  width: 30%;
+}
+/* line 3065, ../scss/styles.scss */
+#home-v2 > .panel-panel > div > .panel-pane.publication .view-publication-home-v2 .views-row h1 {
+  display: none;
+}
+/* line 3071, ../scss/styles.scss */
 #home-v2 > .panel-panel > div > .pane-news-home-v2 {
   background-color: #e6e6e6;
   border-radius: 10px;
@@ -11091,11 +11152,11 @@ body.home-v2 #center {
   padding-top: 1em;
   position: relative;
 }
-/* line 3055, ../scss/styles.scss */
+/* line 3078, ../scss/styles.scss */
 #home-v2 > .panel-panel > div > .pane-news-home-v2 h2 {
   font-size: 30px;
 }
-/* line 3057, ../scss/styles.scss */
+/* line 3080, ../scss/styles.scss */
 #home-v2 > .panel-panel > div > .pane-news-home-v2 #mini-panel-news_home_v2 .center-wrapper {
   width: 100%;
   margin-left: auto;
@@ -11113,29 +11174,29 @@ body.home-v2 #center {
 #home-v2 > .panel-panel > div > .pane-news-home-v2 #mini-panel-news_home_v2 .center-wrapper:after {
   clear: both;
 }
-/* line 3059, ../scss/styles.scss */
+/* line 3082, ../scss/styles.scss */
 #home-v2 > .panel-panel > div > .pane-news-home-v2 #mini-panel-news_home_v2 .center-wrapper .panel-panel {
   overflow: hidden;
 }
-/* line 3061, ../scss/styles.scss */
+/* line 3084, ../scss/styles.scss */
 #home-v2 > .panel-panel > div > .pane-news-home-v2 #mini-panel-news_home_v2 .center-wrapper .panel-panel .inside {
   margin: 0;
 }
-/* line 3063, ../scss/styles.scss */
+/* line 3086, ../scss/styles.scss */
 #home-v2 > .panel-panel > div > .pane-news-home-v2 #mini-panel-news_home_v2 .center-wrapper .panel-col-first {
   padding-left: 0.9375rem;
   padding-right: 0.9375rem;
   width: 58.33333%;
   float: left;
 }
-/* line 3064, ../scss/styles.scss */
+/* line 3087, ../scss/styles.scss */
 #home-v2 > .panel-panel > div > .pane-news-home-v2 #mini-panel-news_home_v2 .center-wrapper .panel-col-last {
   padding-left: 0.9375rem;
   padding-right: 0.9375rem;
   width: 33.33333%;
   float: left;
 }
-/* line 3066, ../scss/styles.scss */
+/* line 3089, ../scss/styles.scss */
 #home-v2 > .panel-panel > div > .pane-news-home-v2 #mini-panel-news_home_v2 .panel-col-bottom {
   width: 100%;
   margin-left: auto;
@@ -11155,14 +11216,14 @@ body.home-v2 #center {
 #home-v2 > .panel-panel > div > .pane-news-home-v2 #mini-panel-news_home_v2 .panel-col-bottom:after {
   clear: both;
 }
-/* line 3068, ../scss/styles.scss */
+/* line 3091, ../scss/styles.scss */
 #home-v2 > .panel-panel > div > .pane-news-home-v2 #mini-panel-news_home_v2 .panel-col-bottom > .inside {
   padding-left: 0.9375rem;
   padding-right: 0.9375rem;
   width: 100%;
   float: left;
 }
-/* line 3074, ../scss/styles.scss */
+/* line 3097, ../scss/styles.scss */
 #home-v2 > .panel-panel > div > .pane-news-home-v2 .view-news-home-v2 .views-row {
   display: moz-inline-stack;
   display: inline-block;
@@ -11170,7 +11231,7 @@ body.home-v2 #center {
   zoom: 1;
   *display: inline;
 }
-/* line 3076, ../scss/styles.scss */
+/* line 3099, ../scss/styles.scss */
 #home-v2 > .panel-panel > div > .pane-news-home-v2 .node-simplenews {
   border-radius: 5px;
   background-clip: padding-box;
@@ -11182,7 +11243,7 @@ body.home-v2 #center {
   position: relative;
   margin: 7px;
 }
-/* line 3083, ../scss/styles.scss */
+/* line 3106, ../scss/styles.scss */
 #home-v2 > .panel-panel > div > .pane-news-home-v2 .node-simplenews > a {
   position: absolute;
   bottom: 0;
@@ -11190,13 +11251,13 @@ body.home-v2 #center {
   background-color: #FFF;
   text-align: center;
 }
-/* line 3088, ../scss/styles.scss */
+/* line 3111, ../scss/styles.scss */
 #home-v2 > .panel-panel > div > .pane-news-home-v2 .node-simplenews > a h1 {
   padding: 10px;
   margin: 0;
   font-size: 1em;
 }
-/* line 3097, ../scss/styles.scss */
+/* line 3120, ../scss/styles.scss */
 #home-v2 > .panel-panel > div > .pane-news-home-v2:after {
   content: url("../img/point.png");
   position: absolute;

+ 1 - 1
sites/all/themes/gui/materiobasetheme/inc/template.theme-overrides.inc

@@ -268,7 +268,7 @@ function materiobasetheme_image_style($variables) {
 
   $figure = '<figure style="'.$fig_dimensions.'" ' . (isset($variables['title']) ? 'title="'.$variables['title'].'"' : '') . '>';
   // lazyload
-  $excluded_styles = array('pdf', 'card-bookmark', 'content_full', 'content_teaser', 'didactique_page');
+  $excluded_styles = array('pdf', 'card-bookmark', 'content_full', 'content_teaser', 'didactique_page', 'publications-home');
   if(!in_array($variables['style_name'], $excluded_styles) && ( (isset($variables['delta']) && $variables['delta'] > 0) || !isset($variables['delta']) ) ){
 
     // store the real path

+ 22 - 0
sites/all/themes/gui/materiobasetheme/js/script.js

@@ -38,6 +38,7 @@
         _strings = _themeSettings.strings,
         _History = window.History,
         _this = this,
+        _$body = $('body'),
         _$content = $('#content'),
         _jsp,
         _$tooltip = $('<div id="tooltip" class="op-hidden">').appendTo('body'),
@@ -49,6 +50,8 @@
         translate3d_content = 0,
         _isLoggedIn = !$('body').is('.not-logged-in'),
         _isFrontNotLogged = $('body').is('.front.not-logged-in'),
+        _isFrontHomeV2 = _$body.is('.home-v2'),
+        _skrollr,
         _isMembershipForm = $('body').is('.page-node-11186'), //$('body').is('.page-node-11187') || ,
         // _isBreveMateriauNodePage = $('body').is('.node-type-breve') || $('body').is('.node-type-materiau');
         _isBreveMateriauNodePage = _themeSettings.page_callback == 'node_page_view' && (_themeSettings.node_type == 'materiau' || _themeSettings.node_type == 'breve'),
@@ -81,6 +84,9 @@
       if(_isFrontNotLogged)
         initHome();
 
+      if(_isFrontHomeV2)
+        initHomeV2();
+
       if(_isMembershipForm)
         initMembershipForm();
 
@@ -276,6 +282,22 @@
       }, 15000);
     };
 
+    /**
+    * home v2
+    */
+    function initHomeV2(){
+      console.log('initHomeV2');
+      $('.panel-pane.showroom .group-content', '#home-v2')
+        .attr('data-0', 'transform:translateX(-40em);')
+        .attr('data-500', 'transform:translateX(0);');
+
+      $('.panel-pane.database .group-content', '#home-v2')
+        .attr('data-550', 'transform:translateX(40em);')
+        .attr('data-900', 'transform:translateX(0em);');
+
+      _skrollr = skrollr.init();
+    };
+
     /**
     * layout
     */

+ 1 - 0
sites/all/themes/gui/materiobasetheme/materiobasetheme.info

@@ -25,6 +25,7 @@ scripts[] = "bower_components/history.js/scripts/bundled/html4+html5/jquery.hist
 scripts[] = "bower_components/jquery.hotkeys/jquery.hotkeys.js"
 scripts[] = "bower_components/jquery.columnizer/src/jquery.columnizer.min.js"
 scripts[] = "bower_components/jquery.lazyload/jquery.lazyload.js"
+scripts[] = "bower_components/skrollr/dist/skrollr.min.js"
 scripts[] = "js/script.js"
 
 

+ 32 - 6
sites/all/themes/gui/materiobasetheme/scss/styles.scss

@@ -2787,6 +2787,12 @@ body.home-v2{
   }
 }
 
+@mixin shaddowed(){
+  @include drop-shadow(0, 0, 5px, 0.2);
+  @include transition-simply-prefix(box-shadow 0.3s ease-out); // opacity 0.3s ease-out); //change this commas
+  &:hover{@include drop-shadow(0, 0, 5px, 0.4);}
+}
+
 #home-v2{
   // padding: 40px 40px;
   h2{font-size: 2.1em; font-weight: 300;}
@@ -2796,8 +2802,6 @@ body.home-v2{
   >.panel-panel>div>.panel-pane {
     // padding: 10px 15px;
 
-
-
     &.pane-node{
       @include rounded(5px);
       overflow:hidden;
@@ -2811,7 +2815,6 @@ body.home-v2{
         padding: 15px;
       }
     }
-
     &.intro-video{
       height:auto;
       background-color: #f7f8f2;
@@ -2853,9 +2856,7 @@ body.home-v2{
           font-size:0.756em;
         }
       }
-
     }
-
     &.pane-menu-menu-home-v2{
       margin:2em 0;
       ul.menu{
@@ -2904,8 +2905,8 @@ body.home-v2{
        }
       }
     }
-
     &.showroom{
+      @include shaddowed();
       height:450px;
       margin-top: 15px;
       background-color: #fff;
@@ -2948,6 +2949,7 @@ body.home-v2{
       }
     }
     &.bdd{
+      @include shaddowed();
       height:450px;
       margin-top: 30px;
       background-color: #FFF;
@@ -2979,6 +2981,7 @@ body.home-v2{
       }
     }
     &.formations{
+      @include shaddowed();
       position: relative;
       height:300px;
       margin-top: 30px;
@@ -3013,6 +3016,7 @@ body.home-v2{
       }
     }
     &.services{
+      @include shaddowed();
       background-color: #FFF;
       height:300px;
       margin-top: 30px;
@@ -3043,6 +3047,25 @@ body.home-v2{
         }
       }
     }
+
+    &.publication{
+      @include shaddowed();
+      position: relative;
+      // height:300px;
+      margin-top: 30px;
+      padding:1em;
+      background-color: #000;
+      &, a, h1, h2{color: #fff;}
+      @include rounded(10px);
+      .view-publication-home-v2{
+
+        .views-row{
+          @include inlineblock();
+          width:30%;
+          h1{display:none;}
+        }
+      }
+    }
   }
   //mini panneau news
   >.panel-panel>div>.pane-news-home-v2{
@@ -3102,6 +3125,9 @@ body.home-v2{
       right: 0px;
     }
   }
+
+
+
 }
 
 

Some files were not shown because too many files changed in this diff