spinjs-rails 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +5 -0
- data/Gemfile +4 -0
- data/README.md +57 -0
- data/Rakefile +1 -0
- data/lib/spinjs-rails/engine.rb +4 -0
- data/lib/spinjs-rails/version.rb +5 -0
- data/lib/spinjs-rails.rb +8 -0
- data/spinjs-rails.gemspec +24 -0
- data/vendor/assets/javascripts/jquery.spin.js +22 -0
- data/vendor/assets/javascripts/spin.js +295 -0
- metadata +72 -0
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
# Spin.js - spinner with no CSS, Images
|
2
|
+
|
3
|
+
Provides an easy-to-use Rails 3.1 asset for [Spin.js](http://fgnass.github.com/spin.js/)
|
4
|
+
|
5
|
+
# Install
|
6
|
+
|
7
|
+
Add it to your Rails application's `Gemfile`:
|
8
|
+
|
9
|
+
```ruby
|
10
|
+
gem 'spinjs-rails'
|
11
|
+
```
|
12
|
+
|
13
|
+
Then `bundle install`.
|
14
|
+
|
15
|
+
|
16
|
+
# Usage
|
17
|
+
|
18
|
+
Require `spin`:
|
19
|
+
|
20
|
+
|
21
|
+
```javascript
|
22
|
+
// application.js
|
23
|
+
// require spin
|
24
|
+
```
|
25
|
+
|
26
|
+
or as jQuery plugin:
|
27
|
+
|
28
|
+
```javascript
|
29
|
+
// application.js
|
30
|
+
// require jquery.spin
|
31
|
+
|
32
|
+
// Then you can:
|
33
|
+
|
34
|
+
$(".abc").spin(); // Shows the default spinner
|
35
|
+
$(".abc").spin(false); // Hide the spinner
|
36
|
+
|
37
|
+
// Show customised spinner:
|
38
|
+
$(".abc").spin({
|
39
|
+
lines: 12, // The number of lines to draw
|
40
|
+
length: 7, // The length of each line
|
41
|
+
width: 9, // The line thickness
|
42
|
+
radius: 30, // The radius of the inner circle
|
43
|
+
color: '#000', // #rgb or #rrggbb
|
44
|
+
speed: 1, // Rounds per second
|
45
|
+
trail: 60, // Afterglow percentage
|
46
|
+
shadow: false // Whether to render a shadow
|
47
|
+
});
|
48
|
+
```
|
49
|
+
|
50
|
+
|
51
|
+
See the full usage details at on the [spin.js](http://fgnass.github.com/spin.js/) site
|
52
|
+
|
53
|
+
|
54
|
+
# License
|
55
|
+
|
56
|
+
[MIT](http://www.opensource.org/licenses/mit-license.php) by [@dnagir](https://twitter.com/#!/dnagir).
|
57
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/lib/spinjs-rails.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "spinjs-rails/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "spinjs-rails"
|
7
|
+
s.version = Spinjs::Rails::VERSION
|
8
|
+
s.authors = ["Dmytrii Nagirniak"]
|
9
|
+
s.email = ["dnagir@gmail.com"]
|
10
|
+
s.homepage = "https://github.com/dnagir/spinjs-rails"
|
11
|
+
s.summary = %q{A spinning activity indicator for Rails 3 with no images and CSS.}
|
12
|
+
s.description = %q{An animated CSS3 loading spinner with VML fallback for IE.}
|
13
|
+
|
14
|
+
s.rubyforge_project = "spinjs-rails"
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
+
s.require_paths = ["lib"]
|
20
|
+
|
21
|
+
s.add_runtime_dependency "rails", ">= 3.1"
|
22
|
+
# s.add_development_dependency "rspec"
|
23
|
+
# s.add_runtime_dependency "rest-client"
|
24
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
// require jquery
|
2
|
+
// require spin
|
3
|
+
|
4
|
+
(function($) {
|
5
|
+
|
6
|
+
$.fn.spin = function(opts) {
|
7
|
+
this.each(function() {
|
8
|
+
var $this = $(this),
|
9
|
+
data = $this.data();
|
10
|
+
|
11
|
+
if (data.spinner) {
|
12
|
+
data.spinner.stop();
|
13
|
+
delete data.spinner;
|
14
|
+
}
|
15
|
+
if (opts !== false) {
|
16
|
+
data.spinner = new Spinner($.extend({color: $this.css('color')}, opts)).spin(this);
|
17
|
+
}
|
18
|
+
});
|
19
|
+
return this;
|
20
|
+
};
|
21
|
+
|
22
|
+
})(jQuery);
|
@@ -0,0 +1,295 @@
|
|
1
|
+
//fgnass.github.com/spin.js#v1.2.2
|
2
|
+
(function(window, document, undefined) {
|
3
|
+
|
4
|
+
/**
|
5
|
+
* Copyright (c) 2011 Felix Gnass [fgnass at neteye dot de]
|
6
|
+
* Licensed under the MIT license
|
7
|
+
*/
|
8
|
+
|
9
|
+
var prefixes = ['webkit', 'Moz', 'ms', 'O'], /* Vendor prefixes */
|
10
|
+
animations = {}, /* Animation rules keyed by their name */
|
11
|
+
useCssAnimations;
|
12
|
+
|
13
|
+
/**
|
14
|
+
* Utility function to create elements. If no tag name is given,
|
15
|
+
* a DIV is created. Optionally properties can be passed.
|
16
|
+
*/
|
17
|
+
function createEl(tag, prop) {
|
18
|
+
var el = document.createElement(tag || 'div'),
|
19
|
+
n;
|
20
|
+
|
21
|
+
for(n in prop) {
|
22
|
+
el[n] = prop[n];
|
23
|
+
}
|
24
|
+
return el;
|
25
|
+
}
|
26
|
+
|
27
|
+
/**
|
28
|
+
* Inserts child1 before child2. If child2 is not specified,
|
29
|
+
* child1 is appended. If child2 has no parentNode, child2 is
|
30
|
+
* appended first.
|
31
|
+
*/
|
32
|
+
function ins(parent, child1, child2) {
|
33
|
+
if(child2 && !child2.parentNode) ins(parent, child2);
|
34
|
+
parent.insertBefore(child1, child2||null);
|
35
|
+
return parent;
|
36
|
+
}
|
37
|
+
|
38
|
+
/**
|
39
|
+
* Insert a new stylesheet to hold the @keyframe or VML rules.
|
40
|
+
*/
|
41
|
+
var sheet = (function() {
|
42
|
+
var el = createEl('style');
|
43
|
+
ins(document.getElementsByTagName('head')[0], el);
|
44
|
+
return el.sheet || el.styleSheet;
|
45
|
+
})();
|
46
|
+
|
47
|
+
/**
|
48
|
+
* Creates an opacity keyframe animation rule and returns its name.
|
49
|
+
* Since most mobile Webkits have timing issues with animation-delay,
|
50
|
+
* we create separate rules for each line/segment.
|
51
|
+
*/
|
52
|
+
function addAnimation(alpha, trail, i, lines) {
|
53
|
+
var name = ['opacity', trail, ~~(alpha*100), i, lines].join('-'),
|
54
|
+
start = 0.01 + i/lines*100,
|
55
|
+
z = Math.max(1-(1-alpha)/trail*(100-start) , alpha),
|
56
|
+
prefix = useCssAnimations.substring(0, useCssAnimations.indexOf('Animation')).toLowerCase(),
|
57
|
+
pre = prefix && '-'+prefix+'-' || '';
|
58
|
+
|
59
|
+
if (!animations[name]) {
|
60
|
+
sheet.insertRule(
|
61
|
+
'@' + pre + 'keyframes ' + name + '{' +
|
62
|
+
'0%{opacity:'+z+'}' +
|
63
|
+
start + '%{opacity:'+ alpha + '}' +
|
64
|
+
(start+0.01) + '%{opacity:1}' +
|
65
|
+
(start+trail)%100 + '%{opacity:'+ alpha + '}' +
|
66
|
+
'100%{opacity:'+ z + '}' +
|
67
|
+
'}', 0);
|
68
|
+
animations[name] = 1;
|
69
|
+
}
|
70
|
+
return name;
|
71
|
+
}
|
72
|
+
|
73
|
+
/**
|
74
|
+
* Tries various vendor prefixes and returns the first supported property.
|
75
|
+
**/
|
76
|
+
function vendor(el, prop) {
|
77
|
+
var s = el.style,
|
78
|
+
pp,
|
79
|
+
i;
|
80
|
+
|
81
|
+
if(s[prop] !== undefined) return prop;
|
82
|
+
prop = prop.charAt(0).toUpperCase() + prop.slice(1);
|
83
|
+
for(i=0; i<prefixes.length; i++) {
|
84
|
+
pp = prefixes[i]+prop;
|
85
|
+
if(s[pp] !== undefined) return pp;
|
86
|
+
}
|
87
|
+
}
|
88
|
+
|
89
|
+
/**
|
90
|
+
* Sets multiple style properties at once.
|
91
|
+
*/
|
92
|
+
function css(el, prop) {
|
93
|
+
for (var n in prop) {
|
94
|
+
el.style[vendor(el, n)||n] = prop[n];
|
95
|
+
}
|
96
|
+
return el;
|
97
|
+
}
|
98
|
+
|
99
|
+
/**
|
100
|
+
* Fills in default values.
|
101
|
+
*/
|
102
|
+
function merge(obj) {
|
103
|
+
for (var i=1; i < arguments.length; i++) {
|
104
|
+
var def = arguments[i];
|
105
|
+
for (var n in def) {
|
106
|
+
if (obj[n] === undefined) obj[n] = def[n];
|
107
|
+
}
|
108
|
+
}
|
109
|
+
return obj;
|
110
|
+
}
|
111
|
+
|
112
|
+
/**
|
113
|
+
* Returns the absolute page-offset of the given element.
|
114
|
+
*/
|
115
|
+
function pos(el) {
|
116
|
+
var o = {x:el.offsetLeft, y:el.offsetTop};
|
117
|
+
while((el = el.offsetParent)) {
|
118
|
+
o.x+=el.offsetLeft;
|
119
|
+
o.y+=el.offsetTop;
|
120
|
+
}
|
121
|
+
return o;
|
122
|
+
}
|
123
|
+
|
124
|
+
/** The constructor */
|
125
|
+
var Spinner = function Spinner(o) {
|
126
|
+
if (!this.spin) return new Spinner(o);
|
127
|
+
this.opts = merge(o || {}, Spinner.defaults, defaults);
|
128
|
+
},
|
129
|
+
defaults = Spinner.defaults = {
|
130
|
+
lines: 12, // The number of lines to draw
|
131
|
+
length: 7, // The length of each line
|
132
|
+
width: 5, // The line thickness
|
133
|
+
radius: 10, // The radius of the inner circle
|
134
|
+
color: '#000', // #rgb or #rrggbb
|
135
|
+
speed: 1, // Rounds per second
|
136
|
+
trail: 100, // Afterglow percentage
|
137
|
+
opacity: 1/4,
|
138
|
+
fps: 20
|
139
|
+
},
|
140
|
+
proto = Spinner.prototype = {
|
141
|
+
spin: function(target) {
|
142
|
+
this.stop();
|
143
|
+
var self = this,
|
144
|
+
el = self.el = css(createEl(), {position: 'relative'}),
|
145
|
+
ep, // element position
|
146
|
+
tp; // target position
|
147
|
+
|
148
|
+
if (target) {
|
149
|
+
tp = pos(ins(target, el, target.firstChild));
|
150
|
+
ep = pos(el);
|
151
|
+
css(el, {
|
152
|
+
left: (target.offsetWidth >> 1) - ep.x+tp.x + 'px',
|
153
|
+
top: (target.offsetHeight >> 1) - ep.y+tp.y + 'px'
|
154
|
+
});
|
155
|
+
}
|
156
|
+
el.setAttribute('aria-role', 'progressbar');
|
157
|
+
self.lines(el, self.opts);
|
158
|
+
if (!useCssAnimations) {
|
159
|
+
// No CSS animation support, use setTimeout() instead
|
160
|
+
var o = self.opts,
|
161
|
+
i = 0,
|
162
|
+
fps = o.fps,
|
163
|
+
f = fps/o.speed,
|
164
|
+
ostep = (1-o.opacity)/(f*o.trail / 100),
|
165
|
+
astep = f/o.lines;
|
166
|
+
|
167
|
+
(function anim() {
|
168
|
+
i++;
|
169
|
+
for (var s=o.lines; s; s--) {
|
170
|
+
var alpha = Math.max(1-(i+s*astep)%f * ostep, o.opacity);
|
171
|
+
self.opacity(el, o.lines-s, alpha, o);
|
172
|
+
}
|
173
|
+
self.timeout = self.el && setTimeout(anim, ~~(1000/fps));
|
174
|
+
})();
|
175
|
+
}
|
176
|
+
return self;
|
177
|
+
},
|
178
|
+
stop: function() {
|
179
|
+
var el = this.el;
|
180
|
+
if (el) {
|
181
|
+
clearTimeout(this.timeout);
|
182
|
+
if (el.parentNode) el.parentNode.removeChild(el);
|
183
|
+
this.el = undefined;
|
184
|
+
}
|
185
|
+
return this;
|
186
|
+
}
|
187
|
+
};
|
188
|
+
proto.lines = function(el, o) {
|
189
|
+
var i = 0,
|
190
|
+
seg;
|
191
|
+
|
192
|
+
function fill(color, shadow) {
|
193
|
+
return css(createEl(), {
|
194
|
+
position: 'absolute',
|
195
|
+
width: (o.length+o.width) + 'px',
|
196
|
+
height: o.width + 'px',
|
197
|
+
background: color,
|
198
|
+
boxShadow: shadow,
|
199
|
+
transformOrigin: 'left',
|
200
|
+
transform: 'rotate(' + ~~(360/o.lines*i) + 'deg) translate(' + o.radius+'px' +',0)',
|
201
|
+
borderRadius: (o.width>>1) + 'px'
|
202
|
+
});
|
203
|
+
}
|
204
|
+
for (; i < o.lines; i++) {
|
205
|
+
seg = css(createEl(), {
|
206
|
+
position: 'absolute',
|
207
|
+
top: 1+~(o.width/2) + 'px',
|
208
|
+
transform: 'translate3d(0,0,0)',
|
209
|
+
opacity: o.opacity,
|
210
|
+
animation: useCssAnimations && addAnimation(o.opacity, o.trail, i, o.lines) + ' ' + 1/o.speed + 's linear infinite'
|
211
|
+
});
|
212
|
+
if (o.shadow) ins(seg, css(fill('#000', '0 0 4px ' + '#000'), {top: 2+'px'}));
|
213
|
+
ins(el, ins(seg, fill(o.color, '0 0 1px rgba(0,0,0,.1)')));
|
214
|
+
}
|
215
|
+
return el;
|
216
|
+
};
|
217
|
+
proto.opacity = function(el, i, val) {
|
218
|
+
if (i < el.childNodes.length) el.childNodes[i].style.opacity = val;
|
219
|
+
};
|
220
|
+
|
221
|
+
/////////////////////////////////////////////////////////////////////////
|
222
|
+
// VML rendering for IE
|
223
|
+
/////////////////////////////////////////////////////////////////////////
|
224
|
+
|
225
|
+
/**
|
226
|
+
* Check and init VML support
|
227
|
+
*/
|
228
|
+
(function() {
|
229
|
+
var s = css(createEl('group'), {behavior: 'url(#default#VML)'}),
|
230
|
+
i;
|
231
|
+
|
232
|
+
if (!vendor(s, 'transform') && s.adj) {
|
233
|
+
|
234
|
+
// VML support detected. Insert CSS rules ...
|
235
|
+
for (i=4; i--;) sheet.addRule(['group', 'roundrect', 'fill', 'stroke'][i], 'behavior:url(#default#VML)');
|
236
|
+
|
237
|
+
proto.lines = function(el, o) {
|
238
|
+
var r = o.length+o.width,
|
239
|
+
s = 2*r;
|
240
|
+
|
241
|
+
function grp() {
|
242
|
+
return css(createEl('group', {coordsize: s +' '+s, coordorigin: -r +' '+-r}), {width: s, height: s});
|
243
|
+
}
|
244
|
+
|
245
|
+
var g = grp(),
|
246
|
+
margin = ~(o.length+o.radius+o.width)+'px',
|
247
|
+
i;
|
248
|
+
|
249
|
+
function seg(i, dx, filter) {
|
250
|
+
ins(g,
|
251
|
+
ins(css(grp(), {rotation: 360 / o.lines * i + 'deg', left: ~~dx}),
|
252
|
+
ins(css(createEl('roundrect', {arcsize: 1}), {
|
253
|
+
width: r,
|
254
|
+
height: o.width,
|
255
|
+
left: o.radius,
|
256
|
+
top: -o.width>>1,
|
257
|
+
filter: filter
|
258
|
+
}),
|
259
|
+
createEl('fill', {color: o.color, opacity: o.opacity}),
|
260
|
+
createEl('stroke', {opacity: 0}) // transparent stroke to fix color bleeding upon opacity change
|
261
|
+
)
|
262
|
+
)
|
263
|
+
);
|
264
|
+
}
|
265
|
+
|
266
|
+
if (o.shadow) {
|
267
|
+
for (i = 1; i <= o.lines; i++) {
|
268
|
+
seg(i, -2, 'progid:DXImageTransform.Microsoft.Blur(pixelradius=2,makeshadow=1,shadowopacity=.3)');
|
269
|
+
}
|
270
|
+
}
|
271
|
+
for (i = 1; i <= o.lines; i++) {
|
272
|
+
seg(i);
|
273
|
+
}
|
274
|
+
return ins(css(el, {
|
275
|
+
margin: margin + ' 0 0 ' + margin,
|
276
|
+
zoom: 1
|
277
|
+
}), g);
|
278
|
+
};
|
279
|
+
proto.opacity = function(el, i, val, o) {
|
280
|
+
var c = el.firstChild;
|
281
|
+
o = o.shadow && o.lines || 0;
|
282
|
+
if (c && i+o < c.childNodes.length) {
|
283
|
+
c = c.childNodes[i+o]; c = c && c.firstChild; c = c && c.firstChild;
|
284
|
+
if (c) c.opacity = val;
|
285
|
+
}
|
286
|
+
};
|
287
|
+
}
|
288
|
+
else {
|
289
|
+
useCssAnimations = vendor(s, 'animation');
|
290
|
+
}
|
291
|
+
})();
|
292
|
+
|
293
|
+
window.Spinner = Spinner;
|
294
|
+
|
295
|
+
})(window, document);
|
metadata
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: spinjs-rails
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Dmytrii Nagirniak
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2011-12-20 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rails
|
16
|
+
requirement: &70244426089200 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '3.1'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *70244426089200
|
25
|
+
description: An animated CSS3 loading spinner with VML fallback for IE.
|
26
|
+
email:
|
27
|
+
- dnagir@gmail.com
|
28
|
+
executables: []
|
29
|
+
extensions: []
|
30
|
+
extra_rdoc_files: []
|
31
|
+
files:
|
32
|
+
- .gitignore
|
33
|
+
- Gemfile
|
34
|
+
- README.md
|
35
|
+
- Rakefile
|
36
|
+
- lib/spinjs-rails.rb
|
37
|
+
- lib/spinjs-rails/engine.rb
|
38
|
+
- lib/spinjs-rails/version.rb
|
39
|
+
- spinjs-rails.gemspec
|
40
|
+
- vendor/assets/javascripts/jquery.spin.js
|
41
|
+
- vendor/assets/javascripts/spin.js
|
42
|
+
homepage: https://github.com/dnagir/spinjs-rails
|
43
|
+
licenses: []
|
44
|
+
post_install_message:
|
45
|
+
rdoc_options: []
|
46
|
+
require_paths:
|
47
|
+
- lib
|
48
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
segments:
|
55
|
+
- 0
|
56
|
+
hash: 1031122124930786029
|
57
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
58
|
+
none: false
|
59
|
+
requirements:
|
60
|
+
- - ! '>='
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0'
|
63
|
+
segments:
|
64
|
+
- 0
|
65
|
+
hash: 1031122124930786029
|
66
|
+
requirements: []
|
67
|
+
rubyforge_project: spinjs-rails
|
68
|
+
rubygems_version: 1.8.10
|
69
|
+
signing_key:
|
70
|
+
specification_version: 3
|
71
|
+
summary: A spinning activity indicator for Rails 3 with no images and CSS.
|
72
|
+
test_files: []
|