scrollreveal-rails 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ ZWNiOTY0ZGU4MTBjODA3YmEyYjFiYTRlYTdmMDBkZjc4MzM4YjIwZg==
5
+ data.tar.gz: !binary |-
6
+ NGNhYTA4ZGJjMzVjYzI0ZjJlODUxNWFlYzExOGM4MmJiODY0YjJmYw==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ MWE2MzhjM2JkOTMzNTllMjkwOTQ2N2U4OTY2NjlkMGRmZTU3NmE1NDY0ZWZk
10
+ YjNkYzYyNjQ2YjNkMTZkZGY0NzA4YjllMjMyOWE4NTdjMTY0NTc5YmM1Mjkz
11
+ YWE4MWU0ODViYTY0NWRlODJlNjgxYjU3Mzc0MGE3Yjg4NTMyYzk=
12
+ data.tar.gz: !binary |-
13
+ MGRmNTNjMDAwZTVhZGFmMTdiODQ3ZGUzMWY3NTkwZmI2OGM0MjcyYzJiZDhm
14
+ NzU0NTlkODNhNDAwN2NmNzhkMjFlMTgzYzI4ZTNlNTQ4NGYzOThmMjcyMDQ4
15
+ ZjAzNTM4Nzg3MTYwNmM5YTFjYTEwNzViMzEzMDQxYzJkMjlhNDk=
@@ -0,0 +1,7 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
5
+ sauce
6
+ tmp
7
+ .DS_Store
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+ - 2.0.0
@@ -0,0 +1,4 @@
1
+ # 0.0.1 / 2013-11-10
2
+
3
+ Scrollreveal gearing up!
4
+
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source "http://rubygems.org"
2
+ gemspec
@@ -0,0 +1,5 @@
1
+ require 'bundler/gem_tasks'
2
+
3
+ task :default do
4
+ puts "Hello scrollreveal-rails!"
5
+ end
@@ -0,0 +1,134 @@
1
+ # Scrollreveal-Rails
2
+
3
+ A Ruby wrapper to integrate [scrollReveal](https://github.com/julianlloyd/scrollReveal.js) - A small library to create and maintain how elements fade in, triggered when they enter the viewport.
4
+
5
+
6
+ See the [demo application](http://fast-waters-6745.herokuapp.com) in action.
7
+ ## Installation
8
+
9
+ Add the gem to the Gemfile:
10
+
11
+ gem "scrollreveal-rails"
12
+
13
+ ## Usage
14
+
15
+ Add ScrollReveal to your JS
16
+ Append the following lines to your app/assets/javascripts/application.js file:
17
+
18
+ //= require scrollReveal
19
+
20
+ $(function() {
21
+ window.scrollReveal = new scrollReveal();
22
+ });
23
+
24
+
25
+ Basic Usage
26
+ -----------
27
+
28
+ In your view `*.html.erb` or `*.html.haml`
29
+
30
+ <!-- Reveal using defaults. -->
31
+ scroll_reveal content: 'Holla!'
32
+
33
+ **But wait!** It’s more fun if you define your own reveal animation parameters, which you can do using using natural, declarative language:
34
+
35
+ <!-- Reveal using custom parameters. -->
36
+ scroll_reveal content: 'Foo', animation: 'enter left and move 50px over 1.33s'
37
+ scroll_reveal content: 'Bar', animation: 'enter from the bottom after 1s'
38
+ scroll_reveal content: 'Baz' animation: 'wait 2.5s and then ease-in-out 100px'
39
+
40
+ Getting Started
41
+ ---------------
42
+ What you enter into the `data-scrollReveal` attribute is parsed for specific words:
43
+
44
+ - **keywords** that expect to be followed by a **value**.<br><br>
45
+ - **fillers** as natural language sugar. (optional)
46
+
47
+ #### Keywords and Values
48
+ These specific **keyword** / **value** pairs allow you to describe basic reveal animation behavior.
49
+ ***
50
+ **keyword:** `enter` — Controls the vector origin of your reveal animation.<br>
51
+ **value:** `top` | `right` | `bottom` | `left`<br><br>
52
+ *Example:*
53
+
54
+ <!-- Reveal your element with a downward motion. -->
55
+
56
+ scroll_reveal content: 'Foo', animation: 'enter top'
57
+
58
+ ***
59
+ **keyword:** `move` — The distance your revealing element travels.<br>
60
+ **value:** [ integer ]px.
61
+
62
+ *Example:*
63
+
64
+ scroll_reveal content: 'Foo', animation: 'move 24px'
65
+
66
+ ***
67
+ **keyword:** `over` — The duration of your reveal animation.<br>
68
+ **value:** [ decimal ]s
69
+
70
+
71
+ *Example:*
72
+
73
+ scroll_reveal content: 'Foo', animation: 'over 1.66s'
74
+
75
+ ***
76
+ **keyword:** `after/wait` — The duration before your reveal begins.<br>
77
+ **value:** [ decimal ]s
78
+
79
+
80
+ *Example:*
81
+
82
+ <!-- Both are accepted. -->
83
+
84
+ scroll_reveal content: 'Mel', animation: 'after 0.33s'
85
+ scroll_reveal content: 'Mel', animation: 'wait 0.33s'
86
+
87
+ ####Combining Keyword/Value Pairs
88
+ You can easily combine the above pairs to create more dynamic reveal animations.
89
+
90
+ *Example:*
91
+
92
+ scroll_reveal content: 'Foo', animation: 'enter top move 50px'
93
+ scroll_reveal content: 'Bar', animation: 'enter top move 50px, after 0.3s'
94
+ scroll_reveal content: 'Baz', animation: 'enter top move 50px, after 0.6s'
95
+ scroll_reveal content: 'Mel', animation: 'enter top move 50px, after 0.9s'
96
+
97
+ ####Passing Blocks
98
+ You can easily pass a block too.
99
+
100
+ *Example:*
101
+
102
+ scroll_reveal animation: 'enter top move 50px' do
103
+ image_tag 'foo.jpg'
104
+ end
105
+
106
+
107
+ #### Fillers (optional)
108
+ You can use conjoining filler words for more readable language.
109
+
110
+ - `from`
111
+ - `the`
112
+ - `and`
113
+ - `then`
114
+ - `but`
115
+ - `with`
116
+ - `,`
117
+
118
+ *Example*:
119
+
120
+ <!-- These 4 lines are equivalent. -->
121
+
122
+ scroll_reveal content: 'Foo', animation: 'wait 0.3s, then enter left and move 40px over 2s'
123
+ scroll_reveal content: 'Bar', animation: 'enter from the left after 0.3s, move 40px, over 2s'
124
+ scroll_reveal content: 'Baz', animation: 'enter left move 40px over 2s after 0.3s'
125
+ scroll_reveal content: 'Mel', animation: 'enter left, move 40px, over 2s, wait 0.3s'
126
+
127
+
128
+ ## Licensing
129
+
130
+
131
+ The gem itself is released under the MIT license
132
+
133
+ :pray:
134
+
@@ -0,0 +1,358 @@
1
+ /*
2
+ _ _ _____ _ _
3
+ | | | __ \ | | (_)
4
+ ___ ___ _ __ ___ | | | |__) |_____ _____ __ _| | _ ___
5
+ / __|/ __| '__/ _ \| | | _ // _ \ \ / / _ \/ _` | | | / __|
6
+ \__ \ (__| | | (_) | | | | \ \ __/\ V / __/ (_| | |_| \__ \
7
+ |___/\___|_| \___/|_|_|_| \_\___| \_/ \___|\__,_|_(_) |___/ v.0.0.2
8
+ _/ |
9
+ |__/
10
+
11
+ "Declarative on-scroll reveal animations."
12
+
13
+ /*=============================================================================
14
+
15
+ scrollReveal.js was inspired by cbpScroller.js (c) 2014 Codrops.
16
+
17
+ Licensed under the MIT license.
18
+ http://www.opensource.org/licenses/mit-license.php
19
+
20
+ scrollReveal.js (c) 2014 Julian Lloyd
21
+
22
+ =============================================================================*/
23
+
24
+ window.scrollReveal = (function (window) {
25
+
26
+ 'use strict';
27
+
28
+ function scrollReveal(options) {
29
+
30
+ this.docElem = window.document.documentElement;
31
+ this.options = this.extend(this.defaults, options);
32
+
33
+ if (this.options.init == true) this.init();
34
+ }
35
+
36
+ scrollReveal.prototype = {
37
+
38
+ defaults: {
39
+ after: '0s',
40
+ enter: 'bottom',
41
+ move: '24px',
42
+ over: '0.66s',
43
+ easing: 'ease-in-out',
44
+
45
+ // if 0, the element is considered in the viewport as soon as it enters
46
+ // if 1, the element is considered in the viewport when it's fully visible
47
+ viewportFactor: 0.33,
48
+
49
+ // if false, animations occur only once
50
+ // if true, animations occur each time an element enters the viewport
51
+ reset: false,
52
+
53
+ // if true, scrollReveal.init() is automaticaly called upon instantiation
54
+ init: true
55
+ },
56
+
57
+ /*=============================================================================*/
58
+
59
+ init: function () {
60
+
61
+ this.scrolled = false;
62
+
63
+ var self = this;
64
+
65
+ // Check DOM for the data-scrollReveal attribute
66
+ // and initialize all found elements.
67
+ this.elems = Array.prototype.slice.call(this.docElem.querySelectorAll('[data-scrollReveal]'));
68
+ this.elems.forEach(function (el, i) {
69
+ self.update(el);
70
+ });
71
+
72
+ var scrollHandler = function () {
73
+ if (!self.scrolled) {
74
+ self.scrolled = true;
75
+ setTimeout(function () {
76
+ self._scrollPage();
77
+ }, 60);
78
+ }
79
+ };
80
+
81
+ var resizeHandler = function () {
82
+
83
+ // If we’re still waiting for settimeout, reset the timer.
84
+ if (self.resizeTimeout) {
85
+ clearTimeout(self.resizeTimeout);
86
+ }
87
+ function delayed() {
88
+ self._scrollPage();
89
+ self.resizeTimeout = null;
90
+ }
91
+ self.resizeTimeout = setTimeout(delayed, 200);
92
+ };
93
+
94
+ window.addEventListener('scroll', scrollHandler, false);
95
+ window.addEventListener('resize', resizeHandler, false);
96
+ },
97
+
98
+ /*=============================================================================*/
99
+
100
+ _scrollPage: function () {
101
+ var self = this;
102
+
103
+ this.elems.forEach(function (el, i) {
104
+ self.update(el);
105
+ });
106
+ this.scrolled = false;
107
+ },
108
+
109
+ /*=============================================================================*/
110
+
111
+ parseLanguage: function (el) {
112
+
113
+ // Splits on a sequence of one or more commas or spaces.
114
+ var words = el.getAttribute('data-scrollreveal').split(/[, ]+/),
115
+ parsed = {};
116
+
117
+ function filter (words) {
118
+ var ret = [],
119
+
120
+ blacklist = [
121
+ "from",
122
+ "the",
123
+ "and",
124
+ "then",
125
+ "but",
126
+ "with"
127
+ ];
128
+
129
+ words.forEach(function (word, i) {
130
+ if (blacklist.indexOf(word) > -1) {
131
+ return;
132
+ }
133
+ ret.push(word);
134
+ });
135
+
136
+ return ret;
137
+ }
138
+
139
+ words = filter(words);
140
+
141
+ words.forEach(function (word, i) {
142
+
143
+ switch (word) {
144
+ case "enter":
145
+ parsed.enter = words[i + 1];
146
+ return;
147
+
148
+ case "after":
149
+ parsed.after = words[i + 1];
150
+ return;
151
+
152
+ case "wait":
153
+ parsed.after = words[i + 1];
154
+ return;
155
+
156
+ case "move":
157
+ parsed.move = words[i + 1];
158
+ return;
159
+
160
+ case "ease":
161
+ parsed.move = words[i + 1];
162
+ parsed.ease = "ease";
163
+ return;
164
+
165
+ case "ease-in":
166
+ parsed.move = words[i + 1];
167
+ parsed.easing = "ease-in";
168
+ return;
169
+
170
+ case "ease-in-out":
171
+ parsed.move = words[i + 1];
172
+ parsed.easing = "ease-in-out";
173
+ return;
174
+
175
+ case "ease-out":
176
+ parsed.move = words[i + 1];
177
+ parsed.easing = "ease-out";
178
+ return;
179
+
180
+ case "over":
181
+ parsed.over = words[i + 1];
182
+ return;
183
+
184
+ default:
185
+ return;
186
+ }
187
+ });
188
+
189
+ return parsed;
190
+ },
191
+
192
+
193
+ /*=============================================================================*/
194
+
195
+ update: function (el) {
196
+ var css = this.genCSS(el);
197
+
198
+ if (!el.getAttribute('data-scrollReveal-initialized')) {
199
+ el.setAttribute('style', css.initial);
200
+ el.setAttribute('data-scrollReveal-initialized', true);
201
+ }
202
+
203
+ if (!this.isElementInViewport(el, this.options.viewportFactor)) {
204
+ if (this.options.reset) {
205
+ el.setAttribute('style', css.initial + css.reset);
206
+ }
207
+ return;
208
+ }
209
+
210
+ if (el.getAttribute('data-scrollReveal-complete')) return;
211
+
212
+ if (this.isElementInViewport(el, this.options.viewportFactor)) {
213
+ el.setAttribute('style', css.target + css.transition);
214
+ // Without reset enabled, we can safely remove the style tag
215
+ // to prevent CSS specificy wars with authored CSS.
216
+ if (!this.options.reset) {
217
+ setTimeout(function () {
218
+ el.removeAttribute('style');
219
+ el.setAttribute('data-scrollReveal-complete',true);
220
+ }, css.totalDuration);
221
+ }
222
+ return;
223
+ }
224
+ },
225
+
226
+ /*=============================================================================*/
227
+
228
+ genCSS: function (el) {
229
+ var parsed = this.parseLanguage(el),
230
+ enter,
231
+ axis;
232
+
233
+ if (parsed.enter) {
234
+
235
+ if (parsed.enter == "top" || parsed.enter == "bottom") {
236
+ enter = parsed.enter;
237
+ axis = "y";
238
+ }
239
+
240
+ if (parsed.enter == "left" || parsed.enter == "right") {
241
+ enter = parsed.enter;
242
+ axis = "x";
243
+ }
244
+
245
+ } else {
246
+
247
+ if (this.options.enter == "top" || this.options.enter == "bottom") {
248
+ enter = this.options.enter
249
+ axis = "y";
250
+ }
251
+
252
+ if (this.options.enter == "left" || this.options.enter == "right") {
253
+ enter = this.options.enter
254
+ axis = "x";
255
+ }
256
+ }
257
+
258
+ // After all values are parsed, let’s make sure our our
259
+ // pixel distance is negative for top and left entrances.
260
+ //
261
+ // ie. "move 25px from top" starts at 'top: -25px' in CSS.
262
+
263
+ if (enter == "top" || enter == "left") {
264
+ if (!typeof parsed.move == "undefined") {
265
+ parsed.move = "-" + parsed.move;
266
+ }
267
+ else {
268
+ parsed.move = "-" + this.options.move;
269
+ }
270
+ }
271
+
272
+ var dist = parsed.move || this.options.move,
273
+ dur = parsed.over || this.options.over,
274
+ delay = parsed.after || this.options.after,
275
+ easing = parsed.easing || this.options.easing;
276
+
277
+ var transition = "-webkit-transition: all " + dur + " " + easing + " " + delay + ";" +
278
+ "-moz-transition: all " + dur + " " + easing + " " + delay + ";" +
279
+ "-o-transition: all " + dur + " " + easing + " " + delay + ";" +
280
+ "transition: all " + dur + " " + easing + " " + delay + ";" +
281
+ "-webkit-perspective: 1000;" +
282
+ "-webkit-backface-visibility: hidden;";
283
+
284
+ // The same as transition, but removing the delay for elements fading out.
285
+ var reset = "-webkit-transition: all " + dur + " " + easing + " 0s;" +
286
+ "-moz-transition: all " + dur + " " + easing + " 0s;" +
287
+ "-o-transition: all " + dur + " " + easing + " 0s;" +
288
+ "transition: all " + dur + " " + easing + " 0s;" +
289
+ "-webkit-perspective: 1000;" +
290
+ "-webkit-backface-visibility: hidden;";
291
+
292
+ var initial = "-webkit-transform: translate" + axis + "(" + dist + ");" +
293
+ "-moz-transform: translate" + axis + "(" + dist + ");" +
294
+ "transform: translate" + axis + "(" + dist + ");" +
295
+ "opacity: 0;";
296
+
297
+ var target = "-webkit-transform: translate" + axis + "(0);" +
298
+ "-moz-transform: translate" + axis + "(0);" +
299
+ "transform: translate" + axis + "(0);" +
300
+ "opacity: 1;";
301
+ return {
302
+ transition: transition,
303
+ initial: initial,
304
+ target: target,
305
+ reset: reset,
306
+ totalDuration: ((parseFloat(dur) + parseFloat(delay)) * 1000)
307
+ };
308
+ },
309
+
310
+ getViewportH : function () {
311
+ var client = this.docElem['clientHeight'],
312
+ inner = window['innerHeight'];
313
+
314
+ return (client < inner) ? inner : client;
315
+ },
316
+
317
+ getOffset : function(el) {
318
+ var offsetTop = 0,
319
+ offsetLeft = 0;
320
+
321
+ do {
322
+ if (!isNaN(el.offsetTop)) {
323
+ offsetTop += el.offsetTop;
324
+ }
325
+ if (!isNaN(el.offsetLeft)) {
326
+ offsetLeft += el.offsetLeft;
327
+ }
328
+ } while (el = el.offsetParent)
329
+
330
+ return {
331
+ top: offsetTop,
332
+ left: offsetLeft
333
+ }
334
+ },
335
+
336
+ isElementInViewport : function(el, h) {
337
+ var scrolled = window.pageYOffset,
338
+ viewed = scrolled + this.getViewportH(),
339
+ elH = el.offsetHeight,
340
+ elTop = this.getOffset(el).top,
341
+ elBottom = elTop + elH,
342
+ h = h || 0;
343
+
344
+ return (elTop + elH * h) <= viewed && (elBottom) >= scrolled;
345
+ },
346
+
347
+ extend: function (a, b){
348
+ for (var key in b) {
349
+ if (b.hasOwnProperty(key)) {
350
+ a[key] = b[key];
351
+ }
352
+ }
353
+ return a;
354
+ }
355
+ }; // end scrollReveal.prototype
356
+
357
+ return scrollReveal;
358
+ })(window);
@@ -0,0 +1,5 @@
1
+ require 'scrollreveal/version'
2
+ require 'scrollreveal/rails'
3
+ require 'scrollreveal/helper'
4
+
5
+ ActionView::Base.send(:include, Scrollreveal::Helper)
@@ -0,0 +1,9 @@
1
+ module Scrollreveal
2
+ module Helper
3
+
4
+ def scroll_reveal(opts={},&block)
5
+ content_tag(:div,opts[:content],'data-scrollReveal' => opts[:animation],:class => opts[:class],&block)
6
+ end
7
+ end
8
+ end
9
+
@@ -0,0 +1,9 @@
1
+ module Scrollreveal
2
+ module Rails
3
+ class Engine < ::Rails::Engine
4
+ initializer "precompile", :group => :all do |app|
5
+ app.config.assets.precompile << Proc.new{|path| path == "scrollReveal.js" }
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,3 @@
1
+ module Scrollreveal
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,25 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "scrollreveal/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "scrollreveal-rails"
7
+ s.version = Scrollreveal::VERSION
8
+ s.authors = ["Ankit Gupta"," Ekta Verma"]
9
+ s.date = '2014-02-23'
10
+ s.email = ["ankit.gupta8898@gmail.com","eku4evr@gmail.com"]
11
+ s.summary = %q{Ruby Wrapper on top of ScrollReveal.js}
12
+ s.description = %q{Gem that includes ScrollReveal (A small library to create and maintain how elements fade in,triggered when they enter the viewport.)}
13
+
14
+ s.files = `git ls-files`.split("\n")
15
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
16
+
17
+ s.require_paths = ["lib"]
18
+ s.licenses = ['MIT']
19
+ s.homepage = 'https://github.com/gemathon-rockets/scrollreveal-rails'
20
+ s.add_dependency "railties", ">= 3.1"
21
+ s.add_development_dependency "bundler", "~> 1.0"
22
+ s.add_development_dependency "rails", ">= 3.1"
23
+ s.add_development_dependency 'rake'
24
+
25
+ end
metadata ADDED
@@ -0,0 +1,115 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: scrollreveal-rails
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Ankit Gupta
8
+ - ! ' Ekta Verma'
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2014-02-23 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: railties
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ! '>='
19
+ - !ruby/object:Gem::Version
20
+ version: '3.1'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ! '>='
26
+ - !ruby/object:Gem::Version
27
+ version: '3.1'
28
+ - !ruby/object:Gem::Dependency
29
+ name: bundler
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ~>
33
+ - !ruby/object:Gem::Version
34
+ version: '1.0'
35
+ type: :development
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ~>
40
+ - !ruby/object:Gem::Version
41
+ version: '1.0'
42
+ - !ruby/object:Gem::Dependency
43
+ name: rails
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ! '>='
47
+ - !ruby/object:Gem::Version
48
+ version: '3.1'
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ! '>='
54
+ - !ruby/object:Gem::Version
55
+ version: '3.1'
56
+ - !ruby/object:Gem::Dependency
57
+ name: rake
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ! '>='
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ description: Gem that includes ScrollReveal (A small library to create and maintain
71
+ how elements fade in,triggered when they enter the viewport.)
72
+ email:
73
+ - ankit.gupta8898@gmail.com
74
+ - eku4evr@gmail.com
75
+ executables: []
76
+ extensions: []
77
+ extra_rdoc_files: []
78
+ files:
79
+ - .gitignore
80
+ - .travis.yml
81
+ - Changelog.md
82
+ - Gemfile
83
+ - Rakefile
84
+ - Readme.md
85
+ - app/assets/javascripts/scrollReveal.js
86
+ - lib/scrollreveal-rails.rb
87
+ - lib/scrollreveal/helper.rb
88
+ - lib/scrollreveal/rails.rb
89
+ - lib/scrollreveal/version.rb
90
+ - scrollreveal-rails.gemspec
91
+ homepage: https://github.com/gemathon-rockets/scrollreveal-rails
92
+ licenses:
93
+ - MIT
94
+ metadata: {}
95
+ post_install_message:
96
+ rdoc_options: []
97
+ require_paths:
98
+ - lib
99
+ required_ruby_version: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ! '>='
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ required_rubygems_version: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - ! '>='
107
+ - !ruby/object:Gem::Version
108
+ version: '0'
109
+ requirements: []
110
+ rubyforge_project:
111
+ rubygems_version: 2.1.10
112
+ signing_key:
113
+ specification_version: 4
114
+ summary: Ruby Wrapper on top of ScrollReveal.js
115
+ test_files: []