fastclick-rails 0.0.1 → 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +5 -0
- data/lib/fastclick-rails.rb +1 -1
- data/vendor/assets/javascripts/fastclick.js +133 -57
- metadata +12 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 17091765f01fac79dab61f963deb4c7e7aed0fca
|
4
|
+
data.tar.gz: f7656097771fb9844616a7c55f1b9960555d2216
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bd0db7a3cd1904e9ec91d98b071c46bcb14680d1447f216a476e94034ae2dae3c89523adbace479e219487d957e2b10b94b0834f95aee5b41c21dd4f7727ea2e
|
7
|
+
data.tar.gz: b0365be1495fb26c45240e3b56501fe58991b76c68254211e0cedfd4b5c6c219843b7966ea0ef5b85945969d767b89ddad987ab6e6f67e2768f53ebd4bc3b759
|
data/README.md
CHANGED
data/lib/fastclick-rails.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
/**
|
2
2
|
* @preserve FastClick: polyfill to remove click delays on browsers with touch UIs.
|
3
3
|
*
|
4
|
-
* @version 0.
|
4
|
+
* @version 1.0.1
|
5
5
|
* @codingstandard ftlabs-jsv2
|
6
6
|
* @copyright The Financial Times Limited [All Rights Reserved]
|
7
7
|
* @license MIT License (see LICENSE.txt)
|
@@ -16,11 +16,13 @@
|
|
16
16
|
*
|
17
17
|
* @constructor
|
18
18
|
* @param {Element} layer The layer to listen on
|
19
|
+
* @param {Object} options The options to override the defaults
|
19
20
|
*/
|
20
|
-
function FastClick(layer) {
|
21
|
+
function FastClick(layer, options) {
|
21
22
|
'use strict';
|
22
|
-
var oldOnClick
|
23
|
+
var oldOnClick;
|
23
24
|
|
25
|
+
options = options || {};
|
24
26
|
|
25
27
|
/**
|
26
28
|
* Whether a click is currently being tracked.
|
@@ -31,7 +33,7 @@ function FastClick(layer) {
|
|
31
33
|
|
32
34
|
|
33
35
|
/**
|
34
|
-
* Timestamp for when
|
36
|
+
* Timestamp for when click tracking started.
|
35
37
|
*
|
36
38
|
* @type number
|
37
39
|
*/
|
@@ -70,6 +72,14 @@ function FastClick(layer) {
|
|
70
72
|
this.lastTouchIdentifier = 0;
|
71
73
|
|
72
74
|
|
75
|
+
/**
|
76
|
+
* Touchmove boundary, beyond which a click will be cancelled.
|
77
|
+
*
|
78
|
+
* @type number
|
79
|
+
*/
|
80
|
+
this.touchBoundary = options.touchBoundary || 10;
|
81
|
+
|
82
|
+
|
73
83
|
/**
|
74
84
|
* The FastClick layer.
|
75
85
|
*
|
@@ -77,31 +87,31 @@ function FastClick(layer) {
|
|
77
87
|
*/
|
78
88
|
this.layer = layer;
|
79
89
|
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
this.
|
86
|
-
|
87
|
-
/** @type function() */
|
88
|
-
this.onMouse = function() { return FastClick.prototype.onMouse.apply(self, arguments); };
|
90
|
+
/**
|
91
|
+
* The minimum time between tap(touchstart and touchend) events
|
92
|
+
*
|
93
|
+
* @type number
|
94
|
+
*/
|
95
|
+
this.tapDelay = options.tapDelay || 200;
|
89
96
|
|
90
|
-
|
91
|
-
|
97
|
+
if (FastClick.notNeeded(layer)) {
|
98
|
+
return;
|
99
|
+
}
|
92
100
|
|
93
|
-
|
94
|
-
|
101
|
+
// Some old versions of Android don't have Function.prototype.bind
|
102
|
+
function bind(method, context) {
|
103
|
+
return function() { return method.apply(context, arguments); };
|
104
|
+
}
|
95
105
|
|
96
|
-
/** @type function() */
|
97
|
-
this.onTouchCancel = function() { return FastClick.prototype.onTouchCancel.apply(self, arguments); };
|
98
106
|
|
99
|
-
|
100
|
-
|
107
|
+
var methods = ['onMouse', 'onClick', 'onTouchStart', 'onTouchMove', 'onTouchEnd', 'onTouchCancel'];
|
108
|
+
var context = this;
|
109
|
+
for (var i = 0, l = methods.length; i < l; i++) {
|
110
|
+
context[methods[i]] = bind(context[methods[i]], context);
|
101
111
|
}
|
102
112
|
|
103
113
|
// Set up event handlers as required
|
104
|
-
if (
|
114
|
+
if (deviceIsAndroid) {
|
105
115
|
layer.addEventListener('mouseover', this.onMouse, true);
|
106
116
|
layer.addEventListener('mousedown', this.onMouse, true);
|
107
117
|
layer.addEventListener('mouseup', this.onMouse, true);
|
@@ -109,6 +119,7 @@ function FastClick(layer) {
|
|
109
119
|
|
110
120
|
layer.addEventListener('click', this.onClick, true);
|
111
121
|
layer.addEventListener('touchstart', this.onTouchStart, false);
|
122
|
+
layer.addEventListener('touchmove', this.onTouchMove, false);
|
112
123
|
layer.addEventListener('touchend', this.onTouchEnd, false);
|
113
124
|
layer.addEventListener('touchcancel', this.onTouchCancel, false);
|
114
125
|
|
@@ -160,7 +171,7 @@ function FastClick(layer) {
|
|
160
171
|
*
|
161
172
|
* @type boolean
|
162
173
|
*/
|
163
|
-
|
174
|
+
var deviceIsAndroid = navigator.userAgent.indexOf('Android') > 0;
|
164
175
|
|
165
176
|
|
166
177
|
/**
|
@@ -168,7 +179,7 @@ FastClick.prototype.deviceIsAndroid = navigator.userAgent.indexOf('Android') > 0
|
|
168
179
|
*
|
169
180
|
* @type boolean
|
170
181
|
*/
|
171
|
-
|
182
|
+
var deviceIsIOS = /iP(ad|hone|od)/.test(navigator.userAgent);
|
172
183
|
|
173
184
|
|
174
185
|
/**
|
@@ -176,7 +187,7 @@ FastClick.prototype.deviceIsIOS = /iP(ad|hone|od)/.test(navigator.userAgent);
|
|
176
187
|
*
|
177
188
|
* @type boolean
|
178
189
|
*/
|
179
|
-
|
190
|
+
var deviceIsIOS4 = deviceIsIOS && (/OS 4_\d(_\d)?/).test(navigator.userAgent);
|
180
191
|
|
181
192
|
|
182
193
|
/**
|
@@ -184,7 +195,7 @@ FastClick.prototype.deviceIsIOS4 = FastClick.prototype.deviceIsIOS && (/OS 4_\d(
|
|
184
195
|
*
|
185
196
|
* @type boolean
|
186
197
|
*/
|
187
|
-
|
198
|
+
var deviceIsIOSWithBadTarget = deviceIsIOS && (/OS ([6-9]|\d{2})_\d/).test(navigator.userAgent);
|
188
199
|
|
189
200
|
|
190
201
|
/**
|
@@ -209,7 +220,7 @@ FastClick.prototype.needsClick = function(target) {
|
|
209
220
|
case 'input':
|
210
221
|
|
211
222
|
// File inputs need real clicks on iOS 6 due to a browser bug (issue #68)
|
212
|
-
if ((
|
223
|
+
if ((deviceIsIOS && target.type === 'file') || target.disabled) {
|
213
224
|
return true;
|
214
225
|
}
|
215
226
|
|
@@ -233,8 +244,9 @@ FastClick.prototype.needsFocus = function(target) {
|
|
233
244
|
'use strict';
|
234
245
|
switch (target.nodeName.toLowerCase()) {
|
235
246
|
case 'textarea':
|
236
|
-
case 'select':
|
237
247
|
return true;
|
248
|
+
case 'select':
|
249
|
+
return !deviceIsAndroid;
|
238
250
|
case 'input':
|
239
251
|
switch (target.type) {
|
240
252
|
case 'button':
|
@@ -273,11 +285,22 @@ FastClick.prototype.sendClick = function(targetElement, event) {
|
|
273
285
|
|
274
286
|
// Synthesise a click event, with an extra attribute so it can be tracked
|
275
287
|
clickEvent = document.createEvent('MouseEvents');
|
276
|
-
clickEvent.initMouseEvent(
|
288
|
+
clickEvent.initMouseEvent(this.determineEventType(targetElement), true, true, window, 1, touch.screenX, touch.screenY, touch.clientX, touch.clientY, false, false, false, false, 0, null);
|
277
289
|
clickEvent.forwardedTouchEvent = true;
|
278
290
|
targetElement.dispatchEvent(clickEvent);
|
279
291
|
};
|
280
292
|
|
293
|
+
FastClick.prototype.determineEventType = function(targetElement) {
|
294
|
+
'use strict';
|
295
|
+
|
296
|
+
//Issue #159: Android Chrome Select Box does not open with a synthetic click event
|
297
|
+
if (deviceIsAndroid && targetElement.tagName.toLowerCase() === 'select') {
|
298
|
+
return 'mousedown';
|
299
|
+
}
|
300
|
+
|
301
|
+
return 'click';
|
302
|
+
};
|
303
|
+
|
281
304
|
|
282
305
|
/**
|
283
306
|
* @param {EventTarget|Element} targetElement
|
@@ -286,7 +309,8 @@ FastClick.prototype.focus = function(targetElement) {
|
|
286
309
|
'use strict';
|
287
310
|
var length;
|
288
311
|
|
289
|
-
|
312
|
+
// Issue #160: on iOS 7, some input elements (e.g. date datetime) throw a vague TypeError on setSelectionRange. These elements don't have an integer value for the selectionStart and selectionEnd properties, but unfortunately that can't be used for detection because accessing the properties also throws a TypeError. Just check the type instead. Filed as Apple bug #15122724.
|
313
|
+
if (deviceIsIOS && targetElement.setSelectionRange && targetElement.type.indexOf('date') !== 0 && targetElement.type !== 'time') {
|
290
314
|
length = targetElement.value.length;
|
291
315
|
targetElement.setSelectionRange(length, length);
|
292
316
|
} else {
|
@@ -354,10 +378,15 @@ FastClick.prototype.onTouchStart = function(event) {
|
|
354
378
|
'use strict';
|
355
379
|
var targetElement, touch, selection;
|
356
380
|
|
381
|
+
// Ignore multiple touches, otherwise pinch-to-zoom is prevented if both fingers are on the FastClick element (issue #111).
|
382
|
+
if (event.targetTouches.length > 1) {
|
383
|
+
return true;
|
384
|
+
}
|
385
|
+
|
357
386
|
targetElement = this.getTargetElementFromEventTarget(event.target);
|
358
387
|
touch = event.targetTouches[0];
|
359
388
|
|
360
|
-
if (
|
389
|
+
if (deviceIsIOS) {
|
361
390
|
|
362
391
|
// Only trusted events will deselect text on iOS (issue #49)
|
363
392
|
selection = window.getSelection();
|
@@ -365,7 +394,7 @@ FastClick.prototype.onTouchStart = function(event) {
|
|
365
394
|
return true;
|
366
395
|
}
|
367
396
|
|
368
|
-
if (!
|
397
|
+
if (!deviceIsIOS4) {
|
369
398
|
|
370
399
|
// Weird things happen on iOS when an alert or confirm dialog is opened from a click event callback (issue #23):
|
371
400
|
// when the user next taps anywhere else on the page, new touchstart and touchend events are dispatched
|
@@ -397,7 +426,7 @@ FastClick.prototype.onTouchStart = function(event) {
|
|
397
426
|
this.touchStartY = touch.pageY;
|
398
427
|
|
399
428
|
// Prevent phantom clicks on fast double-tap (issue #36)
|
400
|
-
if ((event.timeStamp - this.lastClickTime) <
|
429
|
+
if ((event.timeStamp - this.lastClickTime) < this.tapDelay) {
|
401
430
|
event.preventDefault();
|
402
431
|
}
|
403
432
|
|
@@ -413,9 +442,9 @@ FastClick.prototype.onTouchStart = function(event) {
|
|
413
442
|
*/
|
414
443
|
FastClick.prototype.touchHasMoved = function(event) {
|
415
444
|
'use strict';
|
416
|
-
var touch = event.changedTouches[0];
|
445
|
+
var touch = event.changedTouches[0], boundary = this.touchBoundary;
|
417
446
|
|
418
|
-
if (Math.abs(touch.pageX - this.touchStartX) >
|
447
|
+
if (Math.abs(touch.pageX - this.touchStartX) > boundary || Math.abs(touch.pageY - this.touchStartY) > boundary) {
|
419
448
|
return true;
|
420
449
|
}
|
421
450
|
|
@@ -423,6 +452,28 @@ FastClick.prototype.touchHasMoved = function(event) {
|
|
423
452
|
};
|
424
453
|
|
425
454
|
|
455
|
+
/**
|
456
|
+
* Update the last position.
|
457
|
+
*
|
458
|
+
* @param {Event} event
|
459
|
+
* @returns {boolean}
|
460
|
+
*/
|
461
|
+
FastClick.prototype.onTouchMove = function(event) {
|
462
|
+
'use strict';
|
463
|
+
if (!this.trackingClick) {
|
464
|
+
return true;
|
465
|
+
}
|
466
|
+
|
467
|
+
// If the touch has moved, cancel the click tracking
|
468
|
+
if (this.targetElement !== this.getTargetElementFromEventTarget(event.target) || this.touchHasMoved(event)) {
|
469
|
+
this.trackingClick = false;
|
470
|
+
this.targetElement = null;
|
471
|
+
}
|
472
|
+
|
473
|
+
return true;
|
474
|
+
};
|
475
|
+
|
476
|
+
|
426
477
|
/**
|
427
478
|
* Attempt to find the labelled control for the given label element.
|
428
479
|
*
|
@@ -458,22 +509,19 @@ FastClick.prototype.onTouchEnd = function(event) {
|
|
458
509
|
'use strict';
|
459
510
|
var forElement, trackingClickStart, targetTagName, scrollParent, touch, targetElement = this.targetElement;
|
460
511
|
|
461
|
-
// If the touch has moved, cancel the click tracking
|
462
|
-
if (this.touchHasMoved(event)) {
|
463
|
-
this.trackingClick = false;
|
464
|
-
this.targetElement = null;
|
465
|
-
}
|
466
|
-
|
467
512
|
if (!this.trackingClick) {
|
468
513
|
return true;
|
469
514
|
}
|
470
515
|
|
471
516
|
// Prevent phantom clicks on fast double-tap (issue #36)
|
472
|
-
if ((event.timeStamp - this.lastClickTime) <
|
517
|
+
if ((event.timeStamp - this.lastClickTime) < this.tapDelay) {
|
473
518
|
this.cancelNextClick = true;
|
474
519
|
return true;
|
475
520
|
}
|
476
521
|
|
522
|
+
// Reset to prevent wrong click cancel on input (issue #156).
|
523
|
+
this.cancelNextClick = false;
|
524
|
+
|
477
525
|
this.lastClickTime = event.timeStamp;
|
478
526
|
|
479
527
|
trackingClickStart = this.trackingClickStart;
|
@@ -484,9 +532,12 @@ FastClick.prototype.onTouchEnd = function(event) {
|
|
484
532
|
// is performing a transition or scroll, and has to be re-detected manually. Note that
|
485
533
|
// for this to function correctly, it must be called *after* the event target is checked!
|
486
534
|
// See issue #57; also filed as rdar://13048589 .
|
487
|
-
if (
|
535
|
+
if (deviceIsIOSWithBadTarget) {
|
488
536
|
touch = event.changedTouches[0];
|
489
|
-
|
537
|
+
|
538
|
+
// In certain cases arguments of elementFromPoint can be negative, so prevent setting targetElement to null
|
539
|
+
targetElement = document.elementFromPoint(touch.pageX - window.pageXOffset, touch.pageY - window.pageYOffset) || targetElement;
|
540
|
+
targetElement.fastClickScrollParent = this.targetElement.fastClickScrollParent;
|
490
541
|
}
|
491
542
|
|
492
543
|
targetTagName = targetElement.tagName.toLowerCase();
|
@@ -494,7 +545,7 @@ FastClick.prototype.onTouchEnd = function(event) {
|
|
494
545
|
forElement = this.findControl(targetElement);
|
495
546
|
if (forElement) {
|
496
547
|
this.focus(targetElement);
|
497
|
-
if (
|
548
|
+
if (deviceIsAndroid) {
|
498
549
|
return false;
|
499
550
|
}
|
500
551
|
|
@@ -504,15 +555,17 @@ FastClick.prototype.onTouchEnd = function(event) {
|
|
504
555
|
|
505
556
|
// Case 1: If the touch started a while ago (best guess is 100ms based on tests for issue #36) then focus will be triggered anyway. Return early and unset the target element reference so that the subsequent click will be allowed through.
|
506
557
|
// Case 2: Without this exception for input elements tapped when the document is contained in an iframe, then any inputted text won't be visible even though the value attribute is updated as the user types (issue #37).
|
507
|
-
if ((event.timeStamp - trackingClickStart) > 100 || (
|
558
|
+
if ((event.timeStamp - trackingClickStart) > 100 || (deviceIsIOS && window.top !== window && targetTagName === 'input')) {
|
508
559
|
this.targetElement = null;
|
509
560
|
return false;
|
510
561
|
}
|
511
562
|
|
512
563
|
this.focus(targetElement);
|
564
|
+
this.sendClick(targetElement, event);
|
513
565
|
|
514
566
|
// Select elements need the event to go through on iOS 4, otherwise the selector menu won't open.
|
515
|
-
|
567
|
+
// Also this breaks opening selects when VoiceOver is active on iOS6, iOS7 (and possibly others)
|
568
|
+
if (!deviceIsIOS || targetTagName !== 'select') {
|
516
569
|
this.targetElement = null;
|
517
570
|
event.preventDefault();
|
518
571
|
}
|
@@ -520,7 +573,7 @@ FastClick.prototype.onTouchEnd = function(event) {
|
|
520
573
|
return false;
|
521
574
|
}
|
522
575
|
|
523
|
-
if (
|
576
|
+
if (deviceIsIOS && !deviceIsIOS4) {
|
524
577
|
|
525
578
|
// Don't send a synthetic click event if the target element is contained within a parent layer that was scrolled
|
526
579
|
// and this tap is being used to stop the scrolling (usually initiated by a fling - issue #42).
|
@@ -647,7 +700,7 @@ FastClick.prototype.destroy = function() {
|
|
647
700
|
'use strict';
|
648
701
|
var layer = this.layer;
|
649
702
|
|
650
|
-
if (
|
703
|
+
if (deviceIsAndroid) {
|
651
704
|
layer.removeEventListener('mouseover', this.onMouse, true);
|
652
705
|
layer.removeEventListener('mousedown', this.onMouse, true);
|
653
706
|
layer.removeEventListener('mouseup', this.onMouse, true);
|
@@ -655,27 +708,44 @@ FastClick.prototype.destroy = function() {
|
|
655
708
|
|
656
709
|
layer.removeEventListener('click', this.onClick, true);
|
657
710
|
layer.removeEventListener('touchstart', this.onTouchStart, false);
|
711
|
+
layer.removeEventListener('touchmove', this.onTouchMove, false);
|
658
712
|
layer.removeEventListener('touchend', this.onTouchEnd, false);
|
659
713
|
layer.removeEventListener('touchcancel', this.onTouchCancel, false);
|
660
714
|
};
|
661
715
|
|
662
716
|
|
663
|
-
|
717
|
+
/**
|
718
|
+
* Check whether FastClick is needed.
|
719
|
+
*
|
720
|
+
* @param {Element} layer The layer to listen on
|
721
|
+
*/
|
722
|
+
FastClick.notNeeded = function(layer) {
|
664
723
|
'use strict';
|
665
724
|
var metaViewport;
|
725
|
+
var chromeVersion;
|
666
726
|
|
667
727
|
// Devices that don't support touch don't need FastClick
|
668
728
|
if (typeof window.ontouchstart === 'undefined') {
|
669
729
|
return true;
|
670
730
|
}
|
671
731
|
|
672
|
-
|
732
|
+
// Chrome version - zero for other browsers
|
733
|
+
chromeVersion = +(/Chrome\/([0-9]+)/.exec(navigator.userAgent) || [,0])[1];
|
734
|
+
|
735
|
+
if (chromeVersion) {
|
673
736
|
|
674
|
-
|
675
|
-
if (FastClick.prototype.deviceIsAndroid) {
|
737
|
+
if (deviceIsAndroid) {
|
676
738
|
metaViewport = document.querySelector('meta[name=viewport]');
|
677
|
-
|
678
|
-
|
739
|
+
|
740
|
+
if (metaViewport) {
|
741
|
+
// Chrome on Android with user-scalable="no" doesn't need FastClick (issue #89)
|
742
|
+
if (metaViewport.content.indexOf('user-scalable=no') !== -1) {
|
743
|
+
return true;
|
744
|
+
}
|
745
|
+
// Chrome 32 and above with width=device-width or less don't need FastClick
|
746
|
+
if (chromeVersion > 31 && document.documentElement.scrollWidth <= window.outerWidth) {
|
747
|
+
return true;
|
748
|
+
}
|
679
749
|
}
|
680
750
|
|
681
751
|
// Chrome desktop doesn't need FastClick (issue #15)
|
@@ -684,6 +754,11 @@ FastClick.notNeeded = function() {
|
|
684
754
|
}
|
685
755
|
}
|
686
756
|
|
757
|
+
// IE10 with -ms-touch-action: none, which disables double-tap-to-zoom (issue #97)
|
758
|
+
if (layer.style.msTouchAction === 'none') {
|
759
|
+
return true;
|
760
|
+
}
|
761
|
+
|
687
762
|
return false;
|
688
763
|
};
|
689
764
|
|
@@ -692,10 +767,11 @@ FastClick.notNeeded = function() {
|
|
692
767
|
* Factory method for creating a FastClick object
|
693
768
|
*
|
694
769
|
* @param {Element} layer The layer to listen on
|
770
|
+
* @param {Object} options The options to override the defaults
|
695
771
|
*/
|
696
|
-
FastClick.attach = function(layer) {
|
772
|
+
FastClick.attach = function(layer, options) {
|
697
773
|
'use strict';
|
698
|
-
return new FastClick(layer);
|
774
|
+
return new FastClick(layer, options);
|
699
775
|
};
|
700
776
|
|
701
777
|
|
metadata
CHANGED
@@ -1,55 +1,55 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fastclick-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 1.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Masaki Komagata
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2014-04-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - ~>
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '1.3'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - ~>
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '1.3'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rails
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '0'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
description: gem for fastclick.js
|
@@ -59,7 +59,7 @@ executables: []
|
|
59
59
|
extensions: []
|
60
60
|
extra_rdoc_files: []
|
61
61
|
files:
|
62
|
-
- .gitignore
|
62
|
+
- ".gitignore"
|
63
63
|
- Gemfile
|
64
64
|
- LICENSE.txt
|
65
65
|
- README.md
|
@@ -77,19 +77,18 @@ require_paths:
|
|
77
77
|
- lib
|
78
78
|
required_ruby_version: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- -
|
80
|
+
- - ">="
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
83
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
84
84
|
requirements:
|
85
|
-
- -
|
85
|
+
- - ">="
|
86
86
|
- !ruby/object:Gem::Version
|
87
87
|
version: '0'
|
88
88
|
requirements: []
|
89
89
|
rubyforge_project:
|
90
|
-
rubygems_version: 2.
|
90
|
+
rubygems_version: 2.2.0
|
91
91
|
signing_key:
|
92
92
|
specification_version: 4
|
93
93
|
summary: gem for fastclick.js
|
94
94
|
test_files: []
|
95
|
-
has_rdoc:
|