Browse Source

added publications and some skrollr animations to home v2

Bachir Soussi Chiadmi 9 năm trước cách đây
mục cha
commit
e12a664fa5
54 tập tin đã thay đổi với 3756 bổ sung78 xóa
  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']);
+};

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 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.

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 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"
+  ]
+}

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 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>

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 48 - 0
sites/all/themes/gui/materiobasetheme/bower_components/skrollr/examples/anchor_target.html


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 50 - 0
sites/all/themes/gui/materiobasetheme/bower_components/skrollr/examples/anchors.html


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 33 - 0
sites/all/themes/gui/materiobasetheme/bower_components/skrollr/examples/bg_constant_speed_less.html


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 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>

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 177 - 0
sites/all/themes/gui/materiobasetheme/bower_components/skrollr/examples/classic.html


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 23 - 0
sites/all/themes/gui/materiobasetheme/bower_components/skrollr/examples/docu/1.html


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 23 - 0
sites/all/themes/gui/materiobasetheme/bower_components/skrollr/examples/docu/2.html


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 23 - 0
sites/all/themes/gui/materiobasetheme/bower_components/skrollr/examples/docu/3.html


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 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;
+}

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 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


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 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;
+}

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 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;
+			}
+		}
+	});
+});

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 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;
     }
   }
+
+
+
 }
 
 

Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác