coffeebox 0.0.3

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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: e644c896b42d51146dc5efde89a445afdbad05b3
4
+ data.tar.gz: d20b14e690c374431bb5ddc069cd1ea7ed076e6a
5
+ SHA512:
6
+ metadata.gz: 8a71d814d9c7a2e0e4a2342a664bbc3e6eb5cc4eba4b0cbf8e0b409572edc55b152690886c54d91c8bbdd4509f22f5804196f619ac1ea32f3e73c956d8110c18
7
+ data.tar.gz: def05fdf40007b4a1b64d456b448986e15fb0287f307df09ab45875007d3fe6f7f1264cd2463152ee756ce367813fc19684775611fc6feefaf8e798f4c68377d
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in rails-coffeebox.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 glebtv
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,62 @@
1
+ # Coffeebox
2
+
3
+ This is an opinionated rewrite of [Facebox](http://defunkt.github.com/facebox/).
4
+
5
+ ## Features
6
+
7
+ 1. Everything is converted to coffescript
8
+ 2. Shipped as a Rails 3.2/4.0 asset pipeline compatible gem
9
+ 3. Includes [spin.js](http://fgnass.github.io/spin.js/) instead of a gif preloader
10
+ 4. Preloads images with [imgpreload](https://github.com/farinspace/jquery.imgpreload)
11
+ 5. Built-in support for turbolinks
12
+ 6. Support for fully custom popup HTML
13
+ 7. Does not stay in DOM when closed
14
+
15
+ ## Installation
16
+
17
+ Add this line to your application's Gemfile:
18
+
19
+ gem 'coffeebox'
20
+
21
+ And then execute:
22
+
23
+ $ bundle
24
+
25
+ Or install it yourself as:
26
+
27
+ $ gem install coffeebox
28
+
29
+ ## Usage
30
+
31
+ require it in application.js
32
+
33
+ //= require coffeebox
34
+
35
+ Or require it in application.js.coffe
36
+
37
+ #= require coffeebox
38
+
39
+ and in application.css.sass:
40
+
41
+ //= require coffeebox
42
+
43
+ or (sass\scss only)
44
+
45
+ // Set some options
46
+ $facebox-background: #fff
47
+ $facebox-close-color: #000
48
+ $facebox-close-hover: #333
49
+ $facebox-close-size: 25px
50
+ $facebox-border: 3px solid rgba(0, 0, 0, 0)
51
+ $facebox-border-radius: 25px
52
+
53
+ // Then import
54
+ @import coffeebox
55
+
56
+ ## Contributing
57
+
58
+ 1. Fork it
59
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
60
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
61
+ 4. Push to the branch (`git push origin my-new-feature`)
62
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,3 @@
1
+ #= require coffeebox/spin
2
+ #= require coffeebox/imgpreload
3
+ #= require coffeebox/main
@@ -0,0 +1,50 @@
1
+ # v1.4
2
+ #Copyright (c) 2009 Dimas Begunoff, http://www.farinspace.com
3
+ #
4
+ #https://github.com/farinspace/jquery.imgpreload
5
+ #
6
+ # Licensed under the MIT:
7
+ # http://www.opensource.org/licenses/mit-license.php
8
+
9
+ unless "undefined" is typeof jQuery
10
+ (($) ->
11
+
12
+ # extend jquery (because i love jQuery)
13
+ $.imgpreload = (imgs, settings) ->
14
+ settings = $.extend({}, $.fn.imgpreload.defaults, (if (settings instanceof Function) then all: settings else settings))
15
+
16
+ # use of typeof required
17
+ # https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Operators/Special_Operators/Instanceof_Operator#Description
18
+ imgs = new Array(imgs) if "string" is typeof imgs
19
+ loaded = new Array()
20
+ $.each imgs, (i, elem) ->
21
+ img = new Image()
22
+ url = elem
23
+ img_obj = img
24
+ unless "string" is typeof elem
25
+ url = $(elem).attr("src")
26
+ img_obj = elem
27
+ $(img).bind "load error", (e) ->
28
+ loaded.push img_obj
29
+ $.data img_obj, "loaded", (if ("error" is e.type) then false else true)
30
+ settings.each.call(img_obj) if settings.each instanceof Function
31
+
32
+ # http://jsperf.com/length-in-a-variable
33
+ if loaded.length >= imgs.length and settings.all instanceof Function
34
+ settings.all.call(loaded)
35
+
36
+ $(this).unbind "load error"
37
+
38
+ img.src = url
39
+
40
+
41
+ $.fn.imgpreload = (settings) ->
42
+ $.imgpreload this, settings
43
+ this
44
+
45
+ $.fn.imgpreload.defaults =
46
+ each: null # callback invoked when each image in a group loads
47
+ all: null # callback invoked when when the entire group of images has loaded
48
+ ) jQuery
49
+
50
+
@@ -0,0 +1,222 @@
1
+ # Coffeebox (for jQuery) version: 0.1
2
+ # @requires jQuery v1.2 or later
3
+ # @homepage https://github.com/rs-pro/coffeebox
4
+ #
5
+ # Licensed under the MIT:
6
+ # http://www.opensource.org/licenses/mit-license.php
7
+ #
8
+ # Copyright (c) 2013 RocketScience.pro
9
+ #
10
+ # Based on coffeebox: https://github.com/defunkt/coffeebox
11
+ # Copyright Forever Chris Wanstrath, Kyle Neath
12
+
13
+ $.fn.stopSpinner = ->
14
+ $(this).each ->
15
+ $t = $(this)
16
+ spinner = $t.data('spinner')
17
+ if spinner
18
+ spinner.stop()
19
+ $t.removeData('spinner')
20
+
21
+ $.coffeebox = (data, klass) ->
22
+ if data.ajax
23
+ $.coffeebox.loading data.settings or []
24
+ fillcoffeeboxFromAjax data.ajax, klass
25
+ else if data.image
26
+ $.coffeebox.loading data.settings or []
27
+ fillcoffeeboxFromImage data.image, klass
28
+ else if data.div
29
+ fillcoffeeboxFromHref data.div, klass
30
+ else if $.isFunction(data)
31
+ data.call $
32
+ else
33
+ $.coffeebox.reveal data, klass
34
+
35
+ # Public, $.coffeebox methods
36
+ $.extend $.coffeebox,
37
+ spinner:
38
+ lines: 11 # The number of lines to draw
39
+ length: 13 # The length of each line
40
+ width: 4 # The line thickness
41
+ radius: 13 # The radius of the inner circle
42
+ corners: 1 # Corner roundness (0..1)
43
+ color: "#000" # #rgb or #rrggbb or array of colors
44
+ speed: 1 # Rounds per second
45
+ trail: 89 # Afterglow percentage
46
+ hwaccel: true # Whether to use hardware acceleration
47
+ className: "spinner" # The CSS class to assign to the spinner
48
+
49
+ settings:
50
+ overlay: true
51
+ imageTypes: ["png", "jpg", "jpeg", "gif"]
52
+ html: """
53
+ <div id="coffeebox" style="display:none;">
54
+ <div class="popup">
55
+ <div class="content"></div>
56
+ <a class="close">&times;</a>
57
+ </div>
58
+ </div>
59
+ """
60
+
61
+ loading: ->
62
+ init()
63
+ return true if $("#coffeebox .loading").length is 1
64
+ showOverlay()
65
+ $("#coffeebox .content").empty().append "<div class='loading'></div>"
66
+ $(document).bind "keydown.coffeebox", (e) ->
67
+ $.coffeebox.close() if e.keyCode is 27
68
+ true
69
+ $(document).trigger "loading.coffeebox"
70
+ $.coffeebox.align()
71
+ setTimeout ->
72
+ new Spinner($.coffeebox.spinner).spin($('#coffeebox .loading')[0])
73
+ , 0
74
+ $('#coffeebox')
75
+
76
+ align: ->
77
+ $("#coffeebox").show().css
78
+ top: getPageScroll()[1] + (getPageHeight() / 10)
79
+ left: $(window).width() / 2 - ($("#coffeebox .popup").outerWidth() / 2)
80
+
81
+ reveal: (data, klass) ->
82
+ if $("#coffebox .loading").length
83
+ $("#coffebox .loading").stopSpinner()
84
+ init()
85
+ $(document).trigger "beforeReveal.coffeebox"
86
+ $("#coffeebox .content").addClass klass if klass
87
+ $("#coffeebox .content").empty().append data
88
+ $("#coffeebox .popup").children().fadeIn "normal"
89
+ $(document).trigger("reveal.coffeebox").trigger "afterReveal.coffeebox"
90
+ $.coffeebox.align()
91
+ close: ->
92
+ $(document).trigger "close.coffeebox"
93
+ false
94
+
95
+ # Public, $.fn methods
96
+ $.fn.coffeebox = (settings) ->
97
+ clickHandler = ->
98
+ $.coffeebox.loading()
99
+
100
+ # support for rel="coffeebox.inline_popup" syntax, to add a class
101
+ # also supports deprecated "coffeebox[.inline_popup]" syntax
102
+ klass = @rel.match(/coffeebox\[?\.(\w+)\]?/)
103
+ klass = klass[1] if klass
104
+ fillcoffeeboxFromHref @href, klass
105
+ false
106
+ return init(settings) if $(this).length is 0
107
+ @bind "click.coffeebox", clickHandler
108
+
109
+ # Private methods
110
+
111
+ # called one time to setup coffeebox on this page
112
+ init = (settings) ->
113
+ if $('#coffeebox').length > 0
114
+ return true
115
+ $(document).trigger "init.coffeebox"
116
+ imageTypes = $.coffeebox.settings.imageTypes.join("|")
117
+ $.coffeebox.settings.imageTypesRegexp = new RegExp("\\.(" + imageTypes + ")(\\?.*)?$", "i")
118
+ $.extend $.coffeebox.settings, settings if settings
119
+ $("body").append $.coffeebox.settings.html
120
+ $("#coffeebox .close").click($.coffeebox.close)
121
+
122
+ # getPageScroll() by quirksmode.com
123
+ getPageScroll = ->
124
+ xScroll = undefined
125
+ yScroll = undefined
126
+ if self.pageYOffset
127
+ yScroll = self.pageYOffset
128
+ xScroll = self.pageXOffset
129
+ else if document.documentElement and document.documentElement.scrollTop # Explorer 6 Strict
130
+ yScroll = document.documentElement.scrollTop
131
+ xScroll = document.documentElement.scrollLeft
132
+ else if document.body # all other Explorers
133
+ yScroll = document.body.scrollTop
134
+ xScroll = document.body.scrollLeft
135
+ new Array(xScroll, yScroll)
136
+
137
+ # Adapted from getPageSize() by quirksmode.com
138
+ getPageHeight = ->
139
+ windowHeight = undefined
140
+ if self.innerHeight # all except Explorer
141
+ windowHeight = self.innerHeight
142
+ else if document.documentElement and document.documentElement.clientHeight # Explorer 6 Strict Mode
143
+ windowHeight = document.documentElement.clientHeight
144
+ # other Explorers
145
+ else windowHeight = document.body.clientHeight if document.body
146
+ windowHeight
147
+
148
+ # Figures out what you want to display and displays it
149
+ # formats are:
150
+ # div: #id
151
+ # image: blah.extension
152
+ # ajax: anything else
153
+ fillcoffeeboxFromHref = (href, klass) ->
154
+ # div
155
+ if href.match(/#/)
156
+ url = window.location.href.split("#")[0]
157
+ target = href.replace(url, "")
158
+ $.coffeebox.reveal $(target).html(), klass if target is "#"
159
+
160
+ # image
161
+ else if href.match($.coffeebox.settings.imageTypesRegexp)
162
+ fillcoffeeboxFromImage href, klass
163
+
164
+ # ajax
165
+ else
166
+ fillcoffeeboxFromAjax href, klass
167
+
168
+ fillcoffeeboxFromImage = (href, klass) ->
169
+ $.imgpreload href, (images)->
170
+ $.coffeebox.reveal "<div class='image'><img src='#{@[0].src}' /></div>", klass
171
+
172
+ fillcoffeeboxFromAjax = (href, klass) ->
173
+ $.coffeebox.jqxhr = $.get(href, (data) ->
174
+ $.coffeebox.reveal data, klass
175
+ )
176
+
177
+ skipOverlay = ->
178
+ $.coffeebox.settings.overlay is false
179
+
180
+ hideOverlay = ->
181
+ if skipOverlay()
182
+ false
183
+ else
184
+ $("#coffeebox_overlay").addClass('hide')
185
+ setTimeout ->
186
+ $("#coffeebox_overlay.hide").remove()
187
+ , 300
188
+
189
+ showOverlay = ->
190
+ if skipOverlay()
191
+ false
192
+ else
193
+ if $("#coffeebox_overlay").length is 0
194
+ $("body").append '<div id="coffeebox_overlay" class="hide"></div>'
195
+ $("#coffeebox_overlay").click(->
196
+ $(document).trigger "close.coffeebox"
197
+ )
198
+ setTimeout ->
199
+ $("#coffeebox_overlay").removeClass('hide')
200
+ , 10
201
+ else if $("#coffeebox_overlay").hasClass('hide')
202
+ $("#coffeebox_overlay").removeClass('hide')
203
+
204
+ # Bindings
205
+ $(document).bind "close.coffeebox", ->
206
+ if $.coffeebox.jqxhr
207
+ $.coffeebox.jqxhr.abort()
208
+ $.coffeebox.jqxhr = null
209
+
210
+ $(document).unbind "keydown.coffeebox"
211
+ $('#coffeebox').fadeOut ->
212
+ if $("#coffebox .loading").length
213
+ $("#coffebox .loading").stopSpinner()
214
+ $('#coffeebox').remove()
215
+ $(document).trigger "afterClose.coffeebox"
216
+
217
+ hideOverlay()
218
+
219
+ # shorter alias
220
+ $.cbox = $.coffebox
221
+ $.fn.cbox = $.fn.coffebox
222
+
@@ -0,0 +1,355 @@
1
+ //fgnass.github.com/spin.js#v1.3.2
2
+
3
+ /**
4
+ * Copyright (c) 2011-2013 Felix Gnass
5
+ * Licensed under the MIT license
6
+ */
7
+ (function(root, factory) {
8
+
9
+ /* CommonJS */
10
+ if (typeof exports == 'object') module.exports = factory()
11
+
12
+ /* AMD module */
13
+ else if (typeof define == 'function' && define.amd) define(factory)
14
+
15
+ /* Browser global */
16
+ else root.Spinner = factory()
17
+ }
18
+ (this, function() {
19
+ "use strict";
20
+
21
+ var prefixes = ['webkit', 'Moz', 'ms', 'O'] /* Vendor prefixes */
22
+ , animations = {} /* Animation rules keyed by their name */
23
+ , useCssAnimations /* Whether to use CSS animations or setTimeout */
24
+
25
+ /**
26
+ * Utility function to create elements. If no tag name is given,
27
+ * a DIV is created. Optionally properties can be passed.
28
+ */
29
+ function createEl(tag, prop) {
30
+ var el = document.createElement(tag || 'div')
31
+ , n
32
+
33
+ for(n in prop) el[n] = prop[n]
34
+ return el
35
+ }
36
+
37
+ /**
38
+ * Appends children and returns the parent.
39
+ */
40
+ function ins(parent /* child1, child2, ...*/) {
41
+ for (var i=1, n=arguments.length; i<n; i++)
42
+ parent.appendChild(arguments[i])
43
+
44
+ return parent
45
+ }
46
+
47
+ /**
48
+ * Insert a new stylesheet to hold the @keyframe or VML rules.
49
+ */
50
+ var sheet = (function() {
51
+ var el = createEl('style', {type : 'text/css'})
52
+ ins(document.getElementsByTagName('head')[0], el)
53
+ return el.sheet || el.styleSheet
54
+ }())
55
+
56
+ /**
57
+ * Creates an opacity keyframe animation rule and returns its name.
58
+ * Since most mobile Webkits have timing issues with animation-delay,
59
+ * we create separate rules for each line/segment.
60
+ */
61
+ function addAnimation(alpha, trail, i, lines) {
62
+ var name = ['opacity', trail, ~~(alpha*100), i, lines].join('-')
63
+ , start = 0.01 + i/lines * 100
64
+ , z = Math.max(1 - (1-alpha) / trail * (100-start), alpha)
65
+ , prefix = useCssAnimations.substring(0, useCssAnimations.indexOf('Animation')).toLowerCase()
66
+ , pre = prefix && '-' + prefix + '-' || ''
67
+
68
+ if (!animations[name]) {
69
+ sheet.insertRule(
70
+ '@' + pre + 'keyframes ' + name + '{' +
71
+ '0%{opacity:' + z + '}' +
72
+ start + '%{opacity:' + alpha + '}' +
73
+ (start+0.01) + '%{opacity:1}' +
74
+ (start+trail) % 100 + '%{opacity:' + alpha + '}' +
75
+ '100%{opacity:' + z + '}' +
76
+ '}', sheet.cssRules.length)
77
+
78
+ animations[name] = 1
79
+ }
80
+
81
+ return name
82
+ }
83
+
84
+ /**
85
+ * Tries various vendor prefixes and returns the first supported property.
86
+ */
87
+ function vendor(el, prop) {
88
+ var s = el.style
89
+ , pp
90
+ , i
91
+
92
+ prop = prop.charAt(0).toUpperCase() + prop.slice(1)
93
+ for(i=0; i<prefixes.length; i++) {
94
+ pp = prefixes[i]+prop
95
+ if(s[pp] !== undefined) return pp
96
+ }
97
+ if(s[prop] !== undefined) return prop
98
+ }
99
+
100
+ /**
101
+ * Sets multiple style properties at once.
102
+ */
103
+ function css(el, prop) {
104
+ for (var n in prop)
105
+ el.style[vendor(el, n)||n] = prop[n]
106
+
107
+ return el
108
+ }
109
+
110
+ /**
111
+ * Fills in default values.
112
+ */
113
+ function merge(obj) {
114
+ for (var i=1; i < arguments.length; i++) {
115
+ var def = arguments[i]
116
+ for (var n in def)
117
+ if (obj[n] === undefined) obj[n] = def[n]
118
+ }
119
+ return obj
120
+ }
121
+
122
+ /**
123
+ * Returns the absolute page-offset of the given element.
124
+ */
125
+ function pos(el) {
126
+ var o = { x:el.offsetLeft, y:el.offsetTop }
127
+ while((el = el.offsetParent))
128
+ o.x+=el.offsetLeft, o.y+=el.offsetTop
129
+
130
+ return o
131
+ }
132
+
133
+ /**
134
+ * Returns the line color from the given string or array.
135
+ */
136
+ function getColor(color, idx) {
137
+ return typeof color == 'string' ? color : color[idx % color.length]
138
+ }
139
+
140
+ // Built-in defaults
141
+
142
+ var defaults = {
143
+ lines: 12, // The number of lines to draw
144
+ length: 7, // The length of each line
145
+ width: 5, // The line thickness
146
+ radius: 10, // The radius of the inner circle
147
+ rotate: 0, // Rotation offset
148
+ corners: 1, // Roundness (0..1)
149
+ color: '#000', // #rgb or #rrggbb
150
+ direction: 1, // 1: clockwise, -1: counterclockwise
151
+ speed: 1, // Rounds per second
152
+ trail: 100, // Afterglow percentage
153
+ opacity: 1/4, // Opacity of the lines
154
+ fps: 20, // Frames per second when using setTimeout()
155
+ zIndex: 2e9, // Use a high z-index by default
156
+ className: 'spinner', // CSS class to assign to the element
157
+ top: 'auto', // center vertically
158
+ left: 'auto', // center horizontally
159
+ position: 'relative' // element position
160
+ }
161
+
162
+ /** The constructor */
163
+ function Spinner(o) {
164
+ if (typeof this == 'undefined') return new Spinner(o)
165
+ this.opts = merge(o || {}, Spinner.defaults, defaults)
166
+ }
167
+
168
+ // Global defaults that override the built-ins:
169
+ Spinner.defaults = {}
170
+
171
+ merge(Spinner.prototype, {
172
+
173
+ /**
174
+ * Adds the spinner to the given target element. If this instance is already
175
+ * spinning, it is automatically removed from its previous target b calling
176
+ * stop() internally.
177
+ */
178
+ spin: function(target) {
179
+ this.stop()
180
+
181
+ var self = this
182
+ , o = self.opts
183
+ , el = self.el = css(createEl(0, {className: o.className}), {position: o.position, width: 0, zIndex: o.zIndex})
184
+ , mid = o.radius+o.length+o.width
185
+ , ep // element position
186
+ , tp // target position
187
+
188
+ if (target) {
189
+ target.insertBefore(el, target.firstChild||null)
190
+ tp = pos(target)
191
+ ep = pos(el)
192
+ css(el, {
193
+ left: (o.left == 'auto' ? tp.x-ep.x + (target.offsetWidth >> 1) : parseInt(o.left, 10) + mid) + 'px',
194
+ top: (o.top == 'auto' ? tp.y-ep.y + (target.offsetHeight >> 1) : parseInt(o.top, 10) + mid) + 'px'
195
+ })
196
+ }
197
+
198
+ el.setAttribute('role', 'progressbar')
199
+ self.lines(el, self.opts)
200
+
201
+ if (!useCssAnimations) {
202
+ // No CSS animation support, use setTimeout() instead
203
+ var i = 0
204
+ , start = (o.lines - 1) * (1 - o.direction) / 2
205
+ , alpha
206
+ , fps = o.fps
207
+ , f = fps/o.speed
208
+ , ostep = (1-o.opacity) / (f*o.trail / 100)
209
+ , astep = f/o.lines
210
+
211
+ ;(function anim() {
212
+ i++;
213
+ for (var j = 0; j < o.lines; j++) {
214
+ alpha = Math.max(1 - (i + (o.lines - j) * astep) % f * ostep, o.opacity)
215
+
216
+ self.opacity(el, j * o.direction + start, alpha, o)
217
+ }
218
+ self.timeout = self.el && setTimeout(anim, ~~(1000/fps))
219
+ })()
220
+ }
221
+ return self
222
+ },
223
+
224
+ /**
225
+ * Stops and removes the Spinner.
226
+ */
227
+ stop: function() {
228
+ var el = this.el
229
+ if (el) {
230
+ clearTimeout(this.timeout)
231
+ if (el.parentNode) el.parentNode.removeChild(el)
232
+ this.el = undefined
233
+ }
234
+ return this
235
+ },
236
+
237
+ /**
238
+ * Internal method that draws the individual lines. Will be overwritten
239
+ * in VML fallback mode below.
240
+ */
241
+ lines: function(el, o) {
242
+ var i = 0
243
+ , start = (o.lines - 1) * (1 - o.direction) / 2
244
+ , seg
245
+
246
+ function fill(color, shadow) {
247
+ return css(createEl(), {
248
+ position: 'absolute',
249
+ width: (o.length+o.width) + 'px',
250
+ height: o.width + 'px',
251
+ background: color,
252
+ boxShadow: shadow,
253
+ transformOrigin: 'left',
254
+ transform: 'rotate(' + ~~(360/o.lines*i+o.rotate) + 'deg) translate(' + o.radius+'px' +',0)',
255
+ borderRadius: (o.corners * o.width>>1) + 'px'
256
+ })
257
+ }
258
+
259
+ for (; i < o.lines; i++) {
260
+ seg = css(createEl(), {
261
+ position: 'absolute',
262
+ top: 1+~(o.width/2) + 'px',
263
+ transform: o.hwaccel ? 'translate3d(0,0,0)' : '',
264
+ opacity: o.opacity,
265
+ animation: useCssAnimations && addAnimation(o.opacity, o.trail, start + i * o.direction, o.lines) + ' ' + 1/o.speed + 's linear infinite'
266
+ })
267
+
268
+ if (o.shadow) ins(seg, css(fill('#000', '0 0 4px ' + '#000'), {top: 2+'px'}))
269
+ ins(el, ins(seg, fill(getColor(o.color, i), '0 0 1px rgba(0,0,0,.1)')))
270
+ }
271
+ return el
272
+ },
273
+
274
+ /**
275
+ * Internal method that adjusts the opacity of a single line.
276
+ * Will be overwritten in VML fallback mode below.
277
+ */
278
+ opacity: function(el, i, val) {
279
+ if (i < el.childNodes.length) el.childNodes[i].style.opacity = val
280
+ }
281
+
282
+ })
283
+
284
+
285
+ function initVML() {
286
+
287
+ /* Utility function to create a VML tag */
288
+ function vml(tag, attr) {
289
+ return createEl('<' + tag + ' xmlns="urn:schemas-microsoft.com:vml" class="spin-vml">', attr)
290
+ }
291
+
292
+ // No CSS transforms but VML support, add a CSS rule for VML elements:
293
+ sheet.addRule('.spin-vml', 'behavior:url(#default#VML)')
294
+
295
+ Spinner.prototype.lines = function(el, o) {
296
+ var r = o.length+o.width
297
+ , s = 2*r
298
+
299
+ function grp() {
300
+ return css(
301
+ vml('group', {
302
+ coordsize: s + ' ' + s,
303
+ coordorigin: -r + ' ' + -r
304
+ }),
305
+ { width: s, height: s }
306
+ )
307
+ }
308
+
309
+ var margin = -(o.width+o.length)*2 + 'px'
310
+ , g = css(grp(), {position: 'absolute', top: margin, left: margin})
311
+ , i
312
+
313
+ function seg(i, dx, filter) {
314
+ ins(g,
315
+ ins(css(grp(), {rotation: 360 / o.lines * i + 'deg', left: ~~dx}),
316
+ ins(css(vml('roundrect', {arcsize: o.corners}), {
317
+ width: r,
318
+ height: o.width,
319
+ left: o.radius,
320
+ top: -o.width>>1,
321
+ filter: filter
322
+ }),
323
+ vml('fill', {color: getColor(o.color, i), opacity: o.opacity}),
324
+ vml('stroke', {opacity: 0}) // transparent stroke to fix color bleeding upon opacity change
325
+ )
326
+ )
327
+ )
328
+ }
329
+
330
+ if (o.shadow)
331
+ for (i = 1; i <= o.lines; i++)
332
+ seg(i, -2, 'progid:DXImageTransform.Microsoft.Blur(pixelradius=2,makeshadow=1,shadowopacity=.3)')
333
+
334
+ for (i = 1; i <= o.lines; i++) seg(i)
335
+ return ins(el, g)
336
+ }
337
+
338
+ Spinner.prototype.opacity = function(el, i, val, o) {
339
+ var c = el.firstChild
340
+ o = o.shadow && o.lines || 0
341
+ if (c && i+o < c.childNodes.length) {
342
+ c = c.childNodes[i+o]; c = c && c.firstChild; c = c && c.firstChild
343
+ if (c) c.opacity = val
344
+ }
345
+ }
346
+ }
347
+
348
+ var probe = css(createEl('group'), {behavior: 'url(#default#VML)'})
349
+
350
+ if (!vendor(probe, 'transform') && probe.adj) initVML()
351
+ else useCssAnimations = vendor(probe, 'animation')
352
+
353
+ return Spinner
354
+
355
+ }));
@@ -0,0 +1,67 @@
1
+ $coffeebox-background: #fff !default
2
+ $coffeebox-close-color: #000 !default
3
+ $coffeebox-close-hover: #333 !default
4
+ $coffeebox-close-size: 25px !default
5
+
6
+ $coffeebox-border: 3px solid rgba(0, 0, 0, 0) !default
7
+ $coffeebox-border-radius: 25px !default
8
+
9
+ #coffeebox
10
+ position: absolute
11
+ top: 0
12
+ left: 0
13
+ z-index: 100
14
+ text-align: left
15
+ .loading
16
+ width: 400px
17
+ height: 200px
18
+ position: relative
19
+ .popup
20
+ position: relative
21
+ border: $coffeebox-border
22
+ border-radius: $coffeebox-border-radius
23
+ box-shadow: 0 0 18px rgba(0, 0, 0, 0.4)
24
+ .content
25
+ display: table
26
+ padding: 10px
27
+ background: $coffeebox-backgound
28
+ border-radius: $coffeebox-border-radius
29
+ min-width: 100px
30
+ min-height: 40px
31
+ > p
32
+ &:first-child
33
+ margin-top: 0
34
+ &:last-child
35
+ margin-bottom: 0
36
+ .close
37
+ cursor: pointer
38
+ position: absolute
39
+ top: 5px
40
+ right: 5px
41
+ padding: 2px
42
+ background: $coffeebox-background
43
+ font:
44
+ size: $coffeebox-close-size
45
+ weight: bold
46
+ text-decoration: none
47
+ color: $coffeebox-close-color
48
+ &:hover
49
+ color: $coffeebox-close-hover
50
+ .image
51
+ text-align: center
52
+ img
53
+ border: 0
54
+ margin: 0
55
+
56
+ #coffeebox_overlay
57
+ position: fixed
58
+ top: 0px
59
+ left: 0px
60
+ height: 100%
61
+ width: 100%
62
+ transition: opacity 0.3s ease
63
+ background-color: #000
64
+ z-index: 99
65
+ opacity: 0.4
66
+ &.hide
67
+ opacity: 0
data/coffeebox.gemspec ADDED
@@ -0,0 +1,25 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'coffeebox/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "coffeebox"
8
+ spec.version = Coffeebox::VERSION
9
+ spec.authors = ["glebtv"]
10
+ spec.email = ["glebtv@gmail.com"]
11
+ spec.description = %q{An opinionated rewrite of Facebox in coffescript bundled as a rails gem}
12
+ spec.summary = %q{An opinionated rewrite of Facebox in coffescript bundled as a rails gem}
13
+ spec.homepage = "https://github.com/rs-pro/coffeebox"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_runtime_dependency "rails", ">= 3.2"
22
+
23
+ spec.add_development_dependency "bundler", "~> 1.3"
24
+ spec.add_development_dependency "rake"
25
+ end
data/lib/coffeebox.rb ADDED
@@ -0,0 +1,4 @@
1
+ p 'st'
2
+ require "coffeebox/version"
3
+ require 'coffeebox/engine'
4
+
@@ -0,0 +1,5 @@
1
+ p 'eng'
2
+ module Coffeebox
3
+ class Engine < ::Rails::Engine
4
+ end
5
+ end
@@ -0,0 +1,3 @@
1
+ module Coffeebox
2
+ VERSION = "0.0.3"
3
+ end
metadata ADDED
@@ -0,0 +1,100 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: coffeebox
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.3
5
+ platform: ruby
6
+ authors:
7
+ - glebtv
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-09-26 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rails
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '3.2'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '3.2'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: '1.3'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: '1.3'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description: An opinionated rewrite of Facebox in coffescript bundled as a rails gem
56
+ email:
57
+ - glebtv@gmail.com
58
+ executables: []
59
+ extensions: []
60
+ extra_rdoc_files: []
61
+ files:
62
+ - .gitignore
63
+ - Gemfile
64
+ - LICENSE.txt
65
+ - README.md
66
+ - Rakefile
67
+ - app/assets/javascripts/coffeebox.js.coffee
68
+ - app/assets/javascripts/coffeebox/imgpreload.js.coffee
69
+ - app/assets/javascripts/coffeebox/main.js.coffee
70
+ - app/assets/javascripts/coffeebox/spin.js
71
+ - app/assets/stylesheets/coffeebox.css.sass
72
+ - coffeebox.gemspec
73
+ - lib/coffeebox.rb
74
+ - lib/coffeebox/engine.rb
75
+ - lib/coffeebox/version.rb
76
+ homepage: https://github.com/rs-pro/coffeebox
77
+ licenses:
78
+ - MIT
79
+ metadata: {}
80
+ post_install_message:
81
+ rdoc_options: []
82
+ require_paths:
83
+ - lib
84
+ required_ruby_version: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - '>='
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ required_rubygems_version: !ruby/object:Gem::Requirement
90
+ requirements:
91
+ - - '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ requirements: []
95
+ rubyforge_project:
96
+ rubygems_version: 2.0.6
97
+ signing_key:
98
+ specification_version: 4
99
+ summary: An opinionated rewrite of Facebox in coffescript bundled as a rails gem
100
+ test_files: []